【BZOJ3514】Codechef MARCH14 GERALD07加强版(LCT)
题意:N个点M条边的无向图,q次询问保留图中编号在[l,r]的边的时候图中的联通块个数。
询问加密,强制在线
n,m,q<=200000
题意:RYZ作业
以下转载自hzwer http://hzwer.com/4358.html 本人实力有限难以清晰描述
有一个比较猎奇的做法:首先把边依次加到图中,若当前这条边与图中的边形成了环,那么把这个环中最早加进来的边弹出去
并将每条边把哪条边弹了出去记录下来:ntr[i] = j,特别地,要是没有弹出边,ntr[i] = 0;
这个显然是可以用LCT来弄的对吧。
然后对于每个询问,我们的答案就是对l~r中ntr小于l的边求和,并用n减去这个值
正确性可以YY一下:
如果一条边的ntr >= l,那么显然他可以与从l ~ r中的边形成环,那么它对答案没有贡献
反之如果一条边的ntr < l那么它与从l ~ r中的边是不能形成环的,那么他对答案的贡献为-1
对于查询从l ~ r中有多少边的ntr小于l,我反正是用的函数式线段树
话说LCT自带十倍常数 被卡了一天半 最后还是把swap和isroot拆出来才卡过的……
var t,c:array[..,..]of longint;
mx,a,b,rev,fa,root,q:array[..]of longint;
x,y:array[..]of longint;
n,m,cnt,i,k,tp,tmp,lastans,l,r,top,tt:longint; {function isroot(x:longint):boolean;
begin
if (t[fa[x],0]<>x)and(t[fa[x],1]<>x) then exit(true);
exit(false);
end;
}
{procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; } procedure pushup(x:longint);
var l,r:longint;
begin
l:=t[x,]; r:=t[x,];
mx[x]:=x;
if b[mx[l]]<b[mx[x]] then mx[x]:=mx[l];
if b[mx[r]]<b[mx[x]] then mx[x]:=mx[r];
end; procedure pushdown(x:longint);
var l,r:longint;
begin
l:=t[x,]; r:=t[x,];
if rev[x]> then
begin
rev[x]:=rev[x] xor ; rev[l]:=rev[l] xor ; rev[r]:=rev[r] xor ;
// swap(t[x,],t[x,]);
tt:=t[x,]; t[x,]:=t[x,]; t[x,]:=tt;
end;
end; procedure rotate(x:longint);
var y,z,l,r:longint;
begin
y:=fa[x]; z:=fa[y];
if t[y,]=x then l:=
else l:=;
r:=l xor ;
// if not isroot(y) then
if (t[fa[y],]=y)or(t[fa[y],]=y) then
begin
if t[z,]=y then t[z,]:=x
else t[z,]:=x;
end;
fa[y]:=x; fa[x]:=z; fa[t[x,r]]:=y;
t[y,l]:=t[x,r]; t[x,r]:=y;
pushup(y);
pushup(x);
end; procedure splay(x:longint);
var y,z,k:longint;
begin
inc(top); q[top]:=x;
k:=x;
// while not isroot(k) do
while (t[fa[k],]=k)or(t[fa[k],]=k) do
begin
inc(top); q[top]:=fa[k];
k:=fa[k];
end;
while top> do
begin
pushdown(q[top]);
dec(top);
end; // while not isroot(x) do
while (t[fa[x],]=x)or(t[fa[x],]=x) do
begin
y:=fa[x]; z:=fa[y];
//if not isroot(y) then
if (t[fa[y],]=y)or(t[fa[y],]=y) then
begin
if (t[y,]=x)xor(t[z,]=y) then rotate(x)
else rotate(y);
end;
rotate(x);
end;
end; procedure access(x:longint);
var last:longint;
begin
last:=;
while x> do
begin
splay(x); t[x,]:=last; pushup(x);
last:=x; x:=fa[x];
end;
end; function findroot(x:longint):longint;
var k:longint;
begin
access(x); splay(x);
k:=x;
while t[k,]<> do k:=t[k,];
exit(k);
end; procedure makeroot(x:longint);
begin
access(x); splay(x); rev[x]:=rev[x] xor ;
end; procedure link(x,y:longint);
begin
makeroot(x); fa[x]:=y;
end; procedure cut(x,y:longint);
begin
makeroot(x); access(y); splay(y); t[y,]:=; fa[x]:=;
end; procedure update(l,r:longint;var p:longint;x:longint);
var mid:longint;
begin
inc(cnt); c[cnt]:=c[p];
p:=cnt; inc(c[p,]);
if l=r then exit;
mid:=(l+r)>>;
if x<=mid then update(l,mid,c[p,],x)
else update(mid+,r,c[p,],x);
end; function query(p1,p2,l,r,x:longint):longint;
var mid:longint;
begin
if r=x then exit(c[p2,]-c[p1,]);
mid:=(l+r)>>;
if x<=mid then exit(query(c[p1,],c[p2,],l,mid,x))
else exit(c[c[p2,],]-c[c[p1,],]+query(c[p1,],c[p2,],mid+,r,x));
end; begin
assign(input,'data.in'); reset(input);
assign(output,'bzoj3514.out'); rewrite(output);
readln(n,m,k,tp);
fillchar(b,sizeof(b),$1f);
for i:= to m do
begin
readln(x[i],y[i]);
if x[i]=y[i] then a[i]:=i
else
begin
if findroot(x[i])=findroot(y[i]) then
begin
makeroot(x[i]); access(y[i]); splay(y[i]);
tmp:=mx[y[i]];
a[i]:=tmp-n;
cut(x[tmp-n],tmp); cut(tmp,y[tmp-n]);
b[n+i]:=i; mx[n+i]:=n+i;
link(x[i],i+n); link(i+n,y[i]);
end
else
begin
b[n+i]:=i; mx[n+i]:=n+i;
link(x[i],i+n); link(i+n,y[i]);
end;
end; end;
//for i:= to m do writeln(a[i]);
for i:= to m do
begin
root[i]:=root[i-];
update(,m,root[i],a[i]);
end;
for i:= to k do
begin
readln(l,r);
if tp= then
begin
l:=l xor lastans;
r:=r xor lastans;
end;
lastans:=n-query(root[l-],root[r],,m,l-);
writeln(lastans);
end; close(input);
close(output);
end.
【BZOJ3514】Codechef MARCH14 GERALD07加强版(LCT)的更多相关文章
- [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2177 Solved: 834 ...
- bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树
Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1951 Solved: 746[Submi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树
自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树
题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...
- 【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2023 Solved: 778 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版( LCT + 主席树 )
从左到右加边, 假如+的边e形成环, 那么记下这个环上最早加入的边_e, 当且仅当询问区间的左端点> _e加入的时间, e对答案有贡献(脑补一下). 然后一开始是N个连通块, 假如有x条边有贡献 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
- 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树
题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以 ...
随机推荐
- 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例
今年6月SAP发布C/4HANA之后,有顾问朋友们在微信公众号后台留言,询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来,从而打通企业的前后端业务,帮助企业实现数字化转型. 有的顾 ...
- 10048 - Audiophobia (Floyd)
Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值. #include<bits/stdc++.h> using namespa ...
- eclipse 在写XML时 包类名自动提醒的问题
需要加一个STS插件 配置很简单 参考了 https://blog.csdn.net/HH775313602/article/details/70176531 在 https://spring.io ...
- OpenCV2:总结篇 core模块
一.cv::Mat 1.作用 cv::Mat表示图像类,用来操作图像和矩阵,它包含很多属性和方法 2.构造方法 cv::Mat image; //cv::Mat image() 无参数构造 ...
- struts2的动态方法配置
动态方法调用配置 <package name="test" extends="struts-default"> <aciton name=&q ...
- Bootstrap响应式布局(1)
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- visibilitychange 标签可见性
var pageVisibility = document.visibilityState;// 监听 visibility change 事件document.addEventListener('v ...
- CF-1110 (2019/02/08)
CF-1110 A. Parity 快速幂的思想,考虑最后一位即可 #include <bits/stdc++.h> using namespace std; typedef long l ...
- LeetCode 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- struts2命名空间与访问路径
比如项目deom的struts.xml中有如下片段 Java代码 <package name="demo" extends="struts-default" ...