HDU5481求数轴的并集的长度
2015-10-01 09:01
295 查看
首先考虑一个问题,就是关于覆盖的问题:
若某个区间没有被其它区间覆盖,则该区间在子集中出现的总次数为:2^(n-1)次(总子集数-去掉该区间的子集总数)
若某个区间被覆盖了1次,即有2个区间重叠,那么该区间在子集中出现总次数为:2^(n-1)+2^(n-2)次(第1个区间在子集中出现的次数+第2个区间在子集中出现且第1个区间不出现的总次数)
…………
可以得到
若该区间被覆盖了k(k>=0)次,即有k+1个区间重叠,得到该区间在所有子集中出现的总次数:2^(n-1)+2^(n-2)+……+2^(n-k-1)
然后就是如果求出这个区间被几个区间覆盖,这里的处理个人感觉比较巧妙,把区间离散化,左端点标记为1,右端点标记为-1,然后用个累加器cnt去加,
自己画几个数轴就能很容易想明白,这里为什么能求出数轴的并。
若某个区间没有被其它区间覆盖,则该区间在子集中出现的总次数为:2^(n-1)次(总子集数-去掉该区间的子集总数)
若某个区间被覆盖了1次,即有2个区间重叠,那么该区间在子集中出现总次数为:2^(n-1)+2^(n-2)次(第1个区间在子集中出现的次数+第2个区间在子集中出现且第1个区间不出现的总次数)
…………
可以得到
若该区间被覆盖了k(k>=0)次,即有k+1个区间重叠,得到该区间在所有子集中出现的总次数:2^(n-1)+2^(n-2)+……+2^(n-k-1)
然后就是如果求出这个区间被几个区间覆盖,这里的处理个人感觉比较巧妙,把区间离散化,左端点标记为1,右端点标记为-1,然后用个累加器cnt去加,
自己画几个数轴就能很容易想明白,这里为什么能求出数轴的并。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<algorithm> #include<vector> #include<set> #include<map> #include<cmath> #include<cctype> #include<queue> #define LL long long using namespace std; const double eps=1e-10; const double pi=acos(-1.0); const int N=1e5+10; const LL mod=1e9+7; struct node { int l,r; }a[N<<1]; bool cmp(node a,node b) { return a.l<b.l; } LL ans,sum ,p ; int main() { int t; cin>>t; p[0]=1; for(int i=1;i<N;i++) p[i]=2*p[i-1]%mod; while(t--) { int n; cin>>n; for(int i=0;i<2*n;i+=2) { scanf("%d%d",&a[i].l,&a[i+1].l); a[i].r=1; a[i+1].r=-1; } sort(a,a+2*n,cmp); sum[1]=p[n-1]; for(int i=2;i<=n;i++) sum[i]=(sum[i-1]+p[n-i])%mod; ans=0; int cnt=0; for(int i=0;i<2*n-1;i++) { cnt+=a[i].r; ans=(ans+sum[cnt]*(a[i+1].l-a[i].l)%mod)%mod; } cout<<ans<<endl; } return 0; }
相关文章推荐
- fs寄存器
- <PY>转换类型:嵌套列表的遍历
- qt 委托 paint() 显示数据
- 仿微沟道效应,主要actionbar有些知识
- Eclipse4.4设备egit插件提交本地项目代码到远程仓库
- 爱奇艺视频下载网站
- qt QItemDelegate 委托 相关函数
- DbUtils——ResultSetHandler接口的实现类
- Android工具类之Bitmap图片处理
- ThinkPHP神秘应用架构扩展
- 并查集
- 莫比乌斯反演
- 线程5种状态
- NPC问题及其解决方法(回溯法、动态规划、贪心法、深度优先遍历)
- Win10 10547预览版怎么修改登陆界面壁纸?
- javascript使用eventutil绑定事件
- 【读书笔记】GCD-多线程编程
- Summary Ranges
- 于Heroku平台部署maven webapp(java web)工程
- 大一新生,是怎样参加阿里实习生面试的