Submission #967902

# Submission time Handle Problem Language Result Execution time Memory
967902 2024-04-23T04:55:56 Z 8pete8 Regions (IOI09_regions) C++17
3 / 100
8000 ms 109284 KB
#include<iostream>
#include<stack>
#include<map>
#include<vector>
#include<string>
#include<unordered_map>
#include <queue>
#include<cstring>
#include<limits.h>
#include <cassert>
#include<cmath>
#include<set>
#include<algorithm>
#include <iomanip>
#include<numeric> //gcd(a,b)
#include<bitset>
#include <cstdlib> 
#include <cstdint>
using namespace std;
#define ll long long
#define f first
//#define endl "\n"
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-loops")
using namespace std;
//#define int long long
//#define double long double
const int mod=1e9+7,mxn=2e5+5,lg=60,inf=1e9,minf=-1e9,mx=3e4;
int root=700,st;
vector<int>adj[mxn+10];
int re[mxn+10],recnt[mxn+10],sz[mxn+10],hvyp[mxn+10],up[mxn+10];
int tin[mxn+10],tout[mxn+10],T=0;
void getsz(int cur){sz[cur]=1;for(auto i:adj[cur])getsz(i),sz[cur]+=sz[i];}
void dfs(int cur,int hvypa){
	tin[cur]=++T;
	int hvy=0;
	hvyp[cur]=hvypa;
	for(auto i:adj[cur]){
		if(sz[i]>sz[hvy])hvy=i;
		up[i]=cur;
	}
	for(auto i:adj[cur])if(i!=hvy)dfs(i,i);
	if(hvy)dfs(hvy,hvypa);
	tout[cur]=T;
}
bool cmp(int a,int b){return tin[a]<tin[b];}
struct chain{
	vector<int>have,com;
	vector<vector<int>>pos;
	void init(){
		if(have.empty())return;
		for(auto i:have)com.pb(re[i]);
		sort(all(com));
		sort(all(have),cmp);
		com.erase(unique(all(com)),com.end());
		pos.resize(com.size());
		for(auto i:have)pos[lb(all(com),re[i])-com.begin()].pb(tin[i]);
		return;
	}
	int get(int x,int id){
		auto it=lb(all(com),id)-com.begin();
		if(it>=pos.size()||com[it]!=id)return 0;
		if(pos[it].empty())return 0;
		if(pos[it].back()<=x)return pos[it].size();
		else return upper_bound(all(pos[it]),x)-pos[it].begin();
	}
}t[mxn+10];//parent of hvy chain
vector<int>pos[mxn+10];
vector<int>have[mxn+10];
int pre[mx][500];
int32_t main(){
	fastio
	int n,r,q;cin>>n>>r>>q;	
	root=sqrt(n);
	for(int i=1;i<=n;i++){
		if(i!=1){
			int b;cin>>b;
			adj[b].pb(i);
		}
		cin>>re[i];
		recnt[re[i]]++;
		have[re[i]].pb(i);
	}
	getsz(1);
	dfs(1,1);
	for(int i=1;i<=n;i++)t[hvyp[i]].have.pb(i);
	for(int i=1;i<=n;i++)t[i].init(),pos[re[i]].pb(tin[i]);
	vector<int>k;
	for(int i=1;i<=r;i++){
		if(recnt[i]<root)continue;
		k.pb(i);
	}
	for(int i=1;i<=n;i++){
		int cur=i;
		while(hvyp[cur]!=1){
			for(int j=0;j<k.size();j++){
				pre[re[i]][j]+=t[hvyp[cur]].get(tin[cur],k[j]);
			}
			cur=up[hvyp[cur]];
		}
		for(int j=0;j<k.size();j++)pre[re[i]][j]+=t[hvyp[cur]].get(tin[cur],k[j]);
	}
	//qry r1,r2 cout<<pre[r2][pos r1];
	while(q--){
		int a,b;cin>>a>>b;
		if(recnt[a]<root||1){
			int ans=0;
			for(auto j:have[a]){
				int l=lb(all(pos[b]),tin[j])-pos[b].begin();
				if(l==pos[b].size())continue;
				int r=lb(all(pos[b]),tout[j])-pos[b].begin();
				if(r==pos[b].size())r--;
				ans+=(r-l+1);
			}
			cout<<ans<<endl;
		}
		else{
			auto it=lb(all(k),a)-k.begin();
			cout<<pre[b][it]<<endl;
		}
	}
}
/*
sqrt decomp
if region cnt<=sqrtn -> burte force sqrtn{
	do euler tour keep vector of pos in euler tour for each region
	when qry r1,r2 loop through all sqrtn node then qry in subtree of that node
	qry-> bs l,r in vector of r2; ans+=(r-l+1)
}
else we precompute the region to other region (keep sqrtn(r)){
	use merge sort tree +hld? (too costly?){
		dont need merge sort?
		keep chain then each chain keep vector of pos for each region
	}

}
*/

Compilation message

regions.cpp: In member function 'int chain::get(int, int)':
regions.cpp:72:8: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |   if(it>=pos.size()||com[it]!=id)return 0;
      |      ~~^~~~~~~~~~~~
regions.cpp: In function 'int32_t main()':
regions.cpp:106:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |    for(int j=0;j<k.size();j++){
      |                ~^~~~~~~~~
regions.cpp:111:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   for(int j=0;j<k.size();j++)pre[re[i]][j]+=t[hvyp[cur]].get(tin[cur],k[j]);
      |               ~^~~~~~~~~
regions.cpp:120:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |     if(l==pos[b].size())continue;
      |        ~^~~~~~~~~~~~~~~
regions.cpp:122:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |     if(r==pos[b].size())r--;
      |        ~^~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 8 ms 35160 KB Output isn't correct
2 Incorrect 8 ms 35160 KB Output isn't correct
3 Incorrect 9 ms 35160 KB Output isn't correct
4 Incorrect 10 ms 35160 KB Output isn't correct
5 Incorrect 10 ms 35164 KB Output isn't correct
6 Correct 19 ms 35164 KB Output is correct
7 Incorrect 24 ms 35168 KB Output isn't correct
8 Incorrect 23 ms 35424 KB Output isn't correct
9 Correct 31 ms 35680 KB Output is correct
10 Incorrect 53 ms 36164 KB Output isn't correct
11 Incorrect 76 ms 36704 KB Output isn't correct
12 Incorrect 92 ms 37212 KB Output isn't correct
13 Incorrect 122 ms 37964 KB Output isn't correct
14 Incorrect 179 ms 40672 KB Output isn't correct
15 Correct 229 ms 42316 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 8055 ms 43696 KB Time limit exceeded
2 Execution timed out 8028 ms 46416 KB Time limit exceeded
3 Execution timed out 8019 ms 45200 KB Time limit exceeded
4 Incorrect 172 ms 38656 KB Output isn't correct
5 Incorrect 260 ms 39388 KB Output isn't correct
6 Incorrect 940 ms 55468 KB Output isn't correct
7 Incorrect 1284 ms 63768 KB Output isn't correct
8 Incorrect 1331 ms 67204 KB Output isn't correct
9 Incorrect 1557 ms 51356 KB Output isn't correct
10 Incorrect 3737 ms 103556 KB Output isn't correct
11 Incorrect 2430 ms 60148 KB Output isn't correct
12 Incorrect 3562 ms 87148 KB Output isn't correct
13 Incorrect 4207 ms 88024 KB Output isn't correct
14 Incorrect 5766 ms 95844 KB Output isn't correct
15 Incorrect 6431 ms 104792 KB Output isn't correct
16 Incorrect 5571 ms 109284 KB Output isn't correct
17 Execution timed out 8064 ms 97864 KB Time limit exceeded