链接:https://ac.nowcoder.com/acm/contest/316/J
来源:牛客网
题解:官方给的。qwq 这个代码可能过不去,卡内存点,理论上代码就是这样,多交几次就能过。
代码:
#include <iostream>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
const ll mod=1e9+7;
ll par[maxn];
ll n,m;
ll getfa(ll x){
if(par[x]==x) return x;
return par[x]=getfa(par[x]);
}
void init(){
for(ll i=1;i<=n+1;i++)
par[i]=i;
}
int main(){
//ll n,m;
cin>>n>>m;
ll ans=1;
/*for(ll i=1;i<=n+1;i++)
par[i]=i;*/
init();
while(m--){
ll l,r;
cin>>l>>r;
for(ll i=getfa(l);i<=r;i=getfa(i+1)){
par[i]=i+1;
n--;
}
ans=ans*n%mod;//ans%=mod;
}
cout<<ans<<endl;
return 0;
}
题目描述
黄海同学最近迷上了黑白棋,而作为忠实挂件的qko则成为了黄海同学的陪练对象,黑白棋的规则很简单,初始旗子都是白色的,每一次操作黄海同学都能将[l,r]内的白色旗子变成黑色旗子(变黑以后就不能变白了咯!),每一次操作后黄海同学都会向qko询问剩下的白色旗子的个数 为了减少输出的规模 我们将每次询问后的值相乘后输出其在模1e9+7的答案
输入描述:
输入两个整数n(1<=n<=1000000),m(1<=m<=1000000),接下来输出m个区间[l,r],表示每次操作的区间,并且(1<=l<=r<=n)
输出描述:
输出一个数 表示每次操作后剩余白色节点的乘积在模1e9+7下的答案
示例1
输入
10 3
3 3
5 7
2 8
输出
162