Submission #16834
Source Code Expand
#include"animals.h"
#include<set>
#include<vector>
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
struct interval{ int a,b; };
class Fenwick_tree_dual{
int n,a[200000];
public:
void build(int n){
this->n=n;
rep(i,n) a[i]=0;
}
void add(int i,int j,int v){
if(i==0){
for(;j>=0;j=(j&(j+1))-1) a[j]+=v;
return;
}
add(0,j,v);
add(0,i-1,-v);
}
int sum(int i){
int s=0;
for(;i<n;i|=i+1) s+=a[i];
return s;
}
};
struct segment_tree{
int n,seg[1<<19];
void build(int N){
for(n=1;n<N;n*=2);
}
int query(int v){
v+=n;
int res=seg[v];
for(;v/=2;) res=max(res,seg[v]);
return res;
}
void update_max(int l,int r,int val,int a,int b,int u){
if(l<=a && b<=r){ seg[u]=max(seg[u],val); return; }
int c=(a+b)/2;
if(l<c && a<r) update_max(l,r,val,a,c,2*u+0);
if(l<b && c<r) update_max(l,r,val,c,b,2*u+1);
}
void update_max(int l,int r,int val){ update_max(l,r+1,val,0,n,1); }
};
int n,par[100000]; // par[u] := ( 頂点 u の親 )
vector<int> G[100000];
int n_ord,inv[200000]; // inv[i] := ( うれしい順序における i 番目はどの頂点か )
interval I[100000]; // I[u] := ( うれしい順序において、頂点 u の部分木に相当する区間 )
Fenwick_tree_dual size; // 各頂点を根とする部分木のサイズ
bool del[100000]; // del[u] := ( 頂点 u が削除されたかどうか )
segment_tree root; // 各頂点が属する木の根
multiset<int> ans;
int dfs(int u,int pre){
par[u]=pre;
int tmp=n_ord;
I[u].a=n_ord;
inv[n_ord++]=u;
int sz=1;
rep(i,G[u].size()){
int v=G[u][i];
if(v!=pre) sz+=dfs(v,u);
}
I[u].b=n_ord++;
size.add(tmp,tmp,sz);
return sz;
}
void init(int n,int E[][2]){
::n=n;
rep(i,n-1){
int u=E[i][0],v=E[i][1];
G[u].push_back(v);
G[v].push_back(u);
}
size.build(2*n);
root.build(2*n);
dfs(0,-1);
ans.insert(n);
}
int query(int v){
int r=inv[root.query(I[v].a)];
if(v==r){
// v に対する処理
int sz=size.sum(I[r].a)-size.sum(I[r].b); // r を部分木とする頂点のサイズ
ans.erase(ans.find(sz));
}
else{
// v から r へ至るパス上の頂点に対する処理
int sz1=size.sum(I[r].a)-size.sum(I[r].b);
int sz2=size.sum(I[v].a)-size.sum(I[v].b);
ans.erase(ans.find(sz1));
ans.insert(sz1-sz2);
size.add(I[r].a,I[v].a,-sz2);
}
// v の子孫に対する処理
rep(i,G[v].size()){
int u=G[v][i];
if(u==par[v] || del[u]) continue;
int sz=size.sum(I[u].a)-size.sum(I[u].b); // u を部分木とする頂点のサイズ
ans.insert(sz);
root.update_max(I[u].a,I[u].b,I[u].a);
}
del[v]=true;
return *ans.rbegin();
}
Submission Info
Compile Error
./grader.cpp: In function ‘int main()’:
./grader.cpp:15: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
./grader.cpp:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
./grader.cpp:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
Judge Result
Set Name |
Subtask1 |
Subtask2 |
Subtask3 |
Score / Max Score |
20 / 20 |
25 / 25 |
55 / 55 |
Status |
|
|
|
Set Name |
Test Cases |
Subtask1 |
subtask1/1, subtask1/10, subtask1/11, subtask1/12, subtask1/13, subtask1/14, subtask1/15, subtask1/16, subtask1/17, subtask1/18, subtask1/19, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask1/8, subtask1/9 |
Subtask2 |
subtask2/1, subtask2/10, subtask2/11, subtask2/2, subtask2/3, subtask2/4, subtask2/5, subtask2/6, subtask2/7, subtask2/8, subtask2/9 |
Subtask3 |
subtask3/1, subtask3/10, subtask3/11, subtask3/12, subtask3/13, subtask3/14, subtask3/15, subtask3/16, subtask3/2, subtask3/3, subtask3/4, subtask3/5, subtask3/6, subtask3/7, subtask3/8, subtask3/9 |
Case Name |
Status |
Exec Time |
Memory |
subtask1/1 |
AC |
29 ms |
3300 KB |
subtask1/10 |
AC |
33 ms |
3504 KB |
subtask1/11 |
AC |
32 ms |
3488 KB |
subtask1/12 |
AC |
30 ms |
3320 KB |
subtask1/13 |
AC |
33 ms |
3500 KB |
subtask1/14 |
AC |
34 ms |
3368 KB |
subtask1/15 |
AC |
33 ms |
3496 KB |
subtask1/16 |
AC |
34 ms |
3520 KB |
subtask1/17 |
AC |
33 ms |
3504 KB |
subtask1/18 |
AC |
33 ms |
3492 KB |
subtask1/19 |
AC |
33 ms |
3432 KB |
subtask1/2 |
AC |
27 ms |
3364 KB |
subtask1/3 |
AC |
27 ms |
3372 KB |
subtask1/4 |
AC |
27 ms |
3240 KB |
subtask1/5 |
AC |
28 ms |
3372 KB |
subtask1/6 |
AC |
28 ms |
3316 KB |
subtask1/7 |
AC |
28 ms |
3312 KB |
subtask1/8 |
AC |
28 ms |
3348 KB |
subtask1/9 |
AC |
30 ms |
3372 KB |
subtask2/1 |
AC |
27 ms |
3372 KB |
subtask2/10 |
AC |
782 ms |
20528 KB |
subtask2/11 |
AC |
651 ms |
19632 KB |
subtask2/2 |
AC |
27 ms |
3368 KB |
subtask2/3 |
AC |
28 ms |
3376 KB |
subtask2/4 |
AC |
33 ms |
3372 KB |
subtask2/5 |
AC |
90 ms |
5040 KB |
subtask2/6 |
AC |
398 ms |
11948 KB |
subtask2/7 |
AC |
849 ms |
20580 KB |
subtask2/8 |
AC |
825 ms |
20516 KB |
subtask2/9 |
AC |
802 ms |
20548 KB |
subtask3/1 |
AC |
34 ms |
3504 KB |
subtask3/10 |
AC |
661 ms |
19632 KB |
subtask3/11 |
AC |
826 ms |
13348 KB |
subtask3/12 |
AC |
828 ms |
13340 KB |
subtask3/13 |
AC |
839 ms |
13368 KB |
subtask3/14 |
AC |
774 ms |
13388 KB |
subtask3/15 |
AC |
858 ms |
13348 KB |
subtask3/16 |
AC |
844 ms |
13272 KB |
subtask3/2 |
AC |
32 ms |
3488 KB |
subtask3/3 |
AC |
34 ms |
3500 KB |
subtask3/4 |
AC |
32 ms |
3432 KB |
subtask3/5 |
AC |
33 ms |
3428 KB |
subtask3/6 |
AC |
833 ms |
20504 KB |
subtask3/7 |
AC |
789 ms |
20520 KB |
subtask3/8 |
AC |
681 ms |
15656 KB |
subtask3/9 |
AC |
654 ms |
11660 KB |