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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bzoj1146

發(fā)布時(shí)間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj1146 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這是一道無(wú)比繁瑣的題目
話說(shuō)這道題使我第一次練dfs序,比較感動(dòng);
首先dfs序就是在dfs過(guò)程中按照訪問(wèn)的順序給每個(gè)點(diǎn)標(biāo)上兩個(gè)“時(shí)間戳”
一個(gè)是第一次訪問(wèn)到點(diǎn)i時(shí)的時(shí)間戳c[i],一個(gè)是訪問(wèn)完以i為根時(shí)的時(shí)間戳cc[i]
根據(jù)c[i],我們就可以將樹(shù)變成序列,并且以i為根的子樹(shù),是序列上連續(xù)的一段
當(dāng)進(jìn)行單點(diǎn)修改時(shí),我們可以用樹(shù)狀數(shù)組前綴和維護(hù)樹(shù)上的點(diǎn)到根路徑上所有點(diǎn)的修改情況和;
比如當(dāng)點(diǎn)i修改時(shí)(比如+1)?則w[c[i]]+1,w[cc[i]]-1
然后這道題顯然是要在dfs序上套帶修改的主席樹(shù),根據(jù)bzoj2588的經(jīng)驗(yàn)我們很好解決這個(gè)問(wèn)題
由于修改的點(diǎn)要離散化,已經(jīng)離線了,干脆用lca-tarjan求lca好了
由于空間卡的比較嚴(yán),所以我們不能直接樹(shù)狀數(shù)組+主席樹(shù)
而要先把原樹(shù)建成主席樹(shù),然后修改的時(shí)候新建一棵主席樹(shù),用樹(shù)狀數(shù)組+主席樹(shù)解決

1 const maxn=80001; 2 3 type node=record 4 po,next:longint; 5 end; 6 link=record 7 l,r,s:longint; 8 end; 9 point=record 10 x,y,z:longint; 11 end; 12 qu=record 13 num,loc,next:longint; 14 end; 15 16 17 var tree:array[0..10000010] of link; 18 q:array[0..80010] of point; 19 w:array[0..160010] of node; 20 que:array[0..160010] of qu; 21 v:array[0..80010] of boolean; 22 e:array[0..4] of longint; 23 g,fa,an,loc,d1,d2,ph,h,cc,c,b:array[0..80010] of longint; 24 st:array[0..80010,0..4] of longint; 25 sa,a:array[0..160010] of longint; 26 j,k,t,tot,num,len,x,y,z,i,p,s,n,m:longint; 27 28 function lowbit(x:longint):longint; 29 begin 30 exit(x and (-x)); 31 end; 32 33 procedure update(x:longint); 34 begin 35 tree[x].s:=tree[tree[x].l].s+tree[tree[x].r].s; 36 end; 37 38 procedure add(x,y:longint); 39 begin 40 inc(len); 41 w[len].po:=y; 42 w[len].next:=d1[x]; 43 d1[x]:=len; 44 end; 45 46 procedure addq(x,y,z:longint); 47 begin 48 inc(num); 49 que[num].num:=y; 50 que[num].loc:=z; 51 que[num].next:=d2[x]; 52 d2[x]:=num; 53 end; 54 55 function find(x:longint):longint; 56 var l,r,m:longint; 57 begin 58 l:=1; 59 r:=p; 60 while l<=r do 61 begin 62 m:=(l+r) shr 1; 63 if sa[m]=x then exit(m); 64 if sa[m]>x then r:=m-1 else l:=m+1; 65 end; 66 end; 67 68 function getf(x:longint):longint; 69 begin 70 if a[x]<>x then a[x]:=getf(a[x]); 71 exit(a[x]); 72 end; 73 74 procedure dfs(x:longint); 75 var i,y:longint; 76 begin 77 i:=d1[x]; 78 v[x]:=true; 79 inc(tot); 80 b[tot]:=x; //b表示序列上的點(diǎn)對(duì)應(yīng)的樹(shù)上的哪個(gè)點(diǎn) 81 c[x]:=tot; 82 while i<>0 do 83 begin 84 y:=w[i].po; 85 if not v[y] then 86 begin 87 fa[y]:=x; 88 dfs(y); 89 a[y]:=x; 90 end; 91 i:=w[i].next; 92 end; 93 cc[x]:=tot; 94 i:=d2[x]; 95 while i<>0 do 96 begin 97 y:=que[i].num; 98 if v[y] and (an[que[i].loc]=0) then //lca-tarjan 99 an[que[i].loc]:=getf(y); 100 i:=que[i].next; 101 end; 102 end; 103 104 procedure sort(l,r: longint); 105 var i,j,x,y: longint; 106 begin 107 i:=l; 108 j:=r; 109 x:=a[(l+r) div 2]; 110 repeat 111 while a[i]<x do inc(i); 112 while x<a[j] do dec(j); 113 if not(i>j) then 114 begin 115 y:=a[i]; 116 a[i]:=a[j]; 117 a[j]:=y; 118 inc(i); 119 j:=j-1; 120 end; 121 until i>j; 122 if l<j then sort(l,j); 123 if i<r then sort(i,r); 124 end; 125 126 function build(l,r:longint):longint; 127 var m,q:longint; 128 begin 129 inc(t); 130 if l=r then exit(t) 131 else begin 132 q:=t; 133 m:=(l+r) shr 1; 134 tree[q].l:=build(l,m); 135 tree[q].r:=build(m+1,r); 136 exit(q); 137 end; 138 end; 139 140 function insert(last,x,l,r,z:longint):longint; 141 var m,q:longint; 142 begin 143 inc(t); 144 if l=r then 145 begin 146 tree[t].s:=tree[last].s+z; 147 exit(t); 148 end 149 else begin 150 m:=(l+r) shr 1; 151 q:=t; 152 if x<=m then 153 begin 154 tree[q].r:=tree[last].r; 155 last:=tree[last].l; 156 tree[q].l:=insert(last,x,l,m,z); 157 end 158 else begin 159 tree[q].l:=tree[last].l; 160 last:=tree[last].r; 161 tree[q].r:=insert(last,x,m+1,r,z); 162 end; 163 update(q); 164 exit(q); 165 end; 166 end; 167 168 procedure work(i,x,z:longint); 169 begin 170 while i<=n do //樹(shù)狀數(shù)組+主席樹(shù) 171 begin 172 h[i]:=insert(h[i],x,1,p,z); 173 i:=i+lowbit(i); 174 end; 175 end; 176 177 procedure get(x,y:longint); 178 var i:longint; 179 begin 180 e[y]:=1; 181 st[1,y]:=ph[x]; 182 i:=x; 183 while i>0 do 184 begin 185 if h[i]<>0 then 186 begin 187 inc(e[y]); 188 st[e[y],y]:=h[i]; 189 end; 190 i:=i-lowbit(i); 191 end; 192 end; 193 194 function sum:longint; 195 var i,j:longint; 196 begin 197 sum:=0; 198 for j:=1 to 4 do 199 for i:=1 to e[j] do 200 if (j<=2) then 201 sum:=sum+tree[tree[st[i,j]].r].s 202 else sum:=sum-tree[tree[st[i,j]].r].s;//u,v路徑上的情況為tree[u]+tree[v]-tree[lca(u,v)]-tree[fa[lca(u,v)]]; 203 end; 204 205 function getans(l,r,k:longint):longint; 206 var m,s,i,j:longint; 207 begin 208 if l=r then exit(sa[l]) 209 else begin 210 m:=(l+r) shr 1; 211 s:=sum; 212 if s>=k then 213 begin 214 for j:=1 to 4 do 215 for i:=1 to e[j] do 216 st[i,j]:=tree[st[i,j]].r; 217 exit(getans(m+1,r,k)); 218 end 219 else begin 220 k:=k-s; 221 for j:=1 to 4 do 222 for i:=1 to e[j] do 223 st[i,j]:=tree[st[i,j]].l; 224 exit(getans(l,m,k)); 225 end; 226 end; 227 end; 228 229 begin 230 readln(n,m); 231 for i:=1 to n do 232 begin 233 read(g[i]); 234 a[i]:=g[i]; 235 end; 236 s:=n; 237 for i:=1 to n-1 do 238 begin 239 readln(x,y); 240 add(x,y); 241 add(y,x); 242 end; 243 244 for i:=1 to m do 245 begin 246 readln(q[i].z,q[i].x,q[i].y); 247 if q[i].z=0 then 248 begin 249 inc(s); 250 a[s]:=q[i].y; 251 end 252 else begin 253 addq(q[i].x,q[i].y,i); 254 addq(q[i].y,q[i].x,i); 255 end; 256 end; 257 sort(1,s); 258 p:=1; 259 sa[1]:=a[1]; 260 for i:=2 to s do 261 if a[i]<>a[i-1] then //離散化 262 begin 263 inc(p); 264 sa[p]:=a[i]; 265 end; 266 267 for i:=1 to n do 268 a[i]:=i; 269 dfs(1); 270 t:=0; 271 h[0]:=build(1,p); 272 ph[0]:=h[0]; 273 for i:=1 to n do 274 begin 275 loc[i]:=find(g[b[i]]); 276 y:=fa[b[i]]; 277 ph[i]:=insert(ph[c[y]],loc[i],1,p,1); //建立未修改前的主席樹(shù) 278 end; 279 for i:=1 to m do 280 begin 281 if q[i].z<>0 then 282 begin 283 z:=an[i]; 284 get(c[q[i].x],1); //提取區(qū)間 285 get(c[q[i].y],2); 286 get(c[z],3); 287 get(c[fa[z]],4); 288 s:=0; 289 for j:=1 to 4 do 290 begin 291 for k:=1 to e[j] do 292 if (j<=2) then 293 s:=s+tree[st[k,j]].s 294 else s:=s-tree[st[k,j]].s; 295 end; 296 if s<q[i].z then writeln('invalid request!') 297 else writeln(getans(1,p,q[i].z)); 298 end 299 else begin 300 x:=q[i].x; 301 work(c[x],loc[c[x]],-1); 302 work(cc[x]+1,loc[c[x]],1); 303 loc[c[x]]:=find(q[i].y); 304 work(c[x],loc[c[x]],1); 305 work(cc[x]+1,loc[c[x]],-1); 306 end; 307 end; 308 end. View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/phile/p/4473091.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的bzoj1146的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 亚洲欧美激情另类 | 亚洲大片免费 | 国产精品久久久久久妇女6080 | 91福利小视频 | 五月婷婷激情综合网 | 超碰成人免费 | 国内视频一区二区 | 中文字母av | 国产精品免费一区二区 | 欧美成人性生活片 | 少妇裸体视频 | 中文在线免费看视频 | 亚欧成人在线 | 已满18岁免费观看电视连续剧 | 青青草久久伊人 | 综合网在线 | 国产精品一区二区在线免费观看 | 亚洲h在线观看 | 日韩欧美电影一区二区三区 | 三八激情网 | 欧美 国产 精品 | 狠狠热视频 | 91麻豆蜜桃 | 精品人伦一区二区三区蜜桃网站 | 精品国产av 无码一区二区三区 | 国产精品一二三区视频 | 韩国明星乱淫(高h)小说 | 一级大黄毛片 | 在线一区二区三区四区五区 | 国产午夜无码精品免费看奶水 | 久久久久久久久久久久久女过产乱 | 国产精品资源在线观看 | 超碰在线视屏 | 毛片一级免费 | 久久久久久久女国产乱让韩 | 日韩一级片在线 | 亚洲欧美一区二区三区在线 | 嫩草影院一区 | 国产伦精品一区二区三区四区视频 | 极品尤物魔鬼身材啪啪仙踪林 | 成人免费版欧美州 | 亚洲欧洲成人精品久久一码二码 | 国产精品av免费观看 | 青青草国产精品视频 | 亚洲欧美网站 | 亚洲色精品三区二区一区 | 精品国产91久久久久久 | www夜夜 | 亚洲狠狠婷婷综合久久久久图片 | 欧美毛茸茸 | 欧美日韩国产色 | 黄色片a级片 | 91视频在线| 超碰这里只有精品 | 葵司一区二区 | 青青草原成人 | 久久久久国产一区二区三区 | 亚洲码欧美码一区二区三区 | 亚洲精品成人无码毛片 | 亚洲视频你懂的 | 蜜乳av中文字幕 | 狠狠操狠狠摸 | 极品久久久久 | av美女在线| 国产13页 | 亚洲成人一级片 | 中文字幕一区二区三区人妻在线视频 | 欧美三级视频在线 | 欧美z○zo重口另类黄 | 男人天堂欧美 | 欧美精品在线观看一区二区 | 97成人资源 | 四虎精品一区二区三区 | 成人激情电影在线观看 | 欧美少妇xx | 国产精品久久久久久久av福利 | 老司机精品视频网站 | 欧美日韩国产免费观看 | 粉嫩精品久久99综合一区 | 无码精品人妻一二三区红粉影视 | av色成人 | 免费日韩毛片 | 熟睡侵犯の奶水授乳在线 | 成人在线免费播放 | 日韩精品av一区二区三区 | 午夜av网址 | 国产又粗又猛又爽 | 中文字幕一区在线 | 国产精品99久久久久久动医院 | 日本精品二区 | 亚洲一卡二卡三卡四卡 | 国产三级aaa | 欧美激情性生活 | 国产综合社区 | 国产精品二三区 | www.欧美国产 | 日本亚洲最大的色成网站www | 国产黄色三级网站 | www.奇米.com|