Submission #1358436

#TimeUsernameProblemLanguageResultExecution timeMemory
1358436akqxolotlTropical Garden (IOI11_garden)C++20
0 / 100
1 ms1348 KiB
#include "garden.h"
#include "gardenlib.h"
//Segment Tree is a State of Mind
#pragma GCC optimize("O2,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cerr<<#x<<" is "<<x<<endl;
#define debugp(x,y) cerr<<#x<<' '<<#y<<" is "<<x<<' '<<y<<endl;
#define debugl(x) cerr<<#x<<" is ";for(auto p:x)cerr<<p<<" ";cerr<<endl;
#define debugpl(x) cerr<<#x<<" is ";for(auto p:x)cerr<<p.first<<" "<<p.second<<" , ";cerr<<endl;

#define int long long
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef pair<int,pii> ipii;
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define rdint(x,y) rnd()%(y-x+1)+x

const int inf=4e18+5;
const int mod=1e9+7;
const int mod2=998244353;
const int mod3=1e9+9;
const int maxn=2e5+5;

pii p[maxn][2][33];
bool vp0[maxn][2][33];
bool vp1[maxn][2][33];
int d0[maxn],d1[maxn];
int n,m,r;
bool dbg=0;

void dcmp(){
	vp0[r][0][0]=1;//find highest to go before crossing this edge
	vp1[r][1][0]=1;
	vp0[r][1][0]=1;
	//vp1[r][0][0]=1;
	for(int k=1;k<33;k++){
		for(int i=1;i<=n;i++){
			p[i][0][k]=p[p[i][0][k-1].fi][p[i][0][k-1].se][k-1];
			p[i][1][k]=p[p[i][1][k-1].fi][p[i][1][k-1].se][k-1];
			vp0[i][0][k]=vp0[i][0][k-1]+vp0[p[i][0][k-1].fi][p[i][0][k-1].se][k-1];
			vp1[i][0][k]=vp1[i][0][k-1]||vp1[p[i][0][k-1].fi][p[i][0][k-1].se][k-1];
			vp0[i][1][k]=vp0[i][1][k-1]+vp0[p[i][1][k-1].fi][p[i][1][k-1].se][k-1];
			vp1[i][1][k]=vp1[i][1][k-1]||vp1[p[i][1][k-1].fi][p[i][1][k-1].se][k-1];
		}
	}
}

int bsta(int x,int y){
	int ans=0;
	for(int k=32;k>=0;k--){
		if(vp0[x][y][k]==0){
			pii t=p[x][y][k];
			//if(t.fi==0)debug(x)
			x=t.fi;
			y=t.se;
			ans+=(1<<k);
			//if(dbg)debug(x)
		}
	}
	return ans;
}

int bsta2(int x,int y){
	int ans=0;
	for(int k=32;k>=0;k--){
		if(vp1[x][y][k]==0){
			pii t=p[x][y][k];
			x=t.fi;
			y=t.se;
			ans+=(1<<k);
		}
	}
	return ans;
}

pii kpar(int x,int y,int k){
	for(int i=0;i<33;i++){
		if((1LL<<i)&k){
			pii t=p[x][y][i];
			x=t.fi;
			y=t.se;
			//debug(x)
		}
	}
	return {x,y};
}

void count_routes(signed N, signed M, signed P, signed R[][2], signed Q, signed G[]){
	n=N,m=M,r=P+1;
	for(int i=0;i<m;i++){
		R[i][0]++,R[i][1]++;
		//debug(R[i][0])
		bool b=0;
		if(p[R[i][0]][0][0].fi==0){
		
			b=1;
			if(p[R[i][1]][0][0].fi==0)p[R[i][0]][0][0]={R[i][1],1};//best edge
			else p[R[i][0]][0][0]={R[i][1],0};
		
		}else if(p[R[i][0]][1][0].fi==0){
		
			if(p[R[i][1]][0][0].fi==0)p[R[i][0]][1][0]={R[i][1],1};
			else p[R[i][0]][1][0]={R[i][1],0};
			
		}
		
		if(p[R[i][1]][0][0].fi==0){
			p[R[i][1]][0][0].fi=R[i][0];
			if(b)p[R[i][1]][0][0].se=1;
			else p[R[i][1]][0][0].se=0;
		}else if(p[R[i][1]][1][0].fi==0){
			p[R[i][1]][1][0].fi=R[i][0];
			if(b)p[R[i][1]][1][0].se=1;
			else p[R[i][1]][1][0].se=0;
		}
	}
	for(int i=1;i<=n;i++){
		if(p[i][1][0].fi==0)p[i][1][0]=p[i][0][0];
	}
	dcmp();
	
	//for(int i=1;i<=n;i++)debug(vp0[i][0][1])
	//for(int i=0;i<=3;i++)debug(vp0[2][0][i])
	//vector<pii> v0,v1;
	
	for(int i=1;i<=n;i++){
		d0[i]=bsta(i,0);
		//debug(1)
		d1[i]=bsta2(i,0);
		//debug(2)
	}
	
	int oc=bsta2(p[r][1][0].fi,p[r][1][0].se)+1;
	dbg=1;
	//debug(1)
	int zc=bsta(p[r][0][0].fi,p[r][0][0].se)+1;
	//debug(1)
	//debug(3)
	//debugp(zc,oc)
	pii q[Q];
	for(int i=0;i<Q;i++){
		q[i]={G[i],i};
	}
	sort(q,q+Q);
	
	//for(int i=1;i<=n;i++)debug(d1[i])
	
	sort(d0+1,d0+n+1);
	sort(d1+1,d1+n+1);
	map<int,int> m0,m1;
	int ans[Q];
	memset(ans,0,sizeof(ans));
	int p1=0,p0=0;
	for(auto [k,qi]:q){
		while(p0<n&&d0[p0]<=k){
			m0[d0[p0]%zc]++;
			p0++;
		}
		while(p1<n&&d1[p1]<=k){
			m1[d1[p1]%oc]++;
			p1++;
		}
		//debugpl(m0)debugpl(m1)
		ans[qi]=m0[k%zc]+m1[k%oc];
	}
	
	for(auto i:ans)answer(i);
	
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...