CF160D性感代码求调/kel
  • 板块学术版
  • 楼主expnoi
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/20 14:56
  • 上次更新2023/10/23 21:01:57
查看原帖
CF160D性感代码求调/kel
378346
expnoi楼主2023/3/20 14:56

rt,已经调两天了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
	return s*w;
}
inline void print(int x)
{
	if(x<0)x=-x,putchar('-');
	if(x>=10)print(x/10);
	putchar(x%10+48);
}
int n,m,fa[1000010],vis[1000010];
struct edge
{
	int u,v,w,id;
	bool operator<(const edge &x)const
	{
		return w<x.w;
	}
}g[200010];
bool cmp(edge a,edge b)
{
	return a.id<b.id;
}
inline int get(int x)
{
	return fa[x]==x?x:fa[x]=get(fa[x]);
}
struct node{
	int v,w,next;
}e[200001];
struct tree
{
	int l,r,mi,lazy;
}C[400010];
int ans[100010],head[100010],eid=1,dep[100010],f[100010][21],c[100010][21],id[100010],to[100010],si[100010],son[100010],top[100010],w[100010],tot;
inline void insert(int u,int v,int w)
{
	e[eid].v=v;
	e[eid].w=w;
	e[eid].next=head[u];
	head[u]=eid++;
}
inline void dfs(int u,int fa)
{
	si[u]=1;
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==fa)continue;
		dfs(v,u);
		c[v][0]=e[i].w;
		w[v]=e[i].w;
		si[u]+=si[v];
		if(si[son[u]]<si[v])son[u]=v;
	}
}
inline void dfs1(int u,int Top,int fa)
{
	id[u]=++tot;
	to[tot]=u;
	top[u]=Top;
	if(son[u])
	dfs1(son[u],Top,u);
	for(int i=head[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(v==son[u]||v==fa)continue;
		dfs1(v,v,u);
	}
}
inline void build(int id,int l,int r)
{
	C[id].l=l;
	C[id].r=r;
	C[id].lazy=-1;
	if(l==r)
	{
		C[id].mi=0x3f3f3f3f;
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
}
inline int Max(int a,int b)
{
	if(dep[a]<dep[b])swap(a,b);
	int ma=0;
	for(int i=20;i>=0;i--)
	{
		if(dep[f[a][i]]>=dep[b])
		{
			ma=max(ma,c[a][i]);
			a=f[a][i];
		}
	}
	if(a==b)return ma;
	for(int i=20;i>=0;i--)
	{
		if(f[a][i]!=f[b][i])
		{
			ma=max({ma,c[a][i],c[b][i]});
			a=f[a][i];
			b=f[b][i];
		}
	}
	return max({ma,c[a][0],c[b][0]});
}
inline void pushdown(int id)
{
    if(C[id].lazy==-1)return;
    if(C[id<<1].lazy==-1)C[id<<1].lazy=0x3f3f3f3f;
    if(C[id<<1|1].lazy==-1)C[id<<1|1].lazy=0x3f3f3f3f;
	C[id<<1].lazy=min(C[id].lazy,C[id<<1].lazy);
	C[id<<1|1].lazy=min(C[id].lazy,C[id<<1|1].lazy);
	C[id<<1].mi=min(C[id<<1|1].mi,C[id].lazy);
	C[id<<1|1].mi=min(C[id<<1|1].mi,C[id].lazy);//其实只有叶子的min有用,这里偷个懒:) 
	C[id].lazy=-1;
}
inline void update(int id,int x,int y,int v)
{
	if(x<=C[id].l&&C[id].r<=y)
	{
		if(C[id].lazy==-1)C[id].lazy=v;
		C[id].lazy=min(C[id].lazy,v);
		int Cc=(C[id].lazy==-1?0x3f3f3f3f:C[id].lazy);
		C[id].mi=min(C[id].mi,Cc);
		return;
	}
	pushdown(id);
	int mid=C[id].l+C[id].r>>1;
	if(x<=mid)
	{
		update(id<<1,x,y,v);
	}//
	if(y>mid)
	{
		update(id<<1|1,x,y,v);
	}
	C[id].mi=min(C[id<<1].mi,C[id<<1|1].mi);
}
inline void modify(int u,int v,int w)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		//u??????
		update(1,id[top[u]],id[u],w);
		u=f[top[u]][0]; 
	}
	if(dep[u]<dep[v])swap(u,v);
	update(1,id[v]+1,id[u],w);
}
inline int query(int id,int x)
{
	if(C[id].l==C[id].r)return C[id].mi;
	pushdown(id);
	int mid=C[id].l+C[id].r>>1;
	if(x<=mid)
	{
		return query(id<<1,x);
	}
	else return query(id<<1|1,x);
}
signed main()
{
	n=read();
	m=read();
	for(int i=1;i<=m;i++)
	{
		g[i]={read(),read(),read(),i};
	}
	sort(g+1,g+m+1);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1,cnt=0;i<=m;i++)
	{
		int u=get(g[i].u),v=get(g[i].v);
		if(u!=v)
		{
			fa[u]=v;
			vis[g[i].id]=1;
			cnt++;
			insert(g[i].u,g[i].v,g[i].w);
			insert(g[i].v,g[i].u,g[i].w);
		}
		if(cnt==n-1)break;
	}
	dfs(1,0);
	dfs1(1,1,0);
	sort(g+1,g+m+1,cmp);
	build(1,1,n);
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j]=f[f[i][j-1]][j-1];
			c[i][j]=max(c[i][j-1],c[f[i][j-1]][j-1]);
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(vis[i])continue;
		int W=g[i].w,u=g[i].u,v=g[i].v;
		if(W>Max(u,v))
		{
			ans[i]=1;//?????? 
			continue;
		}
		ans[i]=2;
		modify(u,v,W);
	}
	for(int i=1;i<=m;i++)
	{
		if(vis[i])
		{
		    int W=g[i].w,u=0;
		    if(f[g[i].u][0]==g[i].v)u=g[i].u;
		    else u=g[i].v;
    		if(query(1,id[u])>W)
    		{
    			ans[i]=3;
    		}
    		else ans[i]=2;
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(ans[i]==1)puts("none");
		if(ans[i]==2)puts("at least one");
		if(ans[i]==3)puts("any");
	}
}
2023/3/20 14:56
加载中...