求卡常
查看原帖
求卡常
333855
int233楼主2023/7/29 17:46

RT

顺便问一下为啥一直在waiting

Code:

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
int n,m,x,y,las,lgs[100005],C[100005],blo2,D[200005],h[100005],vis[100005],ans[100005],Sl,Sr,blck[405],blo,dep[100005],fa[100005][25],Fi[100005],Se[100005],path[200005],r,a[100005],c[100005],qn;
vector<int> G[100005];
struct node{
	int u,v,l,r,k,lca,id;
}qry[100005];
int cmp(node x,node y){
	return (D[x.l]==D[y.l])?(x.r==y.r?0:((D[x.l])&1)^(x.r<y.r)):(x.l<y.l);;
}
void dfs(int x,int fat){
	fa[x][0]=fat;
	dep[x]=dep[fat]+1;
	path[++r]=x;
	for(int i=1;i<=lgs[dep[x]];i++){
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=0;i<G[x].size();i++){
		if(G[x][i]==fat){
			continue;
		}
		dfs(G[x][i],x);
	}
	path[++r]=x;
}
int LCA(int x,int y){
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	while(dep[y]>dep[x]){
		y=fa[y][lgs[dep[y]-dep[x]]];
	}
	if(x==y){
		return x;
	}
	for(int k=lgs[dep[x]];k>=0;k--){
		if(fa[x][k]!=fa[y][k]){
			x=fa[x][k];
			y=fa[y][k];
		}
	}
	return fa[x][0];
}
void modify(int x){
	if(!x){
		return ;
	}
	int pas=path[x],val;
	val=a[pas];
	if(vis[pas]){
		h[val]--;
		blck[C[val]]--;
	}
	else{
		h[val]++;
		blck[C[val]]++;
	}
	vis[pas]^=1;
}
void modify2(int pas){
	int val;
	val=a[pas];
	if(vis[pas]){
		h[val]--;
		blck[C[val]]--;
	}
	else{
		h[val]++;
		blck[C[val]]++;
	}
	vis[pas]^=1;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		c[i]=a[i];
	}
	for(int i=2;i<=n;i++){
		lgs[i]=lgs[i>>1]+1;
	}
	sort(c+1,c+n+1);
	qn=unique(c+1,c+n+1)-c-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(c+1,c+qn+1,a[i])-c;
	}
	for(int i=1;i<=n-1;i++){
		cin>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x); 
	}
	dfs(1,0);
	for(int i=1;i<=r;i++){
		Se[path[i]]=i;
	}
	for(int i=r;i>=1;i--){
		Fi[path[i]]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>qry[i].u>>qry[i].v>>qry[i].k;
		qry[i].id=i;
		if(Fi[qry[i].u]>Fi[qry[i].v]){
			swap(qry[i].u,qry[i].v);
		}
		qry[i].lca=LCA(qry[i].u,qry[i].v);
		if(qry[i].lca==qry[i].u){
			qry[i].lca=0;
			qry[i].l=Fi[qry[i].u];
			qry[i].r=Fi[qry[i].v];
		}
		else{
			qry[i].l=Se[qry[i].u];
			qry[i].r=Fi[qry[i].v];
		}
	}
	blo=int((double)r/(double)sqrt(m));
	blo2=int(sqrt(qn));
	for(int i=1;i<=r;i++){
		D[i]=i/blo;
	}
	sort(qry+1,qry+m+1,cmp);
	for(int i=1;i<=n;i++){
		C[i]=(i-1)/blo2+1;
	}
	for(int i=1;i<=m;i++){
		if(i==70000){
			cout<<"CODER"<<endl;
		}
		while(Sl<qry[i].l){
			modify(Sl++);
		}
		while(Sl>qry[i].l){
			modify(--Sl);
		}
		while(Sr<qry[i].r){
			modify(++Sr);
		}
		while(Sr>qry[i].r){
			modify(Sr--);
		}
		if(qry[i].lca){
			modify2(qry[i].lca);
			for(int ii=1;ii<=C[qn];ii++){
				if(blck[ii]<qry[i].k){
					qry[i].k-=blck[ii];
				}
				else{
					for(int jj=(ii-1)*blo2+1;jj<=ii*blo2;jj++){
						if(h[jj]<qry[i].k){
							qry[i].k-=h[jj];
						}
						else{
							ans[qry[i].id]=c[jj];
							break;
						}
					}
					break;
				}
			}
			modify2(qry[i].lca);
		}
		else{
			for(int ii=1;ii<=C[qn];ii++){
				if(blck[ii]<qry[i].k){
					qry[i].k-=blck[ii];
				}
				else{
					for(int jj=(ii-1)*blo2+1;jj<=min(ii*blo2,qn);jj++){
						if(h[jj]<qry[i].k){
							qry[i].k-=h[jj];
						}
						else{
							ans[qry[i].id]=c[jj];
							break;
						}
					}
					break;
				}
			}
		}
	}
	for(int i=1;i<=m;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
} 
2023/7/29 17:46
加载中...