菜鸡求助线段树分治板子,只过了Hack
查看原帖
菜鸡求助线段树分治板子,只过了Hack
637565
STLvector楼主2024/4/18 21:40

Record

#include <bits/stdc++.h>

namespace solve
{
	const int N=1e5+5;
	
	struct mergeset
	{
		const static int N=solve::N<<1;
		struct op{int u,v,dh;};
		std::stack<op> oper;
		int f[N],r[N];
		void init()
		{
			for(int i=0;i<N;i++)
				f[i]=i;
		}
		int find(int x)
		{
			if(f[x]==x)
				return x;
			else
				return find(f[x]);
		}
		void merge(int x,int y)
		{
			x=find(x);y=find(y);
			if(x==y)
			{
				oper.push({0,0,0});
				return;
			}
			if(r[x]>r[y])
				std::swap(x,y);
			f[x]=y;
			r[y]+=(r[x]==r[y]);
			oper.push({x,y,r[x]==r[y]});
		}
		void undo(int step)
		{
			while(step--)
			{
				op p=oper.top();
				oper.pop();
				r[p.v]-=p.dh;
				f[p.u]=p.u;
			}
		}
	}ms;
	
	int n,m,k;
	struct edge{int u,v,s,e;}E[N<<1];
	struct segtree
	{
		struct seg
		{
			int l,r;
			std::vector<edge> e;
		}s[N<<2];
		int ls(int p){return p<<1;}
		int rs(int p){return p<<1|1;}
		void build(int l,int r,int p=1)
		{
			s[p]={l,r,{}};
			if(l==r) return;
			int mid=l+r>>1;
			build(l,mid,ls(p));
			build(mid+1,r,rs(p));
		}
		void insert(edge e,int p=1)
		{
			if(e.s<=s[p].l&&s[p].r<=e.e)
			{
				s[p].e.push_back(e);
				return;
			}
			int mid=s[p].l+s[p].r>>1;
			if(e.s<=mid) insert(e,ls(p));
			if(mid<e.e) insert(e,rs(p));
		}
		void dfs(int p=1)
		{
			bool legal=true;
			int did=0;
			for(auto e:s[p].e)
			{
				int u=e.u,v=e.v;
				if(ms.find(u)==ms.find(v))
				{
					legal=false;
					break;
				}
				ms.merge(u,v+n);
				ms.merge(v,u+n);
				did++;
			}
			if(legal)
			{
				if(s[p].l==s[p].r)
					std::cout<<"Yes\n";
				else
				{
					dfs(ls(p));
					dfs(rs(p));
				}
			}
			else
			{
				for(int i=s[p].l;i<=s[p].r;i++)
					std::cout<<"No\n";
			}
			ms.undo(did);
		}
	}s;
	
	void main()
	{
		std::cin>>n>>m>>k;
		s.build(1,k);
		ms.init();
		for(int i=1;i<=m;i++)
		{
			int u,v,l,r;
			std::cin>>u>>v>>l>>r;
			E[i]={u,v,l+1,r};
			if(l!=r)
				s.insert(E[i]);
		}
		s.dfs();
	}
}

int main()
{
	solve::main();
	return 0;
}
2024/4/18 21:40
加载中...