JZOJ 4739 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
来源:互联网 发布:青少年性犯罪数据 编辑:程序博客网 时间:2024/04/24 17:42
Ztxz16学图论
题目大意
给定
数据范围
题解
做到这题的时候,我真的是不知所措,不过后面还是想到了一种解法。然而,这题提供的题解,竟是LCT(动态树),表示我这种蒟蒻实在是不会这种高级的做法了。
我们看一下题目,只有询问操作,没有修改操作,可以离线处理,这让我们不禁想到了一种奥妙重重的算法——莫队算法。
然而我们会发现一个残酷的现实,在转移的同时我们需要维护一个并查集,加边容易维护答案,可是删边时难以维护并查集和答案啊!
那这样子是否意味着莫队算法就不能做了呢?
注意现在,我们只能使用加边操作,不能使用删边操作,用并查集就可以实现,但如何在不能使用删边操作下维护答案呢?
这个问题是可以解决的。
假设当前的一连串询问左边界L所在块的编号都相同(这里的编号指分块后的编号),此时右坐标
然后对于每次询问,我们现时维护并查集
function getfather(o:longint):longint;begin if 并查集U[o]尚未从并查集K获取信息 then begin U[o]:=K[o]; 将点o的状态设为已获取信息; end; if U[o]=o then exit(o);//如果是并查集的根,则退出并返回函数值 U[o]:=getfather(U[o]); exit(U[o]);end;
像这样维护并查集并同时维护答案即可。
我们分析一下时间复杂度,每一个块的
再看一下
总的来说,时间复杂度是
var f1,f2,ans,ph:array[0..200000] of longint; cqy,ff,be,en,n,m,q,i,j,k,l,xd,o,p,u:longint; xw:array[0..200000,1..4] of longint; bj:array[0..200000,1..2] of longint;function min(a,b:int64):int64; begin if a<b then exit(a) else exit(b); end;procedure sjzl; var i,k:longint; begin randomize; for i:=1 to q div 2 do begin k:=q div 2+1+random(q div 2); xw[0]:=xw[i]; xw[i]:=xw[k]; xw[k]:=xw[0]; end; end;procedure qsort(l,r:longint); var i,j,m,mm:longint; begin i:=l; j:=r; m:=xw[(l+r) div 2,3]; mm:=xw[(l+r) div 2,2]; repeat while (xw[i,3]<m) or (xw[i,3]=m) and (xw[i,2]<mm) do inc(i); while (xw[j,3]>m) or (xw[j,3]=m) and (xw[j,2]>mm) do dec(j); if i<=j then begin xw[0]:=xw[i]; xw[i]:=XW[j]; XW[j]:=xw[0]; inc(i); dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end;function find1(o:longint):longint; begin if ph[o]<>xd then begin f1[o]:=f2[o]; ph[o]:=xd; end; if f1[o]=o then exit(O); f1[o]:=find1(f1[o]); exit(f1[o]); end;function find2(o:longint):longint; begin if f2[o]=o then exit(o); f2[o]:=find2(f2[o]); exit(f2[o]); end;begin readln(n,m,q); for i:=1 to m do readln(bj[i,1],bj[i,2]); p:=trunc(sqrt(n)); for i:=1 to q do begin read(xw[i,1],xw[i,2]); xw[i,4]:=i; xw[i,3]:=xw[i,1] div p; if xw[i,1] mod p>0 then inc(xw[i,3]); end; sjzl; qsort(1,q); cqy:=0; ff:=n; for i:=1 to q do begin if cqy<>xw[i,3] then begin cqy:=xw[i,3]; be:=min(n,p*xw[i,3]); en:=be-1; ff:=n; for j:=1 to n do begin f1[j]:=j; f2[j]:=j; end; end; o:=ff; if xw[i,2]<be then begin inc(xd); for j:=xw[i,1] to xw[i,2] do if find1(bj[j,1])<>find1(bj[j,2]) then begin f1[f1[bj[j,1]]]:=f1[bj[j,2]]; dec(o); end; ans[xw[i,4]]:=o; end else begin for j:=en+1 to xw[i,2] do if find2(bj[j,1])<>find2(bj[j,2]) then begin f2[f2[bj[j,1]]]:=f2[bj[j,2]]; dec(ff); end; en:=xw[i,2]; inc(xd); o:=ff; for j:=xw[i,1] to be-1 do if find1(bj[j,1])<>find1(bj[j,2]) then begin f1[f1[bj[j,1]]]:=f1[bj[j,2]]; dec(o); end; ans[xw[i,4]]:=o; end; end; for i:=1 to q do writeln(ans[i]);end.
4 0
- JZOJ 4739 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
- 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
- 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
- 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
- JZOJ4739 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论 莫队加并查集
- JZOJ4739. 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论(2017.8B组)
- jzoj 4740. 【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划 最大生成树
- JZOJ 4740 【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划
- 【搬自CC_GERALD07】【JZ雅礼联考】Ztxz16学图论 题解
- 【雅礼联考GDOI2017模拟】Zjr506的捕猫计划
- JZOJ4760. 【雅礼联考GDOI2017模拟9.4】同桌的你
- 【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划
- JZOJ4740. 【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划(2017.8B组)
- JZOJsenior4740.【雅礼联考GDOI2017模拟9.2】Zjr506的捕猫计划
- JZOJ4760【雅礼联考GDOI2017模拟9.4】同桌的你 环套树拆边DP
- 2017.08.19【NOIP提高组】模拟赛B组 【雅礼联考GDOI2017模拟】Zjr506的捕猫计划
- JZOJ 4863. 【GDOI2017模拟11.5】Market
- JZOJ 4863 【GDOI2017模拟11.5】Market
- java 链接mysql 产生500W数据模拟生成环境
- HDU4678 Mine bfs+博弈 2013多校8
- HHUOJ 1013: 冒险游戏(risk_ganme) 动态规划 TWT tokyo olympic 2combo -2
- DirectX11:DirectX11下载和环境配置
- 【egret】代码结构
- JZOJ 4739 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
- 十六进制输入十进制输出的快速方法
- Java学习提要——Math类基本
- 计算程序的运行时间
- ucos学习I
- 乌龟棋
- 【算法导论-37】Graph的Java实现
- 奥利奥聊天机器人1.0【原创】【源码附注释】【C语言】
- 【PM】项目管理中遇到“额外”的事怎么处理