码迷,mamicode.com
首页 > 其他好文 > 详细

Peaks未完成 以后再调吧

时间:2016-02-29 23:14:10      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define for1(i,a,n) for(int i=(a);i<=(n);i++)
#define for2(i,a,n) for(int i=(a);i<(n);i++)
#define for3(i,a,n) for(int i=(a);i>=(n);i--)
#define for4(i,a,n) for(int i=(a);i>(n);i--)
#define CC(i,a) memset(i,a,sizeof(i));
#define read(x) x=getint()
using namespace std;
inline const int getint(){char c=getchar();int k=1,r=0;for(;c<‘0‘||c>‘9‘;c=getchar())if(c==‘-‘)k=-1;for(;c>=‘0‘&&c<=‘9‘;c=getchar())r=r*10+c-‘0‘;return k*r;}
inline const int max(const int &a,const int &b){return a>b?a:b;}
inline const int min(const int &a,const int &b){return a<b?a:b;}
const int N=1E5+10;
const int M=5*1E5+10;
struct node{int x,y,z;}E[M];
struct snnn{int l,r,s;}T[N*300];
int n,m,fa[N<<1],num[N<<1],HH[N],id[N],H[N],cnt,f[N<<1][17];
int root[N],L[N<<1],R[N<<1],lch[N<<1],rch[N<<1],ST[N];
inline bool cmp(node X,node Y){return X.z<Y.z;}
inline bool cmp2(int X,int Y){return HH[X]<HH[Y];}
inline void init(){CC(fa,0);CC(num,0);CC(HH,0);CC(id,0);CC(H,0);CC(f,0);CC(root,0);CC(L,0);CC(R,0);CC(lch,0);CC(rch,0);CC(ST,0);}
inline int find(int x){
	if (x==fa[x]) return x;
	else{fa[x]=find(fa[x]);return fa[x];}
}
inline void LCA(){
	for1(j,1,16)
		for1(i,1,N)
			if (f[f[i][j-1]][j-1]!=0) f[i][j]=f[f[i][j-1]][j-1];
}
inline void dfs(int x){
	if (lch[x]&&rch[x]){
		L[x]=cnt+1;
		dfs(lch[x]);
		dfs(rch[x]);
		R[x]=cnt;
	}else{
		cnt++; ST[cnt]=x;
		L[x]=cnt; R[x]=cnt;
	}
}
inline void update(int l,int r,int &pos,int key){
	T[++cnt]=T[pos]; pos=cnt; T[pos].s++;
	if (l==r) return;
	int mid=(l+r)>>1;
	if (key<=mid) update(l,mid,T[pos].l,key); else update(mid+1,r,T[pos].r,key);
}
inline int LCA_find(int x,int y){
	for3(i,16,0)
	 if ((f[x][i]!=0)&&(num[f[x][i]]<=y))
	  x=f[x][i];
	return x;
}
inline int query(int LL,int RR,int key){
	int mid,s,x=root[LL],y=root[RR],l=1,r=n;
	while (l<r){
		mid=(l+r)>>1; s=T[T[y].l].s-T[T[x].l].s;
		if (key<=s) r=mid,x=T[x].l,y=T[y].l;
		else l=mid+1,key-=s,x=T[x].r,y=T[y].r;
	}return l;
}
int main(){
	/**/freopen("a2.in","r",stdin);
	freopen("a.out","w",stdout);
	read(n);/**/
	init();
	read(n); read(m); int Q; read(Q);
	for1(i,1,n) read(HH[i]),id[i]=i;
	sort(id+1,id+n+1,cmp2);
	for1(i,1,n) H[id[i]]=i;
	for1(i,1,m){read(E[i].x);read(E[i].y);read(E[i].z);}
	sort(E+1,E+m+1,cmp);
	cnt=n+1;
	for2(i,1,n<<1) fa[i]=i;
	for1(i,1,m){
		int fx=find(E[i].x),fy=find(E[i].y);
		if (fx!=fy){
			fa[fx]=cnt; fa[fy]=cnt;
			f[fx][0]=cnt; f[fy][0]=cnt;
			lch[cnt]=fx; rch[cnt]=fy;
			num[cnt]=E[i].z;
			cnt++;
			if (cnt>((n<<1)-1)) break;
		}
	}
	LCA();
	cnt=0;
	for1(i,1,n) if (L[i]==0) dfs(find(i));
	cnt=0;
	for1(i,1,n){
		root[i]=root[i-1];
		update(1,n,root[i],H[ST[i]]);
	}
	//for1(i,n,n*2-1) printf("%d %d\n",L[i],R[i]);
	int a,b,c,la=0;
	for1(i,1,Q){
		read(a); read(b); read(c);
		//a^=la; b^=la; c^=la;
		int rt=LCA_find(a,b),nn;
		if (R[rt]-L[rt]+1<c) nn=-1;
		else nn=HH[id[query(L[rt]-1,R[rt],R[rt]-L[rt]+2-c)]],la=nn;
		printf("%d\n",nn);
	}return 0;
}

  

Peaks未完成 以后再调吧

标签:

原文地址:http://www.cnblogs.com/abclzr/p/5229095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!