蒟蒻因为太菜T飞了怎么办
  • 板块CF891C Envy
  • 楼主watermonster
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/11/26 20:57
  • 上次更新2023/11/5 07:17:06
查看原帖
蒟蒻因为太菜T飞了怎么办
209454
watermonster楼主2020/11/26 20:57

RT

LCT就算常数再大也不应该在几万的点TLE吧?

有大佬有兴趣帮菜鸡卡下常或者优化一下吗?

蒟蒻的代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")

#include <cstdio>
#include <cstring>
#include <utility>
#include <algorithm>

using namespace std;

#define il inline
#define re register
#define file(s) freopen(#s".in","r",stdin),freopen(#s".out","w",stdout)
#define mp(x,y) make_pair(x,y)

typedef pair<int,int> Pair;

const int N=1e6+10;

namespace FastIO
{
	char buf[1<<21],buf2[1<<21],*p1=buf,*p2=buf;
	int p4,p3=-1;
	il int getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
	il void Flush(){fwrite(buf2,1,p3+1,stdout),p3=-1;}
	#define isdigit(ch) (ch>=48&&ch<=57)
	template <typename T>
	il void read(T &x)
	{
		re int f=0;x=0;re char ch=getc();
		while(!isdigit(ch)) f|=(ch=='-'),ch=getc();
		while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getc();
		x=f?-x:x;
	}
	template <typename T>
	il void print(T x)
	{
		if(p3>(1<<20)) Flush();
		if(x<0) buf2[++p3]=45,x=-x;
		re int a[50]={};
		do{a[++p4]=x%10+48;}while(x/=10);
		do{buf2[++p3]=a[p4];}while(--p4);
	}
}
using namespace FastIO;

int cnt;
struct edge{int u,v,w;}e[N];
 
struct Link_Cut_Tree
{
	int fa[N],son[2][N],Max[N],tag[N];
	il void init()
	{
		memset(fa,0,sizeof(fa));
		memset(son,0,sizeof(son));
		memset(Max,0,sizeof(Max));
		memset(tag,0,sizeof(tag));
		return;
	}
	#define ls(p) (son[0][p])
	#define rs(p) (son[1][p])
	#define indent(x,f) (rs(f)==x)
	#define notrt(x) (ls(fa[x])==x||rs(fa[x])==x)
	#define connect(x,f,s) (fa[x]=f,son[s][f]=x)
	il void pushup(int x)
	{
		Max[x]=x;
		if(e[Max[ls(x)]].w>e[Max[x]].w) Max[x]=Max[ls(x)];
		if(e[Max[rs(x)]].w>e[Max[x]].w) Max[x]=Max[rs(x)];
		return;
	}
	#define reverse(x) (swap(ls(x),rs(x)),tag[x]^=1)
	il void pushdown(int x)
	{
		if(!tag[x]) return;
		if(ls(x)) reverse(ls(x));
		if(rs(x)) reverse(rs(x));
		tag[x]=0;return;
	}
	int st[N],top;
	il void pushall(int x)
	{
		top=0;
		while(notrt(x)) st[++top]=x,x=fa[x];
		pushdown(x);
		while(top) pushdown(st[top--]);
		return;
	}
	il void rotate(int x)
	{
		re int f=fa[x],ff=fa[f],k=indent(x,f);
		connect(son[k^1][x],f,k);
		fa[x]=ff;
		if(notrt(f)) son[indent(f,ff)][ff]=x;
		connect(f,x,k^1);
		pushup(f);pushup(x);
		return;
	}
	il void splay(int x)
	{
		pushall(x);
		while(notrt(x))
		{
			re int f=fa[x],ff=fa[f];
			if(notrt(f)) rotate(indent(x,f)^indent(f,ff)?x:f);
			rotate(x);
		}
		return;
	}
	il void access(int x)
	{
		re int flag=x==5;
		for(re int y=0;x;x=fa[y=x])
			splay(x),rs(x)=y,pushup(x);
		return;
	}
	il void makert(int x){access(x),splay(x),reverse(x);return;}
	il int getrt(int x)
	{
		access(x);splay(x);
		while(ls(x)) pushdown(x),x=ls(x);
		splay(x);return x;
	}
	il void link(int u,int v)
	{
		makert(u);
		if(getrt(v)==u) return;
		fa[u]=v;return;
	}
	il void cut(int u,int v)
	{
		makert(u);
		if(getrt(v)^u||fa[v]^u||ls(v)) return;
		fa[v]=rs(u)=0;pushup(u);
		return;
	}
	il void split(int u,int v){makert(u);access(v);splay(v);return;}
	il int query(int u,int v){split(u,v);return Max[v];}
}T;
 
int n,m,q;
int k,flag;
Pair tmp[N];
int top;

int main()
{
	read(n),read(m);cnt=n;T.init();
	for(re int i=1,u,v,w,y;i<=m;++i)
	{
		read(u),read(v),read(w),e[++cnt]=(edge){u,v,w};
		if(T.getrt(v)==T.getrt(u))
		{
			y=T.query(u,v);
			if(e[y].w<=w) continue;
			T.cut(e[y].u,y);T.cut(e[y].v,y);
		}
		T.link(u,cnt);T.link(v,cnt);
	}
	read(q);
	while(q--)
	{
		read(k);flag=1;
		for(re int i=1,x,y;i<=k;++i)
		{
			read(x);x+=n;
			if(flag)
			{
				y=T.query(e[x].u,e[x].v);
				if(e[y].w<e[x].w){flag=0;continue;}
				tmp[++top]=mp(x,e[x].w);T.splay(x);e[x].w=0;
				if(y^x)
				{
					T.cut(e[y].u,y);T.cut(e[y].v,y);
					T.link(e[x].u,x);T.link(e[x].v,x);
				}
			}
		}
		while(top)
		{
			T.splay(tmp[top].first);
			e[tmp[top].first].w=tmp[top].second;
			--top;
		}
		puts(flag?"YES":"NO");
	}
	Flush();return 0;
}
2020/11/26 20:57
加载中...