传送门

线段树分治好题。


这道题实际上有很多不同的做法:

cdq分治。

lct。



而我学习了dzyo的线段树分治+并查集写法。

所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的区间分别维护信息。

最后按线段树从上到下再从左到右的遍历方式一起统计答案。

这道题可以按时间建树,每次相当于在一段区间里增加边。

最后统计二分图就行了,这个问题可以用并查集解决。

然而我们回溯上去的时候是需要撤销操作的,因此需要用并查集按秩合并。

代码:

#include<bits/stdc++.h>
#define N 100005
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,m,T,ans[N],fa[N],h[N],col[N];
vector<pair<int,int> >e[N<<2];
struct node{
	pair<int,int>x;
	bool f;
	node(pair<int,int>x_,bool f_):x(x_),f(f_){}
};
vector<node>g[N<<2];
inline void update(int p,int l,int r,int ql,int qr,int u,int v){
	if(ql>r||qr<l)return;
	if(ql<=l&&r<=qr){e[p].push_back(make_pair(u,v));return;}
	int mid=l+r>>1;
	if(qr<=mid)update(lc,l,mid,ql,qr,u,v);
	else if(ql>mid)update(rc,mid+1,r,ql,qr,u,v);
	else update(lc,l,mid,ql,qr,u,v),update(rc,mid+1,r,ql,qr,u,v);
}
inline int findcol(int&p){
	int ret=0;
	while(p!=fa[p])ret^=col[p],p=fa[p];
	return ret;
}
inline void query(int p,int l,int r){
	bool f=false;
	for(int i=0;i<e[p].size();++i){
		int u=e[p][i].first,v=e[p][i].second,a=findcol(u),b=findcol(v);
		if(u==v){
			if(a==b){
				f=true;
				for(int i=l;i<=r;++i)ans[i]=0;
				break;
			}
			continue;
		}
		if(h[u]<h[v])swap(u,v);
		fa[v]=u,col[v]=a^b^1;
		bool tmp=0;
		if(h[u]==h[v])h[u]+=(tmp=1);
		g[p].push_back(node(make_pair(u,v),tmp));
	}
	int mid=l+r>>1;
	if(l!=r&&!f)query(lc,l,mid),query(rc,mid+1,r);
	for(int i=g[p].size()-1;~i;--i){
		int u=g[p][i].x.first,v=g[p][i].x.second;
		fa[v]=v,col[v]=0,h[u]-=g[p][i].f;
	}
}
int main(){
	n=read(),m=read(),T=read();
	for(int i=1;i<=n;++i)fa[i]=i,ans[i]=h[i]=1;
	for(int i=1;i<=m;++i){
		int u=read(),v=read(),l=read()+1,r=read();
		if(l>r)continue;
		update(1,1,T,l,r,u,v);
	}
	query(1,1,T);
	for(int i=1;i<=T;++i)if(ans[i])puts("Yes");else puts("No");
	return 0;
}

最新文章

  1. 去掉Actionbar下的shadow
  2. FineUI小技巧(5)向子窗口传值,向父窗口传值
  3. iis里面浏览网页,提示找不到应用程序的解决办法
  4. 远程实时调试手机上的Web页面
  5. sgu 104 Little shop of flowers 解题报告及测试数据
  6. 436. Find Right Interval ——本质:查找题目,因此二分!
  7. Python 全栈开发 -- 开发环境篇
  8. JAVA里的String、Timestamp、Date相互转换
  9. BZOJ 3653: 谈笑风生(DFS序+可持久化线段树)
  10. UCSC下载ENCODE数据
  11. Lucene分词详解
  12. get_time
  13. CSS3 Flexbox可视化指南
  14. 关于ASP.NET MVC4在IIS6中不认识安卓移动设备的解决办法
  15. 在 Azure VM 上安装 LAMP Web 服务器
  16. Vue实现双向绑定的原理以及响应式数据
  17. Linux学习2-fork
  18. 如何查看HBase的HFile
  19. Flask的第一个应用
  20. linux mkisofs(genisoimage)命令用法

热门文章

  1. angular 参考文档
  2. HTML5 浏览器接收的常用 content-type
  3. Virus
  4. hibernate 异常
  5. Shiro权限总结
  6. Haskell语言学习笔记(62)Divisible
  7. Cache Lucene IndexReader with Apache Commons Pool
  8. 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法
  9. one by one 项目 part 2
  10. MVC 发布到IIS中的配置方法