首页 > 其他分享 >P6684 题解

P6684 题解

时间:2024-09-11 13:36:12浏览次数:1  
标签:return int 题解 复杂度 P6684 maxn

CF1386C

P6684

cf 上时限 \(1\) 秒,洛谷 \(2\) 秒。

思路

维护是否有奇环可用拓展域并查集。暴力复杂度 \(O(mq)\)。发现插入容易删除困难,用不删除的莫队,可撤销并查集,复杂度 \(O((n+q)\sqrt m\log n)\)。大概要 \(5\) 秒左右,只能过洛谷上的前 \(5\) 个子任务。

等价对于每个 \(r\) 求最小的 \(l\) 使得 \([1,l]\) 和 \([r,m]\) 的边能组成奇环。将边复制一遍接在后面,即对于每个 \(i\) 求最小的 \(p\) 使得 \([i,p]\) 间的边组成奇环。这里 \(p\) 有单调性。依次求每个 \(i\),每次右移 \(p\),加入的这条边 \(p\) 会在求 \([i,p]\) 时都有贡献。插入容易删除困难,用线段树分治。初始没有边,分治到 \(i\) 时会对之后一个区间加入若干条边,一共加边 \(m\) 次。总复杂度 \(O(m\log^2 m)\)。

不开 long long 就能过 cf。

code

int n,m,q;
pii g[maxn];
#define mid (l+r>>1)
#define ls nd<<1
#define rs nd<<1|1
vector<int> tree[maxn<<2];
void updata(int nd,int l,int r,int ql,int qr,int id){
	if(ql>qr)return ;
	if(l>=ql&&r<=qr){
		// cout<<l<<" "<<r<<" "<<id<<" upd\n";
		tree[nd].pb(id);
		return ;
	}
	if(ql<=mid)updata(ls,l,mid,ql,qr,id);
	if(qr>mid)updata(rs,mid+1,r,ql,qr,id);
}
int f[maxn],siz[maxn];
int fd(int x){
	if(f[x]==x)return x;
	return fd(f[x]);
}
int st[maxn<<5],tp,fl;
void merge(int x,int y){
	int u=fd(x),v=fd(y),uu=fd(x+n),vv=fd(y+n);
	if(u==v){
		fl=1;
		return ;
	}
	if(u!=vv){
		if(siz[u]<siz[vv])swap(u,vv);
		st[++tp]=vv;f[vv]=u,siz[u]+=siz[vv];
		if(siz[v]<siz[uu])swap(v,uu);
		st[++tp]=uu;f[uu]=v,siz[v]+=siz[uu];
	}
}
void del(){
	int u=st[tp];siz[f[u]]-=siz[u],f[u]=u;
	tp--;
}
int ans[maxn];
int p=1;
void dfs(int nd,int l,int r){
	int lst=tp,flag=fl;
	// cout<<l<<" "<<r<<" "<<tree[nd].size()<<endl;
	for(int i:tree[nd])merge(g[i].fi,g[i].se);
	if(l==r){
		while(p<=2*m&&!fl){
			merge(g[p].fi,g[p].se);
			updata(1,1,2*m,l+1,p,p);
			p++;
		}
		if(!fl)ans[l]=p;
		else ans[l]=p-1;
		// cout<<l<<" "<<p-1<<" "<<tp<<endl;
	}
	else dfs(ls,l,mid),dfs(rs,mid+1,r);
	while(tp>lst)del();
	fl=flag;
	// cout<<l<<" "<<r<<endl;
	// for(int i=1;i<=2*n;i++)cout<<fd(i)<<" ";cout<<"\n";
}
void work(){
	n=read();m=read();q=read();
	for(int i=1;i<=m;i++)g[i]={read(),read()},g[i+m]=g[i];
	for(int i=1;i<=2*n;i++)f[i]=i,siz[i]=1;
	dfs(1,1,2*m);
	while(q--){
		int l=read(),r=read();
		if(ans[r+1]<=m+l-1)puts("YES");
		else puts("NO");
	}
}

标签:return,int,题解,复杂度,P6684,maxn
From: https://www.cnblogs.com/yhddd/p/18408090

相关文章

  • 单词游戏 题解
    四倍经验51nod2875单词游戏acwing1185.单词游戏洛谷SPOJWORDS1-PlayonWords单词PlayonWords我们可以将每一个字母看成一个节点,这样我们就有了一个包含26个节点的图,对于读入的单词,我们将首字母和尾字母对应的节点之间建有向边(中间的字母没什么用就不管了)。此......
  • 【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解
    ......
  • 【秋招笔试】9.08字节跳动秋招(已改编)-三语言题解
    ......
  • 挑战不可能篇1——洛谷28分钟14道CCF GESP C++ 一级上机题&洛谷14道题题解
    扯谈今天继续挑战不可能:洛谷28分钟14道题这我个人认为不简单,算上编译、提交、命名等杂七杂八的东东之后,只剩下了大约1分钟/题。本次挑战的是CCFGESPC++一级上机题.这竟然能成功!下面附上每一题第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题......
  • [ARC106F] Figures 题解
    生成函数大法好。思路考虑prufer序列。如果\(n\)个点的度数确定,那么生成树个数为:\[\frac{(n-2)!}{\prod(d_i-1)}\]那么在此题中,\(n\)个点的度数确定,那么方案数为:\[\frac{(n-2)!}{\prod(d_i-1)}\prod\frac{a_i!}{(a_i-d_i)!}\]其中,\(\sumd_i=2\timesn-2\)。容易发......
  • CF1672F2 Checker for Array Shuffling 题解
    题目链接点击打开链接题目解法我怎么F1都不会做/llF1:由原始值向最终值连边如果是排列的话,操作次数显然为\(n-\)环数拓展到非排列的情况,即相同数之间的下标可以选择顺序,要求分出来的环数最大直接考虑上面的这东西,让我进入了死胡同。。先给出一个结论:最大环数的最小值是......
  • 【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?
    【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?场景一、JAVA程序中某个线程占用CPU飙高,问题定位top、jstack命令的使用四步教你快速定位问题代码1.top命令获取异常的java进程PID   top2.查询异常进程中的线程情况,获取异常......
  • [ARC073F] Many Moves 题解
    [ARC073F]ManyMoves题解个人感觉其实还挺套路的题目。不配紫题。对于两个玩意在数轴上跑来跑去这种题目,常见的套路是固定一个点的位置,用另一个点的位置设为状态。对于本题,题目已经帮你固定了一个点,于是我们设\(dp_{x}\)表示一个点在当前要求的位置,另一个点在\(x\)的最小......
  • ABC370 DEF 题解
    ABC370DEF题解赛时过了ABCD,补题的时候发现EF其实也是简单题,为什么就做不出来呢?E这样简单的dp都做不出来,dp必须得多练啊!D-CrossExplosion题目链接对于每一行、列,我们要用一个数据结构来维护未被删除的点,并且要快速找到某一行/列中是否存在某个数,以及查询某个数的前......
  • 「NOI2021 D1T3 庆典」题解
    uoj675加强:\(\sumk\le6\times10^5\)暴力\(u\)在\(s\Rightarrowt\)路径上\(\iff\)正图上\(s\Rightarrowu\)且反图上\(u\Rightarrowt\)时间复杂度\(O((n+m)q)\)正解只关心可达性,不妨SCC缩点成DAG。注意到一个奇怪的条件:对于三座城市\(x,y,z\),若\(x\Right......