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

Submission Time
Task A - むこのどうぶつたち と しんりんのはかい (Innocent Animals and Destruction of Forests)
User fura2
Language IOI-Style C++ (GCC 5.4.1)
Score 100
Code Size 2745 Byte
Status AC
Exec Time 858 ms
Memory 20580 KB

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
AC × 19
AC × 11
AC × 16
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