考慮b型資料,也就是圖是乙個父親編號小於兒子的樹的情況的做法.
考慮整體二分,對於當前區間\([l,r]\),維護父親屬於當前區間的集合\(s\),現在要將\(s\)分為父親在\([l,mid]\)中的和\([mid+1,r]\)中的兩類.
首先如果\(x \in [l,mid]\),那麼它的父親一定在左區間.
考慮對於所有\([l,mid]\)區間的節點呼叫modify,那麼如果對於\(x \not \in [l,mid]\),如果\(x\)洞穴的光源是亮的,說明它的父親被修改了,也就說它的父親在\([l,mid]\)
就這樣分治下去即可解決,詢問次數\(o(n \log n)\)
考慮一般的資料,可以採用與b型資料類似的方法.每次隨機乙個排列對其執行這樣的操作.此時在上面判斷操作中,如果\(x\)亮了說明\([l,mid]\)中有奇數個也就是至少乙個點與之相鄰,此時我們最後找到的是,每個點和排列中它前方某個點的連邊,也就是乙個與b型類似的樹的結構.
注意儲存已知的邊並在判斷是否有與\([l,mid]\)區間的連邊時排除已知邊的影響.
一次操作完之後,用check函式找到所有已經找到所有鄰邊的點,之後不再對其計算.
注意如果不是b型資料,那麼從一開始就要隨機排列,否則會被構造資料浪費\(o(n \log n)\)次查詢後卡掉
對於\(n \le 500\)的部分暴力計算.
#include "explore.h"
#include #include #include #include #include #define debug(...) fprintf(stderr,__va_args__)
using namespace std;
const int maxn=2e5+50;
int cnt;
int a[maxn];
int head[maxn];
bool mark[maxn];
struct edge
};vectorg;
inline void addedge(int u,int v)
namespace brute
random_shuffle(a,a+n);
} } while(cnt
}
LOJ 2303 NOI2017 蚯蚓排隊
n leq 200000 的 1 leq a i leq 6 的蚯蚓,有三種操作 讓乙隻隊頭蚯蚓接在乙隻隊尾蚯蚓後面 讓一隊蚯蚓從某個蚯蚓後面斷成兩隊 問 給個字串,問他的。算了你們直接看題吧 這什麼沙雕題qaq 所有詢問的串只有 nk 種,把他們全丟進hash裡面就好了。注意雙hash,乙個用來當...
loj 2721 NOI2018 屠龍勇士
有 n 條惡龍,每條惡龍有乙個初始生命值 a i 恢復力 p i 擊殺後會掉落一把劍.初始你有 m 把劍.給出每把劍的攻擊力.現在你打算按照以下方法殺掉所有惡龍 問最小的 x 如果不存在能殺掉所有惡龍的 x 輸出 1 有 t 組資料 n le 10 5,m le 10 5,t le 5,a i le...
loj 2719 NOI2018 氣泡排序
t 5,sum n le 2000000 考慮什麼樣的排列是好的.為了達到下界,p i 應該只向 i 的方向移動,也就是說,不存在乙個數左右都有逆序對,也就是說,不存在 a使得 p a p b p c 無視 q 的限制,可以用dp計算答案,設 dp i,j 表示確定了排列的前 i 個數,設其中最大值...