NHOI 2023 Feb T6 拯救地球
题意
地球上有
对于每次任务,输出你最多能拯救的国家数目,每次任务独立,互不影响。
Step1:
直接暴力建图,暴力计算答案。
于是时间复杂度就为
因为很显然并不是正解,所以就没打了。
Step2:
不难发现,如果从
既然如此,我们可以用并查集来维护这个合并了。
显然如果一条边的边权
于是,这个代码很轻松的就出来了。
注意一点,这里可以直接存
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=4e5+5,Q=2e5+5;
int n,m,q,p;
struct edge{int u,v,w;}e[M];
bool cmp(edge x,edge y){return x.w<y.w;}
struct data{int b,id,w,ans;}que[Q];
bool cmpw(data x,data y){return x.w<y.w;}
bool cmpid(data x,data y){return x.id<y.id;}
int fa[N],num[N];
int find(int x){return (x==fa[x]?x:fa[x]=find(fa[x]));}
void merge(int u,int v)
{
u=find(u);v=find(v);
if(u==v)return;
fa[v]=u;
num[u]+=num[v];
}
void solve(int lim)
{
while(1)
{
p++;
if(p>m)break;
if(e[p].w<=lim)merge(e[p].u,e[p].v);
else break;
}
p--;
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)fa[i]=i,num[i]=1;
for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+1,e+1+m,cmp);
for(int i=1;i<=q;i++)scanf("%d%d",&que[i].b,&que[i].w),que[i].id=i;
sort(que+1,que+1+q,cmpw);
for(int i=1;i<=q;i++)
{
solve(que[i].w);
que[i].ans=num[find(que[i].b)];
}
sort(que+1,que+1+q,cmpid);
for(int i=1;i<=q;i++)printf("%d\n",que[i].ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?