日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【块状树】

發(fā)布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【块状树】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
orz lzt的神題
發(fā)現(xiàn)我根本不會塊狀樹
…………寫了好久調(diào)了……一上午是有了
總結(jié)一下
塊狀樹是分塊數(shù)據(jù)結(jié)構(gòu),即把樹分為根號n塊,塊內(nèi)暴力快外整體查詢。【據(jù)研究顯示(nlogn)^1/2會更快】
先分塊,分塊的時候注意要存張樹的圖和塊的圖
查詢的時候塊內(nèi)暴力如果連到塊外整個塊一起查
如果要加點,若能合并到上一個塊則合并,若不行則新開一個塊
錯誤點:(自己犯2就不說了)
1、不能從查詢點所在塊直接往下搜塊。這樣會導致有些不應被計入的塊被計入。這樣子的話就需要存一個整圖而不是塊內(nèi)圖,在加點的時候也需要改動

2、vector真是簡單直白……


#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<vector> #define maxn 60001 using namespace std; int top[maxn],size[maxn]; struct map {int widen;int next[maxn],point[maxn],v[maxn];void addedge(int x,int y){widen++;next[widen]=point[x];point[x]=widen;v[widen]=y;} } org,block,b; int border,sum=0,lastans; int w[maxn],fa[maxn]; vector<int>list[maxn]; int n,m; int readln() {char c=getchar();int bj=1,result=0;while (c!='-'&&!(c<='9'&&c>='0')) c=getchar();if (c=='-') bj=-1,c=getchar();while (c<='9'&&c>='0') result=result*10+c-'0',c=getchar();return result*bj; } void makeblock(int now) {int root=top[now];list[root].push_back(w[now]);for (int k=org.point[now];k!=0;k=org.next[k])if (org.v[k]!=fa[now]){fa[org.v[k]]=now;block.addedge(now,org.v[k]);if (size[root]<border){size[root]++;top[org.v[k]]=root;}else b.addedge(root,org.v[k]);makeblock(org.v[k]);} } void queryblock(int now,int num) {sum=sum+list[now].end()-upper_bound(list[now].begin(),list[now].end(),num);for (int k=b.point[now];k!=0;k=b.next[k]) queryblock(b.v[k],num); } void query(int now,int num) {if (w[now]>num) sum++;for (int k=block.point[now];k!=0;k=block.next[k])if (top[now]==top[block.v[k]])query(block.v[k],num);else queryblock(block.v[k],num); } int main() {int i,j,k,l,s,t,root,u,v,z,x,y,xx;n=readln();border=(int)ceil(sqrt(n)*log2(n));for (i=1;i<n;i++){u=readln();v=readln();org.addedge(u,v);org.addedge(v,u);}for (i=1;i<=n;i++) {w[i]=readln();size[i]=1;top[i]=i;}makeblock(1);for (i=1;i<=n;i++)if (top[i]==i) sort(list[i].begin(),list[i].end());m=readln();lastans=0;for (int o=1;o<=m;o++){z=readln();x=readln()^lastans;y=readln()^lastans;if (z==0) {sum=0;if (x==top[x]) queryblock(x,y);else query(x,y);lastans=sum;printf("%d\n",sum);}if (z==1){list[top[x]].erase(lower_bound(list[top[x]].begin(),list[top[x]].end(),w[x]));list[top[x]].insert(lower_bound(list[top[x]].begin(),list[top[x]].end(),y),y);w[x]=y;}if (z==2) {w[++n]=y;fa[n]=x;root=top[x];block.addedge(x,n);if(size[root]<border){size[root]++;list[top[x]].insert(lower_bound(list[root].begin(),list[root].end(),y),y);top[n]=root;} else{size[n]=1;top[n]=n;list[n].push_back(y);b.addedge(top[x],n);}}} }

總結(jié)

以上是生活随笔為你收集整理的【块状树】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。