Submission #1205651


Source Code Expand

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
using namespace std;
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){return o<<"("<<p.fs<<","<<p.sc<<")";}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){o<<"sz = "<<vc.size()<<endl<<"[";for(const T& v:vc) o<<v<<",";o<<"]";return o;}

int N;
const int MN=400000;
string s;

using Data = pair<int,int>;
using SubData = pair<int,int>; //depth,has1

vector<int> G[MN];
int par[MN];
Data dp[MN];			//0-rooted dp[v]=term(merge(dp[u1],dp[u2],...))
SubData dp_nottermed[MN];	//0-rooted merge(dp[u1],...)
Data up[MN];			//up[v]= 0-rootedでのvの親をpとして, v->p方向のdpの値 term(merge(up[p],dp[v's bro1],dp[v's bro1],...))
Data DP[MN];			//DP[v]: ans for v-rooted tree
vector<SubData> ls,rs;		//ls/rs[i] = 0-rootedで見てvのchildrenを左/右からi個mergeしたもの(各vで使い回す)
SubData init(0,0);

SubData merge(SubData val,Data v){
	return SubData(max(val.fs,v.fs+1),max(val.sc,v.sc));
}
SubData merge2(SubData x,SubData y){
	return SubData(max(x.fs,y.fs),max(x.sc,y.sc));
}
Data term(SubData val,int v){
	return Data(val.fs,val.sc|(s[v]=='1'));
}
void dfs(int v,int p=-1){
	par[v]=p;
	SubData val=init;
	for(int u:G[v]) if(u!=p){
		dfs(u,v);
		val=merge(val,dp[u]);
	}
	dp_nottermed[v]=val;
	dp[v]=term(val,v);
//	cout<<"dp["<<v<<"]="<<dp[v]<<endl;
}
void ufs(int v,int p=-1){		//0-rootedでupwardな部分を計算
	vector<int> ch;	//children
	for(int u:G[v]) if(u!=p) ch.pb(u);
	int K=ch.size();
	ls.resize(K+1);
	rs.resize(K+1);
	ls[0]=init;
	rs[0]=init;
	rep(i,K){
		ls[i+1]=merge(ls[i],dp[ch[i]]);
		rs[i+1]=merge(rs[i],dp[ch[K-1-i]]);
	}
//	if(p==-1) rep1(i,K) show(ls[i]),show(rs[i]);
	rep(i,K){
		int u=ch[i];
		SubData val=merge2(ls[i],rs[K-1-i]);
		if(p>=0) val=merge(val,up[v]);
		up[u]=term(val,v);
//		cout<<"up["<<u<<"]="<<up[u]<<endl;
	}
	rep(i,K) ufs(ch[i],v);
}
void calcDP(int N,int r=0){
	dfs(r);
//	up[r]=e			//Dataの単位元(≠init)が必要で面倒なので回避
	ufs(r);
	rep(v,N){
		SubData val=dp_nottermed[v];
		if(v!=r) val=merge(val,up[v]);
		DP[v]=term(val,v);
	}
}
int inf = 1e9;
int main(){
	int N;
	cin>>N;
	rep(i,N-1){
		int e = N+i;
		int x,y;
		scanf("%d %d",&x,&y);
		x--,y--;
		G[x].pb(e);G[e].pb(x);
		G[y].pb(e);G[e].pb(y);
	}
	cin>>s;
	s+=string(N-1,'0');
	calcDP(2*N-1);
	long long ans=0;

	rep(r,2*N-1){
		int mx=-inf,mx2=-inf;
		int hasmin=inf;
		for(int u:G[r]){
			Data p = (u==par[r]?up[r]:dp[u]);
			int d = p.fs+1;
			int has = p.sc;
//			printf("%d->%d  d=%d\n",r,u,d);
			if(has) chmin(hasmin,d);
			if(mx<d){
				mx2=mx;
				mx=d;
			}else if(mx2<d){
				mx2=d;
			}
		}
		int tmp=0;
		if(r<N){	//vertex
			if(mx2==-inf) mx2=0;
//			show(hasmin);
			assert(mx2%2==0);
			assert(hasmin%2==0);
			int x = mx2/2;
//			show(x);
			int y = hasmin/2;
			if(s[r]=='1') y=0;
			tmp=max(0,x-y+1);
		}else{
			assert(mx2!=-inf);
			assert(mx2%2==1);
			assert(hasmin%2==1);
			int x = mx2/2;
			int y = hasmin/2;
			tmp=max(0,x-y+1);
		}
//		printf("v=%d;  +=%d\n",r,tmp);
		ans+=tmp;
	}
	cout<<ans<<endl;
}

Submission Info

Submission Time
Task F - Black Radius
User sigma425
Language C++14 (GCC 5.4.1)
Score 1900
Code Size 3483 Byte
Status AC
Exec Time 339 ms
Memory 108028 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:90:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&x,&y);
                       ^

Judge Result

Set Name Sample Subtask All
Score / Max Score 0 / 0 1300 / 1300 600 / 600
Status
AC × 3
AC × 31
AC × 81
Set Name Test Cases
Sample 0_00.txt, 0_01.txt, 0_02.txt
Subtask 0_01.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt
All 0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt, 2_00.txt, 2_01.txt, 2_02.txt, 2_03.txt, 2_04.txt, 2_05.txt, 2_06.txt, 2_07.txt, 2_08.txt, 2_09.txt, 2_10.txt, 2_11.txt, 2_12.txt, 2_13.txt, 2_14.txt, 2_15.txt, 2_16.txt, 2_17.txt, 2_18.txt, 2_19.txt, 2_20.txt, 2_21.txt, 2_22.txt, 2_23.txt, 2_24.txt, 2_25.txt, 2_26.txt, 2_27.txt, 2_28.txt, 2_29.txt, 2_30.txt, 2_31.txt, 2_32.txt, 2_33.txt, 2_34.txt, 2_35.txt, 2_36.txt, 2_37.txt, 2_38.txt, 2_39.txt, 2_40.txt, 2_41.txt, 2_42.txt, 2_43.txt, 2_44.txt, 2_45.txt, 2_46.txt, 2_47.txt
Case Name Status Exec Time Memory
0_00.txt AC 6 ms 17536 KB
0_01.txt AC 6 ms 17536 KB
0_02.txt AC 6 ms 17536 KB
1_00.txt AC 6 ms 17536 KB
1_01.txt AC 335 ms 108028 KB
1_02.txt AC 315 ms 82684 KB
1_03.txt AC 263 ms 37116 KB
1_04.txt AC 224 ms 38700 KB
1_05.txt AC 180 ms 41700 KB
1_06.txt AC 245 ms 36984 KB
1_07.txt AC 258 ms 37116 KB
1_08.txt AC 258 ms 42744 KB
1_09.txt AC 306 ms 72444 KB
1_10.txt AC 296 ms 67204 KB
1_11.txt AC 327 ms 107516 KB
1_12.txt AC 275 ms 53380 KB
1_13.txt AC 298 ms 69624 KB
1_14.txt AC 265 ms 50940 KB
1_15.txt AC 249 ms 44284 KB
1_16.txt AC 285 ms 56444 KB
1_17.txt AC 312 ms 64764 KB
1_18.txt AC 274 ms 36860 KB
1_19.txt AC 243 ms 36860 KB
1_20.txt AC 251 ms 37380 KB
1_21.txt AC 249 ms 41596 KB
1_22.txt AC 257 ms 38020 KB
1_23.txt AC 236 ms 37840 KB
1_24.txt AC 282 ms 42108 KB
1_25.txt AC 250 ms 49172 KB
1_26.txt AC 226 ms 37144 KB
1_27.txt AC 220 ms 38612 KB
1_28.txt AC 207 ms 41276 KB
1_29.txt AC 257 ms 53852 KB
2_00.txt AC 6 ms 17536 KB
2_01.txt AC 324 ms 105084 KB
2_02.txt AC 331 ms 94076 KB
2_03.txt AC 339 ms 90492 KB
2_04.txt AC 328 ms 71164 KB
2_05.txt AC 310 ms 72188 KB
2_06.txt AC 318 ms 77436 KB
2_07.txt AC 275 ms 36988 KB
2_08.txt AC 251 ms 36988 KB
2_09.txt AC 261 ms 36988 KB
2_10.txt AC 219 ms 38700 KB
2_11.txt AC 227 ms 38700 KB
2_12.txt AC 246 ms 38700 KB
2_13.txt AC 178 ms 41700 KB
2_14.txt AC 182 ms 41700 KB
2_15.txt AC 181 ms 41700 KB
2_16.txt AC 245 ms 36988 KB
2_17.txt AC 248 ms 36988 KB
2_18.txt AC 242 ms 36988 KB
2_19.txt AC 239 ms 37112 KB
2_20.txt AC 263 ms 37116 KB
2_21.txt AC 246 ms 37116 KB
2_22.txt AC 255 ms 42108 KB
2_23.txt AC 269 ms 45564 KB
2_24.txt AC 272 ms 44412 KB
2_25.txt AC 316 ms 74872 KB
2_26.txt AC 319 ms 67708 KB
2_27.txt AC 302 ms 74620 KB
2_28.txt AC 283 ms 64252 KB
2_29.txt AC 323 ms 96508 KB
2_30.txt AC 296 ms 86396 KB
2_31.txt AC 294 ms 65148 KB
2_32.txt AC 253 ms 38908 KB
2_33.txt AC 272 ms 51836 KB
2_34.txt AC 276 ms 62852 KB
2_35.txt AC 313 ms 79748 KB
2_36.txt AC 254 ms 36732 KB
2_37.txt AC 246 ms 36988 KB
2_38.txt AC 250 ms 42848 KB
2_39.txt AC 272 ms 38012 KB
2_40.txt AC 233 ms 38052 KB
2_41.txt AC 233 ms 37372 KB
2_42.txt AC 217 ms 38464 KB
2_43.txt AC 306 ms 68984 KB
2_44.txt AC 231 ms 38584 KB
2_45.txt AC 204 ms 40956 KB
2_46.txt AC 223 ms 42116 KB
2_47.txt AC 258 ms 58248 KB