社区讨论

求找不同

P4197[ONTAK2010] Peaks参与者 4已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mi775kxq
此快照首次捕获于
2025/11/20 16:56
3 个月前
此快照最后确认于
2025/11/20 23:59
3 个月前
查看原帖
下面第一份代码是我新写的,得了25pts;第二份代码是从加强版复制过来改的,AC了。有人能帮忙找一找这两份代码有什么不一样吗 qwq。
第一份:
CPP
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) x=x*10+(c-'0'),c=getchar();
	return x;
}
struct node{
	int x,y,z;
}b[1000005];
bool cmp(node a,node b){
	return a.z<b.z;
}
int n,a[1000005],m,q,x,y,z,j;
map<int,int> ma,rma;
int fat[1000005],topp;
int Findf(int k){
	if(fat[k]==k) return k;
	return fat[k]=Findf(fat[k]);
}
int l[1000005],r[1000005],c[1000005],rr;
void build(){
	sort(b+1,b+1+m,cmp);
	for(int i=1;i<=n;i++) fat[i]=++topp;
	for(int i=1;i<=m;i++){
		int x=Findf(b[i].x),y=Findf(b[i].y);	
		if(x==y) continue;
		++topp,fat[topp]=fat[x]=fat[y]=topp;
		l[topp]=x,r[topp]=y,c[topp]=b[i].z;
	}
	rr=Findf(1);
}
int rt[1000005],ls[8000005],rs[8000005],f[8000005],top;
int update(int rot,int l,int r,int k){
	int root=++top,mid=(l+r)>>1;
	f[root]=f[rot],ls[root]=ls[rot],rs[root]=rs[rot];
	if(l==r){ f[root]++;return root; }
	if(k<=mid) ls[root]=update(ls[root],l,mid,k);
	else rs[root]=update(rs[root],mid+1,r,k);
	f[root]=f[ls[root]]+f[rs[root]];
	return root;
}
int Find(int rot,int root,int l,int r,int k){
	if(l==r) return f[root]-f[rot]<k?-1:l;
	int mid=(l+r)>>1;
	if(k<=f[rs[root]]-f[rs[rot]]) return Find(rs[rot],rs[root],mid+1,r,k);
	else return Find(ls[rot],ls[root],l,mid,k-f[rs[root]]+f[rs[rot]]);
}
int siz[1000005],fa[1000005][30],dfn[1000005],df;
void dfs(int x,int fat){
	siz[x]=1,fa[x][0]=fat,dfn[x]=++df;
	if(x<=n){ rt[dfn[x]]=update(rt[dfn[x]-1],1,n,a[x]);return; } 
	else rt[dfn[x]]=rt[dfn[x]-1];
	if(l[x]) dfs(l[x],x),siz[x]+=siz[l[x]];
	if(r[x]) dfs(r[x],x),siz[x]+=siz[r[x]];
}
int main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read(),ma[a[i]]=1;
	for(map<int,int>::iterator i=ma.begin();i!=ma.end();i++)
		i->second=++j,rma[i->second]=i->first;
	for(int i=1;i<=n;i++) a[i]=ma[a[i]];
	for(int i=1;i<=m;i++) b[i]={read(),read(),read()};
	build(),dfs(rr,0);
	for(int i=1;i<=25;i++) for(int j=1;j<=top;j++)
		fa[j][i]=fa[fa[j][i-1]][i-1];
	for(int i=1;i<=q;i++){
		x=read(),y=read(),z=read();
		int k=x;
		for(int j=25;j>=0;j--) if(fa[k][j]&&c[fa[k][j]]<=y)
			k=fa[k][j];
		int l=rma[Find(rt[dfn[k]-1],rt[dfn[k]+siz[k]-1],1,n,z)];
		printf("%d\n",l==0?-1:l);
	}
	return 0;
}
第二份:
CPP
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) x=x*10+(c-'0'),c=getchar();
	return x;
}
int n,m,q,a[100005],j,x,y,z;
map<int,int> ma,rma;
struct node{
	int x,y,z;
}b[500005];
bool cmp(node a,node b){
	return a.z<b.z;
}
int fat[800005],c[800005],ls[800005],rs[800005],top,rot;
int Findf(int x){
	if(x==fat[x]) return x;
	return fat[x]=Findf(fat[x]);
}
void build(){
	for(int i=1;i<=n;i++) fat[i]=++top;
	sort(b+1,b+1+m,cmp);
	for(int i=1;i<=m;i++){
		int x=Findf(b[i].x),y=Findf(b[i].y);
		if(x==y) continue;
		++top;fat[top]=fat[x]=fat[y]=top;
		ls[top]=x,rs[top]=y,c[top]=b[i].z;
	}
	rot=Findf(1);
}
int rt[800005],f[8000005],lss[8000005],rss[8000005],topp;
int update(int root,int l,int r,int k){
	int rot=++topp,mid=(l+r)>>1;
	f[rot]=f[root],lss[rot]=lss[root],rss[rot]=rss[root];
	if(l==r){ f[rot]++;return rot; }
	if(k<=mid) lss[rot]=update(lss[root],l,mid,k);
	else rss[rot]=update(rss[root],mid+1,r,k);
	f[rot]=f[lss[rot]]+f[rss[rot]];
	return rot;
}
int Find(int root1,int root2,int l,int r,int k){
	if(l==r){
		if(k>f[root2]-f[root1]) return -1;
		else return l;
	}
	int mid=(l+r)>>1;
	//cout<<root1<<" "<<root2<<" "<<l<<" "<<r<<" "<<k<<" "<<f[rss[root2]]<<" "<<f[rss[root1]]<<"\n";
	if(k<=f[rss[root2]]-f[rss[root1]]) return Find(rss[root1],rss[root2],mid+1,r,k);
	else return Find(lss[root1],lss[root2],l,mid,k-(f[rss[root2]]-f[rss[root1]]));
}
int fa[800005][30],dfn[800005],df,siz[800005];
void dfs(int x,int ff){
	fa[x][0]=ff,siz[x]=1,dfn[x]=++df;
	if(x<=n){ rt[df]=update(rt[df-1],1,n,a[x]);return; }
	else rt[df]=rt[df-1];
	if(ls[x]) dfs(ls[x],x);
	if(rs[x]) dfs(rs[x],x);
	siz[x]+=siz[ls[x]]+siz[rs[x]];
}
int main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read(),ma[a[i]]=1;
	for(map<int,int>::iterator i=ma.begin();i!=ma.end();i++)
		i->second=++j,rma[i->second]=i->first;
	for(int i=1;i<=n;i++) a[i]=ma[a[i]];
	for(int i=1;i<=m;i++) b[i]={read(),read(),read()};
	build(),dfs(rot,0);
	for(int i=1;i<=25;i++) for(int j=1;j<=top;j++)
		fa[j][i]=fa[fa[j][i-1]][i-1];
	int l=0;
	for(int i=1;i<=q;i++){
		x=read(),y=read(),z=read();
		int p=x;
		for(int i=25;i>=0;i--) if(fa[p][i]&&c[fa[p][i]]<=y)
			p=fa[p][i];
		l=rma[Find(rt[dfn[p]-1],rt[dfn[p]+siz[p]-1],1,n,z)];
		printf("%d\n",l==0?-1:l);
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...