1. 程式人生 > >[Luogu P3242] [BZOJ 4009] [HNOI2015]接水果

[Luogu P3242] [BZOJ 4009] [HNOI2015]接水果

洛谷傳送門

BZOJ傳送門

題目描述

風見幽香非常喜歡玩一個叫做 osu!的遊戲,其中她最喜歡玩的模式就是接水果。由於她已經DT FC 了The big black, 她覺得這個遊戲太簡單了,於是發明了一個更加難的版本。

首先有一個地圖,是一棵由 n n 個頂點、 n

1 n-1 條邊組成的樹(例如圖 1給出的樹包含 8 8 個頂點、 7 7
條邊)。

這顆樹上有 P P 個盤子,每個盤子實際上是一條路徑(例如圖 1 中頂點 6 到頂點 8 的路徑),並且每個盤子還有一個權值。第 i i 個盤子就是頂點 a

i a_i 到頂點 b i b_i 的路徑(由於是樹,所以從 a i a_i b i b_i 的路徑是唯一的),權值為 c i c_i

接下來依次會有 Q Q 個水果掉下來,每個水果本質上也是一條路徑,第 i i 個水果是從頂點 u i u_i 到頂點 v i v_i 的路徑。

幽香每次需要選擇一個盤子去接當前的水果:一個盤子能接住一個水果,當且僅當盤子的路徑是水果的路徑的子路徑(例如圖 1 1 中從 3 3 7 7 的路徑是從 1 1 8 8 的路徑的子路徑)。這裡規定:從 a a b b 的路徑與從 b b a a 的路徑是同一條路徑。

當然為了提高難度,對於第 i i 個水果,你需要選擇能接住它的所有盤子中,權值第 k i k_i 小的那個盤子,每個盤子可重複使用(沒有使用次數的上限:一個盤子接完一個水果後,後面還可繼續接其他水果,只要它是水果路徑的子路徑)。幽香認為這個遊戲很難,你能輕鬆解決給她看嗎?

輸入輸出格式

輸入格式:

第一行三個數 n n P P Q Q ,表示樹的大小和盤子的個數和水果的個數。 接下來 n 1 n-1 行,每行兩個數 a a b b ,表示樹上的 a a b b 之間有一條邊。樹中頂點按 1 1 n n 標號。 接下來 P P 行,每行三個數 a a b b c c ,表示路徑為 a a b b 、權值為 c c 的盤子,其中 0 c 1 0 9 0\le c\le 10^9 a a 不等於 b b 。 接下來 Q Q 行,每行三個數 u u v v k k ,表示路徑為 u u v v 的水果,其中 u u 不等於 v v ,你需要選擇第 k k 小的盤子,第 k k 小一定存在。

輸出格式:

對於每個果子,輸出一行表示選擇的盤子的權值。

輸入輸出樣例

輸入樣例#1:

10 10 10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
3 2 217394434
10 7 13022269
6 7 283254485
6 8 333042360
4 6 442139372
8 3 225045590
10 4 922205209
10 8 808296330
9 2 486331361
4 9 551176338
1 8 5
3 8 3
3 8 4
1 8 3
4 8 1
2 3 1
2 3 1
2 3 1
2 4 1
1 4 1

輸出樣例#1:

442139372 
333042360 
442139372 
283254485 
283254485 
217394434 
217394434 
217394434 
217394434 
217394434

說明

N , P , Q 40000 N,P,Q\le 40000

解題分析

又是一道類似區間 K K 大的問題, 還可以離線, 考慮整體二分。

那麼關鍵的問題在如何判斷一個水果是否能被盤子接住, 這樣我們就可以在二分的時候計算出有幾個盤子接到了同一個水果, 進而得出答案。

那麼對於一個盤子, 我們分情況考慮:

  • 兩個端點為父子關係:(例如圖中1、 3)

那麼顯然水果的一端應該在 3 3 的子樹內, 一端在 2 2 的子樹外, 那麼就可以通過DFS的入棧出棧序分為兩段: [ 1 , i n [ 2 ] ] [1,in[2]]和 [ o u t [ 2 ] + 1 , n ] [out[2]+1,n]

  • 兩個端點不為父子關係: (例如圖中2、 4)

那麼顯然水果的一端應該在 2 2 的子樹內, 另一端在 4 4 的子樹內, 也可以分別對應到一段區間上。

這樣我們把每個盤子對應的水果的 D F S DFS 序兩端的可行區間可以轉化為一個或兩個矩形, 然後把水果視為一個點, 每次查詢覆蓋點的矩形有多少個。 這個可以用掃描線很方便地完成。

為了統一統計方式, 可以把 D F S DFS 序較小的那段區間設為 x x 軸上的一段, D F S DFS 序較大的一段設為 y y 座標區間。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define R register
#define IN inline
#define W while
#define lbt(i) ((i) & (-(i)))
#define MX 40500
IN char gc()
{
    static const int buflen = 1e6;
    static char buf[buflen], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, buflen, stdin), p1 == p2) ? EOF : *p1++;
}
template <class T>
IN void in(T &x)
{
    x = 0; R char c = gc();
    for (; !isdigit(c); c = gc());
    for (;  isdigit(c); c = gc())
    x = (x << 1) + (x << 3) + c - 48;
}
int n, p, f, cnt, ct, dif, tot;
template <class T> IN T max(T a, T b) {return a > b ? a : b;}
template <class T> IN T min(T a, T b) {return a < b ? a : b;}
int lb[MX], rb[MX], head[MX], fat[MX][17], dep[MX], buf[MX], id[MX], ans[MX], tree[MX << 2];
struct Edge {int to, nex;} edge[MX << 1];
struct Plate {int a, b, val;} plt[MX];
struct Fruit {int a, b, kth;} frt[MX];
struct INFO {int typ, x, y[2], id, val;} line[MX << 3], buf1[MX << 3], buf2[MX << 3]; // 0 for modify, 1 for query

IN bool operator < (const INFO &x, const INFO &y) {return x.x == y.x ? x.typ < y.typ : x.x < y.x;}
IN void add(R int from, R int to) {edge[++cnt] = {to, head[from]}, head[from] = cnt;}
void DFS(R int now)
{
    lb[now] = ++ct;
    for (R int i = 1; i <= 16; ++i)
    {
        fat[now][i] = fat[fat[now][i - 1]][i - 1];
        if (!fat[now][i]) break;
    }
    for (R int i = head[now]; i; i = edge[i].nex)
    {
        
            
           

相關推薦

[Luogu P3242] [BZOJ 4009] [HNOI2015]水果

洛谷傳送門 BZOJ傳送門 題目描述 風見幽香非常喜歡玩一個叫做 osu!的遊戲,其中她最喜歡玩的模式就是接水果。由於她已經DT FC 了The big black, 她覺得這個遊戲太簡單了,於是發明了一個更加難的版本。 首先有一個地圖,是一棵由

luogu P3242 [HNOI2015]水果

sin void sort efi 掃描線 wap tchar 二分 cpp 傳送門 其實這題難點在於處理路徑包含關系 先求出樹的dfn序,現在假設路徑\(xy\)包含\(uv(dfn_x<dfn_y,dfn_u<dfn_v)\) 如果\(lca(u,v)!=

●洛谷P3242 [HNOI2015]水果

problem tin 樹套樹 end owb gis div 平衡樹 bool 題鏈: https://www.luogu.org/problemnew/show/P3242 題解: 整體二分,掃描線+樹狀數組。 詳細的題解:http://blog.csdn.

洛谷 P3242 [HNOI2015]水果 解題報告

取消 區間 span 格式 type 有序 sum query 描述 P3242 [HNOI2015]接水果 題目描述 風見幽香非常喜歡玩一個叫做 \(osu!\) 的遊戲,其中她最喜歡玩的模式就是接水果。由於她已經\(DT\) \(FC\) 了\(\tt{The\ big

Luogu 3242 [HNOI2015]水果

nbsp 兩種 其中 向上 掃描線 一個 sin 技術分享 none BZOJ4009 權限題 真的不想再寫一遍了 大佬blog 假設有果實$(x, y)$,詢問$(a, b)$,用$st_i$表示$i$的$dfs$序,用$ed_i$表示所有$i$的子樹搜完的$dfs

P3242 [HNOI2015]水果

display aps alc targe sin 整體 space spa d+ 題面   將樹上的路徑包含問題通過dfs序轉換為雙關鍵字區間包含問題, 進而轉換為區間覆蓋類問題。   由此,我們可以通過二分得出每一個詢問的答案。   由於有多次詢問,故只需要整體

BZOJ4009 HNOI2015 水果

水果 lca 依次 ble ++ 選擇 ast 1=1 sta 4009: [Hnoi2015]接水果 Time Limit: 60 Sec Memory Limit: 512 MB Description 風見幽香非常喜歡玩一個叫做 osu!的遊戲,其

[Luogu3242][HNOI2015]水果

今天 mbo print lca ace 交換 最大 其中 pos Luogu 我今天做兩道整體二分結果全都是BZOJ權限題??? sol 我們抓住“盤子的路徑是水果的路徑的子路徑”這個條件。 考慮每一個盤子路徑\((u,v)\),討論它可以作為哪些水果路徑的子路徑。 如果

BZOJ4009 & 洛谷3242 & LOJ2113:[HNOI2015]水果——題解

getchar() .html black target str 解調 noi2015 != -- https://www.lydsy.com/JudgeOnline/problem.php?id=4009 https://www.luogu.org/problemnew

bzoj4009 [HNOI2015]水果

blank 分享圖片 int 覆蓋 pan http clu 掃描線 char link 題意: 題解: code: 1 #include<bits/stdc++.h> 2 #define rep(i,x,y) for (int i=(x);i&

[HNOI2015]水果

題面 題解 這道題要求關於第k大的東西,所以可以想到用主席樹或整體二分 我們可以發現,這道題主要的難點就是路徑之間的包含關係,那麼我們分情況討論: 1. LCA不是兩個端點 令這個盤子的兩個端點為\(a,b\) 如果被一個水果完全覆蓋, 那麼,這個水果的兩端分別在\(a,b\)的子樹中 設\(

[Luogu P3243] [BZOJ 4010] [HNOI2015]菜餚製作

洛谷傳送門 BZOJ傳送門 題目描述 知名美食家小 A被邀請至ATM 大酒店,為其品評菜餚。 ATM 酒店為小 A A

[HNOI2015]水果——整體二分

題目大意: 給定一顆樹和m條帶有權值的路徑以及q個路徑詢問,每次求m條路徑中且為給出的路徑的子路徑的第k小。 思路: 首先考慮怎麼判斷一條路經是不是一條路徑的子路徑,假設這條路徑在樹上拐彎,那麼包含它的路徑的兩個端點要分別在兩個子樹裡面,如果這條路徑在樹上不拐彎,假設\(v\)是深度大的那個,\(u\)

bzoj4009 [HNOI2015]水果 整體二分+掃描線+樹狀陣列

Description 給定一棵n個節點的樹,m條帶權樹上路徑(x,y,w),q個詢問,求包含給定路徑(a,b)的帶權路徑中權值第k小路徑的權值 N,P,Q<=40000。 Solution 現在看啥都是病句了,病句學起來好毒啊 考慮單次詢問怎麼做。按照

[bzoj4009] [HNOI2015]水果 整體二分+掃描線+dfs序+樹狀陣列

Description 風見幽香非常喜歡玩一個叫做 osu!的遊戲,其中她最喜歡玩的模式就是接水果。 由於她已經DT FC 了The big black, 她覺得這個遊戲太簡單了,於是發明了一個更 加難的版本。首先有一個地圖,是一棵由 n 個頂點、n-1 條邊組成的樹(例如圖 1 給出的樹包含 8 個

BZOJ4009:[HNOI2015]水果(整體二分版)

整體 二維 .cn names etc space for char fine 淺談離線分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 題目傳送門:https://lydsy.com/JudgeOnline/proble

bzoj 4013: [HNOI2015]實驗比較

light tput 定義 title rect [1] pair sin void Description 小D 被邀請到實驗室,做一個跟圖片質量評價相關的主觀實驗。實驗用到的圖片集一共有 N 張圖片,編號為 1 到 N。實驗分若幹輪進行,在每輪實驗中,小 D會被要求觀

BZOJ[4013] [HNOI2015]實驗比較

出現 algo 一個 補全 type 比較 work stream stdin 樹DP+組合數 網上題解很多,這裏就放個有註釋的代碼 CODE 1 #include <cmath> 2 #include <cstdio> 3

BZOJ 4012 HNOI2015 開店 樹的邊分治

產生 per n) php typedef sca log 思路 max 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=4012 題意概述:給出一顆N點的樹,保證樹上所有點的度不超過3,樹上每個點有權值,每條邊

BZOJ 4011 HNOI2015 落憶楓音 DAG上的dp(實際上重點在於分析)

ora can main span next 暴力 pre -m type 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 題意概述:給出一張N點的DAG(連通),點1的入度為0。現在加一條原圖沒有的邊