Submission #415315

# Submission time Handle Problem Language Result Execution time Memory
415315 2021-05-31T21:25:58 Z CSQ31 Tropical Garden (IOI11_garden) C++14
69 / 100
370 ms 67308 KB
#include "garden.h"
#include <bits/stdc++.h>
#include "gardenlib.h"
using namespace std;
#define sz(a) (int)(a.size())
#define pb push_back
#define se second
typedef vector<vector<int>> vii;
typedef pair<int,int> pii;
const int MAXN = 4e5+5;
int nxt[MAXN][31];
vector<vector<pii>> g1(MAXN);
vii g2(MAXN);
void count_routes(int n, int m, int p, int r[][2], int q, int g[])
{
	for(int i=0;i<m;i++){
		g1[r[i][0]].pb({i,r[i][1]});
		g1[r[i][1]].pb({i,r[i][0]});
	}
	for(int i=0;i<n;i++)sort(g1[i].begin(),g1[i].end());
	for(int i=0;i<n;i++){
		int to = g1[i][0].se;
		if(g1[to][0].se != i){
			nxt[i][0] = to; //not beautiful
			g2[to].pb(i);
		}
		else {
			nxt[i][0] = to+n;
			g2[to+n].pb(i);
		}
		
		to = (sz(g1[i]) > 1)?g1[i][1].se:g1[i][0].se;
		if(g1[to][0].se != i){
			nxt[i+n][0] = to; //not beautiful
			g2[to].pb(i+n);
		}
		else {
			nxt[i+n][0] = to+n;
			g2[to+n].pb(i+n);
		}
	}
	for(int k=1;k<31;k++){
		for(int i=0;i<2*n;i++){
			nxt[i][k] = nxt[nxt[i][k-1]][k-1];
		}
		
	}	
	if(q == 1){
	  for(int i=0; i<q; i++) { 
		  int ans = 0;
		  for(int x=0;x<n;x++){
			  int cur = x;
			  int cnt = g[i];
			  for(int j=30;j>=0;j--){
				  if(cnt >= (1<<j)){
					  cur = nxt[cur][j];
					  cnt-=(1<<j);
				  }
			  }
			  if(cur == p || cur == p+n)ans++;
			  
		  } 
		  answer(ans);
	  }
	  return ;
	}
	vector<int>cycle(2*n),vis(2*n);
	int i = 0;
	while(!vis[i]){
		vis[i] = 1;
		i = nxt[i][0];
	}
	int len = 1;
	while(!cycle[i]){
		cycle[i] = len;
		len++;
		i = nxt[i][0];
	}
	len--;
	vii d(2,vector<int>(2*n,2e9));
	queue<int>qq;
	qq.push(p);
	d[0][p] = 0;
	vis.assign(2*n,0);
	vis[p] = 1;
	while(!qq.empty()){
		int v = qq.front();
		qq.pop();
		for(int x:g2[v]){
			if(vis[x])continue;
			vis[x] =1;
			d[0][x] = d[0][v]+1;
			qq.push(x);
		}
	}
	d[1][p+n] = 0;
	qq.push(p+n);
	vis.assign(2*n,0);
	vis[p+n] = 1;
	while(!qq.empty()){
		int v = qq.front();
		qq.pop();
		for(int x:g2[v]){
			if(vis[x])continue;
			vis[x] =1;
			d[1][x] = d[1][v]+1;
			qq.push(x);
		}
	}
	for(int i=0;i<q;i++){
		int ans = 0;
		for(int j=0;j<n;j++){
			bool ok = 0;
			if(!cycle[p]){
				if(d[0][j] == g[i])ok = 1;
			}else{
				int dd = d[0][j]; //their distance in the cycle
				if(g[i] >= dd && (g[i]-dd)%len == 0)ok = 1;
			}
			if(!cycle[p+n]){
				if(d[1][j] == g[i])ok = 1;
			}
			else{
				int dd = d[1][j]; //their distance in the cycle
				if(g[i] >= dd && (g[i]-dd)%len == 0)ok = 1;
				
			}
			
			ans+=ok;
		}
		answer(ans);
	}
}
# Verdict Execution time Memory Grader output
1 Correct 14 ms 19276 KB Output is correct
2 Correct 13 ms 19404 KB Output is correct
3 Correct 13 ms 19468 KB Output is correct
4 Correct 12 ms 19096 KB Output is correct
5 Correct 12 ms 19052 KB Output is correct
6 Correct 14 ms 19436 KB Output is correct
7 Correct 16 ms 19068 KB Output is correct
8 Correct 16 ms 19412 KB Output is correct
9 Correct 18 ms 19596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 19276 KB Output is correct
2 Correct 13 ms 19404 KB Output is correct
3 Correct 13 ms 19468 KB Output is correct
4 Correct 12 ms 19096 KB Output is correct
5 Correct 12 ms 19052 KB Output is correct
6 Correct 14 ms 19436 KB Output is correct
7 Correct 16 ms 19068 KB Output is correct
8 Correct 16 ms 19412 KB Output is correct
9 Correct 18 ms 19596 KB Output is correct
10 Correct 14 ms 19092 KB Output is correct
11 Correct 44 ms 26396 KB Output is correct
12 Correct 99 ms 31600 KB Output is correct
13 Correct 171 ms 48436 KB Output is correct
14 Correct 313 ms 62616 KB Output is correct
15 Correct 314 ms 63340 KB Output is correct
16 Correct 243 ms 50108 KB Output is correct
17 Correct 187 ms 45664 KB Output is correct
18 Correct 67 ms 31624 KB Output is correct
19 Correct 249 ms 62668 KB Output is correct
20 Correct 334 ms 63256 KB Output is correct
21 Correct 244 ms 49832 KB Output is correct
22 Correct 189 ms 45608 KB Output is correct
23 Correct 370 ms 67308 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 19276 KB Output is correct
2 Correct 13 ms 19404 KB Output is correct
3 Correct 13 ms 19468 KB Output is correct
4 Correct 12 ms 19096 KB Output is correct
5 Correct 12 ms 19052 KB Output is correct
6 Correct 14 ms 19436 KB Output is correct
7 Correct 16 ms 19068 KB Output is correct
8 Correct 16 ms 19412 KB Output is correct
9 Correct 18 ms 19596 KB Output is correct
10 Correct 14 ms 19092 KB Output is correct
11 Correct 44 ms 26396 KB Output is correct
12 Correct 99 ms 31600 KB Output is correct
13 Correct 171 ms 48436 KB Output is correct
14 Correct 313 ms 62616 KB Output is correct
15 Correct 314 ms 63340 KB Output is correct
16 Correct 243 ms 50108 KB Output is correct
17 Correct 187 ms 45664 KB Output is correct
18 Correct 67 ms 31624 KB Output is correct
19 Correct 249 ms 62668 KB Output is correct
20 Correct 334 ms 63256 KB Output is correct
21 Correct 244 ms 49832 KB Output is correct
22 Correct 189 ms 45608 KB Output is correct
23 Correct 370 ms 67308 KB Output is correct
24 Incorrect 16 ms 19168 KB Output isn't correct
25 Halted 0 ms 0 KB -