【题解】[牛客OI周赛4-提高组]A.K小生成树 枚举+前缀和+剪枝

题目链接
【题解】[牛客OI周赛4-提高组]A.K小生成树 枚举+前缀和+剪枝_第1张图片
【题解】[牛客OI周赛4-提高组]A.K小生成树 枚举+前缀和+剪枝_第2张图片


【题解】[牛客OI周赛4-提高组]A.K小生成树 枚举+前缀和+剪枝_第3张图片
【题解】[牛客OI周赛4-提高组]A.K小生成树 枚举+前缀和+剪枝_第4张图片

#include
#include
using namespace std;
const int N=1e6+10,Q=1e4+10,INF=0x3f3f3f3f;
int n,m,a[N],fa[21],l,r,f1,f2,ans,tot,flag,q,askl[Q],askr[Q],minl=INF,maxr=-INF;
struct Edge{
	int u,v,w;
}e[26];
inline int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);}
int main()
{
	//freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	    scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	scanf("%d",&q);
	for(int i=1;i<=q;i++)//离线读入 
	{
		scanf("%d%d",&askl[i],&askr[i]);
		minl=min(askl[i],minl);maxr=max(askr[i],maxr);
	}
	for(int i=1;i<(1<=minl&&ans<=maxr)a[ans-minl+1]++;//只记录[minl,maxr],优化前缀和数组大小 
		}
	}
	for(int i=1;i<=maxr-minl+1;i++)a[i]+=a[i-1];//变成前缀和
	for(int i=1;i<=q;i++)
	    printf("%d\n",a[askr[i]-minl+1]-a[askl[i]-minl]);
	return 0; 
}

总结

因为边数小,可以直接枚举边集,离线读入和前缀和处理以及区间偏移是关键。

你可能感兴趣的:(比赛,牛客网,枚举,剪枝,前缀和)