HDU 3461 Code Lock
题解:计算出所有可以操作的区间,留下不可操作区间求26的幂次即可,注意直接合并区间端点可能会出现一些问题,所以将右端点加一:
#include <cstdio> #include <iostream> using namespace std; const int mod=1000000007; long long t; int f[10000010]; int sf(int x){return x==f[x]?x:f[x]=sf(f[x]);} int Union(int x,int y){ x=sf(x),y=sf(y); if(x==y)return 0; f[x]=y; return 1; } long long power(int x){ if(x==0)return 1; long long t=power(x/2); t=t*t%mod; if(x%2==1)t=t*26%mod; return t; } int main(){ int m,n,a,b; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n+2;i++)f[i]=i; int ans=0; while(m--){ scanf("%d%d",&a,&b); ans+=Union(a,b+1); } cout<<power(n-ans)<<endl; } }
愿你出走半生,归来仍是少年