Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33812 LYLAKIOI 【S】T4 C++ 运行出错 0 46 MS 14476 KB 3298 2024-10-22 21:10:59

Tests(0/10):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,dep[maxn],dfn[maxn],siz[maxn],rnk[maxn],ct; int f[maxn],g[maxn],h[maxn]; string S; vector<int>v[maxn]; struct SegTree { struct nd { int lz,mx,mn; }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define lz(p) d[p].lz #define mx(p) d[p].mx #define mn(p) d[p].mn void pu(int p){mx(p)=max(mx(ls(p)),mx(rs(p))),mn(p)=min(mn(ls(p)),mn(rs(p)));} void cl(int p,int x){lz(p)+=x,mx(p)+=x;} void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=0;} void bd(int l,int r,int p){ if(l==r){ int x=rnk[l]; mx(p)=dep[x]; mn(p)=1e9;if(S[x]=='1')mn(p)=dep[x];return; }int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p));pu(p); } void modify(int l,int r,int s,int t,int p,int x){if(l>r)return; if(l<=s&&t<=r){cl(p,x);return;}pd(p); int mid=s+t>>1; if(l<=mid)modify(l,r,s,mid,ls(p),x);if(r>=mid+1)modify(l,r,mid+1,t,rs(p),x);pu(p); }int qry(int l,int r,int s,int t,int p){if(l>r)return -1e9; if(l<=s&&t<=r)return mx(p);pd(p); int mid=s+t>>1,mx=0; if(l<=mid)mx=max(mx,qry(l,r,s,mid,ls(p)));if(r>=mid+1)mx=max(mx,qry(l,r,mid+1,t,rs(p))); return mx; }int qmn(int l,int r,int s,int t,int p){if(l>r)return 1e9; if(l<=s&&t<=r)return mn(p);pd(p); int mid=s+t>>1,mn=1e9; if(l<=mid)mn=min(mn,qmn(l,r,s,mid,ls(p)));if(r>=mid+1)mn=min(mn,qmn(l,r,mid+1,t,rs(p))); return mn; } }T; void dfs(int u,int fa){ dfn[u]=++ct,rnk[ct]=u,siz[u]=1; for(int x:v[u])if(x!=fa)dep[x]=dep[u]+1,dfs(x,u),siz[u]+=siz[x]; } void dfs2(int u,int fa){ vector<int>S; for(int x:v[u]){ if(x^fa)S.p_b(T.qry(dfn[x],dfn[x]+siz[x]-1,1,n,1)); else S.p_b(max(T.qry(1,dfn[u]-1,1,n,1),T.qry(dfn[u]+siz[u],n,1,n,1))); } sort(S.begin(),S.end(),greater<int>()); f[u]=S[0];if(S.size()>1)g[u]=S[1]; h[u]=T.qmn(dfn[u],dfn[u]+siz[u]-1,1,n,1)-dep[u]; //printf("%d f:%d g:%d h:%d\n",u,f[u],g[u],h[u]); for(int x:v[u])if(x^fa){ T.modify(1,dfn[x]-1,1,n,1,1); T.modify(dfn[x]+siz[x],n,1,n,1,1); T.modify(dfn[x],dfn[x]+siz[x]-1,1,n,1,-1); dfs2(x,u); T.modify(1,dfn[x]-1,1,n,1,-1); T.modify(dfn[x]+siz[x],n,1,n,1,-1); T.modify(dfn[x],dfn[x]+siz[x]-1,1,n,1,1); } } void slv(){ n=read(); up(i,1,n-1){ int x=read(),y=read(); v[x].p_b(y),v[y].p_b(x); }cin>>S;S=" "+S; dfs(1,0);T.bd(1,n,1);dfs2(1,0); ll res=1; up(i,1,n)res+=max(min(g[i]+1,f[i]-1)-h[i]+1,0); cout<<res; }int main(){ //freopen("apple.in","r",stdin); //freopen("apple.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }


测评信息: