关于昨晚CF E
  • 板块学术版
  • 楼主Hoks
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/5/26 14:40
  • 上次更新2024/5/26 16:20:33
查看原帖
关于昨晚CF E
551100
Hoks楼主2024/5/26 14:40

挂在 test 3 的第 100002 个回答上了。

求问还漏了什么?

我写的是:

  1. 同一深度的点不能超过两个。

  2. 有两个黑点儿子的仅能为 LCA。

  3. 所有黑点都是相邻的。

求 Hack/kk。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10,mod=1e9+7,V=1e9,INF=0x3f3f3f3f3f3f3f3f;
int T,n,q,a[N],Q[N],c[N],cs[N];
namespace Fast_IO
{
    static char buf[1000000],*paa=buf,*pd=buf,out[10000000];int length=0;
    #define getchar() paa==pd&&(pd=(paa=buf)+fread(buf,1,1000000,stdin),paa==pd)?EOF:*paa++
    inline int read()
    {
        int x(0),t(1);char fc(getchar());
        while(!isdigit(fc)){if(fc=='-') t=-1;fc=getchar();}
        while(isdigit(fc)) x=(x<<1)+(x<<3)+(fc^48),fc=getchar();
        return x*t;
    }
    inline void flush(){fwrite(out,1,length,stdout);length=0;}
    inline void put(char c){if(length==9999999) flush();out[length++]=c;}
    inline void put(string s){for(char c:s) put(c);}
    inline void print(int x)
    {
        if(x<0) put('-'),x=-x;
        if(x>9) print(x/10);
        put(x%10+'0');
    }
    inline bool chk(char c) { return !(c>='a'&&c<='z'||c>='A'&&c<='Z'||c>='0'&&c<='9'); }
    inline bool ck(char c) { return c!='\n'&&c!='\r'&&c!=-1&&c!=' '; }
    inline void rd(char s[],int&n)
    {
        s[++n]=getchar();
        while(chk(s[n])) s[n]=getchar();
        while(ck(s[n])) s[++n]=getchar();
        n--;
    }
}
using namespace Fast_IO;
namespace tree_decomposition
{
	int cnt;vector<int> e[N];
	int fa[N],son[N],si[N],dep[N];
	int top[N],id[N],dfn[N];
	inline void add(int u,int v) { e[u].emplace_back(v),e[v].emplace_back(u); }
	inline void dfs1(int u,int ff)
	{
		fa[u]=ff,si[u]=1,dep[u]=dep[ff]+1;
		for(auto v:e[u])
		{
			if(v==ff) continue;
			dfs1(v,u);
			si[u]+=si[v];
			if(si[son[u]]<si[v]) son[u]=v;
		}
	}
	inline void dfs2(int u,int topf)
	{
		top[u]=topf,dfn[u]=++cnt,id[cnt]=u;
		if(son[u]) dfs2(son[u],topf);
		for(auto v:e[u])
		{
			if(v==fa[u]||v==son[u]) continue;
			dfs2(v,v);
		}
	}
	inline int LCA(int x,int y)
	{
		while(top[x]!=top[y])
		{
			if(dep[top[x]]<dep[top[y]]) swap(x,y);
			x=fa[top[x]];
		}
		return dep[x]<dep[y]?x:y;
	}
}
using namespace tree_decomposition;
inline int dis(int x,int y){return dep[x]+dep[y]-2*dep[LCA(x,y)];}
signed main()
{
    T=read();
    while(T--)
    {
        n=read(),q=read();set<int>s,ss;cnt=0;int tot=0,tt=0,ans=0,gs=0,as=0;for(int i=1;i<=n;i++) a[i]=read();
        for(int i=1;i<=n;i++) e[i].clear(),son[i]=dfn[i]=id[i]=fa[i]=dep[i]=si[i]=c[i]=cs[i]=0;
		for(int i=1,u,v;i<n;i++) u=read(),v=read(),add(u,v);dfs1(1,0),dfs2(1,1);auto it=s.begin();
    	for(int i=1;i<=n;i++) if(a[i]) a[i]=0,Q[++tt]=i;as=tt;for(int i=1;i<=q;i++) Q[++tt]=read();
        for(int i=1,x,y,z,lca;i<=tt;i++)
        {
	        x=Q[i];x=dfn[x];int f=0;
        	if(!a[id[x]])
        	{
        		s.insert(x),tot++,c[dep[Q[i]]]++;
        		if(c[dep[Q[i]]]==3) gs++;cs[fa[Q[i]]]++;
        		if(cs[fa[Q[i]]]==2&&a[fa[Q[i]]]) ss.insert(fa[Q[i]]);
        		if(cs[Q[i]]==2) ss.insert(Q[i]);
        	}
        	else
        	{
        		if(c[dep[Q[i]]]==3) gs--;
        		if(cs[fa[Q[i]]]==2&&a[fa[Q[i]]]) ss.erase(fa[Q[i]]);
        		if(cs[Q[i]]==2) ss.erase(Q[i]);
        		tot--;c[dep[Q[i]]]--;cs[fa[Q[i]]]--;
        	}
	        y=id[(it=s.lower_bound(x))==s.begin()?*--s.end():*--it];
	        z=id[(it=s.upper_bound(x))==s.end()?*s.begin():*it];
	        if(a[id[x]]) s.erase(x);x=id[x];int d=dis(x,y)+dis(x,z)-dis(y,z);
	        if(!a[x]) a[x]=1,ans+=d;else a[x]=0,ans-=d;
        	if(s.size()>=2)
        	{
        		lca=LCA(id[*s.begin()],id[*--s.end()]);
        		if(ss.size()==1&&*ss.begin()==lca||!ss.size()) f=1;
        	}
        	if(i>as){if(ans/2==tot-1&&!gs&&f||tot==1) put("YES\n");else put("No\n");}
        }
    }
    genshin:;flush();return 0;
}
2024/5/26 14:40
加载中...