求助vector特性
  • 板块学术版
  • 楼主Perfound
  • 当前回复14
  • 已保存回复14
  • 发布时间2023/9/12 22:15
  • 上次更新2023/11/2 21:08:19
查看原帖
求助vector特性
535259
Perfound楼主2023/9/12 22:15
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct edge{int a,b,v;}e[1000010];vector<int>lt[1000010],s[1000010];
int pt[1000010],pv[1000010],v[1000010],sz[1000010],n,m,q;
int find(int x){return pt[x]==x?x:find(pt[x]);}
int main(){
	scanf("%d%d%d",&n,&m,&q),pv[n+1]=m+1;
	for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].a,&e[i].b,&v[i]),e[i].v=i;
	sort(e+1,e+m+1,[](edge x,edge y){return v[x.v]>v[y.v];});
	for(int i=1;i<=n;i++)pt[i]=i,sz[i]=1;
	for(int i=1,a,b;i<=m;i++){
		if((a=find(e[i].a))==(b=find(e[i].b)))continue;
		if(sz[a]>sz[b])swap(a,b);
		pt[a]=b,pv[a]=e[i].v,sz[b]+=sz[a];
		lt[b].push_back(a);
	}
	for(int i=1;i<=n;s[i++].push_back(sz[i]-1)){
		sort(lt[i].begin(),lt[i].end(),[](int a,int b){return v[pv[a]]<v[pv[b]];});
		for(int j=0,k=0,p=lt[i].size();j<p;j++)
			s[i].push_back(k),k+=sz[lt[i][j]];
	}
	for(int i=1,a,b;i<=q;i++){
		scanf("%d",&a);
		if(a==2){
			scanf("%d",&b);
			while(pt[b]!=b&&v[pv[b]]>=v[m+1])b=pt[b];
			a=lower_bound(lt[b].begin(),lt[b].end(),n+1,[](int a,int b){return v[pv[a]]<v[pv[b]];})-lt[b].begin();
			printf("%d\n",sz[b]-s[b][a]);
		}else if(a==1)scanf("%d",&v[m+1]);
		else if(a==3)scanf("%d",&b),scanf("%d",&v[b]);
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct edge{int a,b,v;}e[1000010];vector<int>lt[1000010],s[1000010];
int pt[1000010],pv[1000010],v[1000010],sz[1000010],n,m,q;
int find(int x){return pt[x]==x?x:find(pt[x]);}
int main(){
	scanf("%d%d%d",&n,&m,&q),pv[n+1]=m+1;
	for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].a,&e[i].b,&v[i]),e[i].v=i;
	sort(e+1,e+m+1,[](edge x,edge y){return v[x.v]>v[y.v];});
	for(int i=1;i<=n;i++)pt[i]=i,sz[i]=1;
	for(int i=1,a,b;i<=m;i++){
		if((a=find(e[i].a))==(b=find(e[i].b)))continue;
		if(sz[a]>sz[b])swap(a,b);
		pt[a]=b,pv[a]=e[i].v,sz[b]+=sz[a];
		lt[b].push_back(a);
	}
	for(int i=1;i<=n;i++){
		sort(lt[i].begin(),lt[i].end(),[](int a,int b){return v[pv[a]]<v[pv[b]];});
		for(int j=0,k=0,p=lt[i].size();j<p;j++)
			s[i].push_back(k),k+=sz[lt[i][j]];
	}
	for(int i=1,a,b;i<=q;i++){
		scanf("%d",&a);
		if(a==2){
			scanf("%d",&b);
			while(pt[b]!=b&&v[pv[b]]>=v[m+1])b=pt[b];
			auto c=lower_bound(lt[b].begin(),lt[b].end(),n+1,[](int a,int b){return v[pv[a]]<v[pv[b]];});
			if(c==lt[b].end())printf("%d\n",1);
			else printf("%d\n",sz[b]-s[b][c-lt[b].begin()]);
		}else if(a==1)scanf("%d",&v[m+1]);
		else if(a==3)scanf("%d",&b),scanf("%d",&v[b]);
	}
	return 0;
}

这里两份 P9638 代码一个 70 一个 100

是不是因为 vector 的 end - begin 是无法计算的导致的

2023/9/12 22:15
加载中...