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
2017-04-07 16:07:25+0900
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
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