【题解】USACO 2020Feb Gold Help Yourself
更好的阅读
先放结论
首先把线段按左端点升序排序
我们设
答案为
证明?
当我们从
不选线段
由“不与线段
这样的子集一共有
我们发现“不与线段
感性理解一下就是有
代码
更没什么好说的了
#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;
#define int long long
const int MAXN=200005;
const int MOD=1e9+7;
int n;
pair<int,int> a[MAXN];
int l[MAXN],r[MAXN];
int tmp[MAXN];
int sum[MAXN];
int dp[MAXN];
inline int pow(int x,int y){
int ans=1;
while (y>0){
if (y%2==0){
x*=x;
x%=MOD;
y/=2;
}
ans*=x;
ans%=MOD;
y--;
}
return ans;
}
signed main()
{
freopen("help.in","r",stdin);
freopen("help.out","w",stdout);
cin>>n;
for (int i=1;i<=n;i++)
cin>>a[i].first>>a[i].second;
sort(a+1,a+1+n);
for (int i=1;i<=n;i++){
l[i]=a[i].first;
r[i]=a[i].second;
tmp[r[i]]++;
}
for (int i=1;i<=MAXN-5;i++)
sum[i]=sum[i-1]+tmp[i];
for (int i=1;i<=n;i++)
dp[i]=(dp[i-1]*2ll+pow(2ll,sum[l[i]-1]))%MOD;
cout<<dp[n]<<endl;
return 0;
}