BZOJ4605 嶗山白花蛇草水

2021-09-07 06:31:38 字數 1184 閱讀 2768

外層維護權值線段樹,內層維護kd-tree。

修改的時候只往右兒子裡插入,不平衡的時候替罪羊式重構。

查詢的時候在外層線段樹上走,在內層kd-tree上查詢矩形內點數即可。

時間複雜度$o(q\log v(\log^2q+\sqrt))$。

#include#include#includeusing namespace std;

const double a=0.8;

const int n=100010,m=1600010;

inline void read(int&a)

int n,ans,cmp_d,op,x1,y1,x2,y2,k;

int tmp[n],deep,need[n],cnt,cur;

int t[m],l[m],r[m],tot=1;

struct nodet[m];

inline bool cmp(int a,int b)

inline void up(int x)

if(t[x].r)

}int build(int l,int r,int d)

void dfs(int x)

inline void ins(int&root,int now)

for(int d=deep=0,x=root;;d^=1)else x=t[x].r;

}elseelse x=t[x].l;

}} tmp[++deep]=now;

if(deepx2||t[x].max[1]y2||ans>=k)return;

if(t[x].min[0]>=x1&&t[x].max[0]<=x2&&t[x].min[1]>=y1&&t[x].max[1]<=y2)

if(t[x].d[0]>=x1&&t[x].d[0]<=x2&&t[x].d[1]>=y1&&t[x].d[1]<=y2)ans++;

ask(t[x].l);ask(t[x].r);

}inline void add()

if(a==b)return;

mid=(a+b)>>1;

if(k<=mid)else

}}inline void query()

printf("%d\n",ans=a);

}int main()else

} return 0;

}

多校第一場 hdu4605 離線

題意 給出一棵二叉樹,每個節點都有對應的權值。遊戲規則是 從根節點開始向下 滾 乙個權值為x的物體,到達乙個節點的時候 如果x w i 即權值相等。則該物體停止移動。如果x如果x w i 進入左兒子的概率是1 8,進入右兒子的概率是7 8。詢問是 乙個權值為x的物體,能夠到達u節點的概率是多少?每個...

hdu 4605 線段樹與二叉樹遍歷

思路 首先將所有的查詢有乙個vector儲存起來。我們從1號點開始dfs這顆二叉樹,用線段樹記錄到當前節點時,走左節點的有多少比要查詢該節點的x值小的,有多少大的,同樣要記錄走右節點的有多少比x小的,多少比x大的。小和大的x,y值題目給了。當要進行左兒子時,建該節點值插入走左的線段樹,回退的時候將其...

BZOJ1052 BZOJ3760 覆蓋問題

原題位址 先說自己的逗比方法 二分答案,把所有點用乙個最小的矩形 框 起來,易證矩形的其中乙個端點是最優解中正方形的乙個端點,然後列舉四個端點後遞迴處理,差不多了 然後 olz黃學長的o n 做法 ac code include include include using namespace std...