分组赛的题……madan原题,考试想不出来真是SB得不行
首先,从大往小加边,每次加边如果成环必然弹出环上最大边
考虑询问[x,y],如果边权在[x,y]的边弹出了小于等于y的边j,说明j不在最小生成树上
其余边权在[x,y]的边都在最小生成树上
因此我们每次只要询问,在一段区间内边权小于等于y的边权和是多少,显然用主席树维护
处理弹出的最大边可以暴力,因为n不大
但我写了lct还是t真是简直了……
1 const inf=10000007; 2 type way=record 3 x,y,z:longint; 4 end; 5 node=record 6 l,r,s:longint; 7 end; 8 9 var tree:array[0..210010*20] of node; 10 a:array[0..100010] of way; 11 h,st,w,f,c,fa,mx:array[0..120010] of longint; 12 son:array[0..120010,1..2] of longint; 13 rev:array[0..120010] of boolean; 14 ans,j,len,wh,p,i,t,tt,n,m,q,x,y:longint; 15 16 procedure swap(var a,b:longint); 17 var c:longint; 18 begin 19 c:=a; 20 a:=b; 21 b:=c; 22 end; 23 24 procedure sort(l,r:longint); 25 var i,j,x:longint; 26 y:way; 27 begin 28 i:=l; 29 j:=r; 30 x:=a[(l+r) shr 1].z; 31 repeat 32 while a[i].z>x do inc(i); 33 while x>a[j].z do dec(j); 34 if not(i>j) then 35 begin 36 y:=a[i]; a[i]:=a[j]; a[j]:=y; 37 inc(i); 38 dec(j); 39 end; 40 until i>j; 41 if l<j then sort(l,j); 42 if i<r then sort(i,r); 43 end; 44 45 function max(a,b:longint):longint; 46 begin 47 if a>b then exit(a) else exit(b); 48 end; 49 50 function getf(x:longint):longint; 51 begin 52 if f[x]<>x then f[x]:=getf(f[x]); 53 exit(f[x]); 54 end; 55 56 function root(x:longint):boolean; 57 begin 58 exit((son[fa[x],1]<>x) and (son[fa[x],2]<>x)); 59 end; 60 61 procedure update(x:longint); 62 var l,r:longint; 63 begin 64 l:=son[x,1]; r:=son[x,2]; 65 mx[x]:=x; 66 if w[mx[l]]>w[mx[x]] then mx[x]:=mx[l]; 67 if w[mx[r]]>w[mx[x]] then mx[x]:=mx[r]; 68 end; 69 70 procedure rotate(x,w:longint); 71 var y:longint; 72 begin 73 y:=fa[x]; 74 if not root(y) then 75 begin 76 if son[fa[y],1]=y then son[fa[y],1]:=x 77 else son[fa[y],2]:=x; 78 end; 79 fa[x]:=fa[y]; 80 son[y,3-w]:=son[x,w]; 81 if son[x,w]<>0 then fa[son[x,w]]:=y; 82 son[x,w]:=y; 83 fa[y]:=x; 84 update(y); 85 end; 86 87 procedure push(x:longint); 88 begin 89 if rev[x] then 90 begin 91 rev[son[x,1]]:=not rev[son[x,1]]; 92 rev[son[x,2]]:=not rev[son[x,2]]; 93 swap(son[x,1],son[x,2]); 94 rev[x]:=false; 95 end; 96 end; 97 98 procedure splay(x:longint); 99 var i,y,t:longint; 100 fl:boolean; 101 begin 102 i:=x; 103 t:=0; 104 while not root(i) do 105 begin 106 inc(t); 107 st[t]:=i; 108 i:=fa[i]; 109 end; 110 inc(t); 111 st[t]:=i; 112 for i:=t downto 1 do 113 push(st[i]); 114 if t=1 then exit; 115 fl:=true; 116 while fl do 117 begin 118 y:=fa[x]; 119 if y=st[t] then 120 begin 121 if son[y,1]=x then rotate(x,2) 122 else rotate(x,1); 123 fl:=false; 124 end 125 else begin 126 if fa[y]=st[t] then fl:=false; 127 if son[fa[y],1]=y then 128 begin 129 if son[y,1]=x then rotate(y,2) 130 else rotate(x,1); 131 rotate(x,2); 132 end 133 else begin 134 if son[y,1]=x then rotate(x,2) 135 else rotate(y,1); 136 rotate(x,1); 137 end; 138 end; 139 end; 140 update(x); 141 end; 142 143 procedure access(x:longint); 144 var y:longint; 145 begin 146 y:=0; 147 repeat 148 splay(x); 149 son[x,2]:=y; 150 update(x); 151 y:=x; 152 x:=fa[x]; 153 until x=0; 154 end; 155 156 procedure makeroot(x:longint); 157 begin 158 access(x); 159 splay(x); 160 rev[x]:=not rev[x]; 161 end; 162 163 procedure link(x,y:longint); 164 begin 165 makeroot(x); 166 fa[x]:=y; 167 end; 168 169 procedure cut(x,y:longint); 170 begin 171 makeroot(x); 172 access(y); 173 splay(y); 174 son[y,1]:=0; fa[x]:=0; 175 end; 176 177 function get(x,y:longint):longint; 178 begin 179 makeroot(x); 180 access(y); 181 splay(y); 182 exit(mx[y]); 183 end; 184 185 function build(l,r:longint):longint; 186 var m,q:longint; 187 begin 188 inc(t); q:=t; 189 tree[q].s:=0; 190 if l<>r then 191 begin 192 m:=(l+r) shr 1; 193 tree[q].l:=build(l,m); 194 tree[q].r:=build(m+1,r); 195 end; 196 exit(q); 197 end; 198 199 function add(l,r,last,x,y:longint):longint; 200 var m,q:longint; 201 begin 202 inc(t); q:=t; 203 if l=r then tree[q].s:=tree[last].s+c[x]*y 204 else begin 205 m:=(l+r) shr 1; 206 if x<=m then 207 begin 208 tree[q].r:=tree[last].r; 209 tree[q].l:=add(l,m,tree[last].l,x,y); 210 end 211 else begin 212 tree[q].l:=tree[last].l; 213 tree[q].r:=add(m+1,r,tree[last].r,x,y); 214 end; 215 tree[q].s:=tree[tree[q].l].s+tree[tree[q].r].s; 216 end; 217 exit(q); 218 end; 219 220 function ask(l,r,x,y,k:longint):longint; 221 var m:longint; 222 begin 223 if l=r then 224 begin 225 if c[l]<=k then exit(tree[y].s-tree[x].s) 226 else exit(0); 227 end 228 else begin 229 m:=(l+r) shr 1; 230 if k<=c[m] then exit(ask(l,m,tree[x].l,tree[y].l,k)) 231 else exit(tree[tree[y].l].s-tree[tree[x].l].s+ask(m+1,r,tree[x].r,tree[y].r,k)); 232 end; 233 end; 234 235 function find1(l,r,x:longint):longint; 236 var m:longint; 237 begin 238 find1:=r+1; 239 while l<=r do 240 begin 241 m:=(l+r) shr 1; 242 if (c[a[m-1].z]>x) and (c[a[m].z]<=x) then exit(m); 243 if c[a[m].z]<=x then r:=m-1 else l:=m+1; 244 end; 245 end; 246 247 function find2(l,r,x:longint):longint; 248 var m:longint; 249 begin 250 find2:=l-1; 251 while l<=r do 252 begin 253 m:=(l+r) shr 1; 254 if (c[a[m].z]>=x) and (c[a[m+1].z]<x) then exit(m); 255 if c[a[m].z]>=x then l:=m+1 else r:=m-1; 256 end; 257 end; 258 259 begin 260 readln(tt); 261 while tt>0 do 262 begin 263 dec(tt); 264 readln(n,m); 265 for i:=1 to n+m do 266 begin 267 f[i]:=i; 268 fa[i]:=0; son[i,1]:=0; son[i,2]:=0; 269 w[i]:=0; rev[i]:=false; 270 end; 271 for i:=1 to m do 272 readln(a[i].x,a[i].y,a[i].z); 273 sort(1,m); 274 for i:=1 to m do 275 w[n+i]:=a[i].z; 276 p:=1; 277 c[1]:=a[m].z; 278 a[m].z:=1; 279 for i:=m-1 downto 1 do 280 begin 281 if a[i].z<>c[p] then 282 begin 283 inc(p); 284 c[p]:=a[i].z; 285 end; 286 a[i].z:=p; 287 end; 288 t:=0; 289 h[0]:=build(1,p); 290 for i:=1 to m do 291 begin 292 x:=getf(a[i].x); 293 y:=getf(a[i].y); 294 h[i]:=h[i-1]; 295 if x<>y then f[x]:=y 296 else begin 297 wh:=get(a[i].x,a[i].y); 298 h[i]:=add(1,p,h[i],a[wh-n].z,-1); 299 cut(a[wh-n].x,wh); 300 cut(a[wh-n].y,wh); 301 end; 302 h[i]:=add(1,p,h[i],a[i].z,1); 303 link(a[i].x,n+i); 304 link(a[i].y,n+i); 305 end; 306 c[p+1]:=inf; 307 a[0].z:=p+1; 308 a[m+1].z:=0; 309 c[0]:=-1; 310 readln(q); 311 ans:=0; 312 for i:=1 to q do 313 begin 314 readln(x,y); 315 x:=x-ans; 316 y:=y-ans; 317 len:=y; 318 if x>y then ans:=0 319 else begin 320 x:=find2(1,m,x); 321 y:=find1(1,m,y); 322 ans:=ask(1,p,h[y-1],h[x],len); 323 end; 324 writeln(ans); 325 end; 326 end; 327 end.