[LuoguP5464 缩小社交圈](P5464 缩小社交圈)

背景:洛谷七月月赛T4

题目大意给定\(n\)个点,每个点的权值对应着一个区间\([l_i,r_i]\),两个点\(i,j\)有边当且仅当他们权值的并集不为空集,问有多少个点集\(S\)满足其连边后是一棵树

\(n <= 2*10^3,l_i<=r_i<=2*10^3\)

首先,这道题不能转换成一道图论问题去考虑,为什么?

因为这道题区间的性质非常特殊,是解题关键,如果转化成图,就没有了这个性质.

首先,如果不能转化成图论,此类区间的问题还是应该先进行排序.

我们按照\(r_i\)进行排序之后考虑\(DP\)

我们发现如果\(i\)与\(j\)的并集是空集,肯定\(i\)是无法接到\(j\)后面的

加入不为空集,就可能出现这种情况

这说明只记\(f_i\)表示前\(i\)个区间的合法数量是不对的

所以我们设\(f_{i,j}\)表示\(j\)接在\(i\)后面的方案数.

第一种情况:\(j\cap i!=j\),即\(x_i>x_j\)

此时,很明显有

\(f_{i,j} = \sum_{k = 0,y_k<x_i}^{j - 1}f_{j,k}\)

第二种情况:\(j\cap i==j\),即\(x_i<=x_j\)

很明显,此时我们在用上面的方程转移是不j合法的了

我们还应当保证,\(j,k\)无交

但是\(j,k\)无交就意味着\(f_{j,k}=0\)

之后我们发现,这种情况,\(f_{i,j}\)其实是可以从\(f_{i,k}\)转移过来的

即:

\(f_{i,j} = \sum_{k = 0,y_k<x_j}^{j - 1}f_{i,k}\)

发现上面两个方程都可以用前缀和或者树状数组优化

因为每次查询的符合答案的\(y_k\)是一个前缀

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cctype>
  6. #define LL long long
  7. #define pii pair<int,int>
  8. #define mk make_pair
  9. using namespace std;
  10. const int N = 4e3 + 3;
  11. const int mod = 1e9 + 7;
  12. struct node{
  13. int li,ri;
  14. }a[N];
  15. int f[N][N];
  16. int n;
  17. inline bool cmp(node x,node y){
  18. if(x.ri == y.ri)
  19. return x.li < y.li;
  20. return x.ri < y.ri;
  21. }
  22. inline void up(int &x,int y){
  23. x += y;
  24. if(x >= mod) x -= mod;
  25. }
  26. struct BIT{
  27. int c[N];
  28. inline void add(int x,int v){
  29. for(;x <= 4000;x += x & -x) up(c[x],v);
  30. }
  31. inline int query(int x){
  32. int res = 0;
  33. for(;x;x -= x & -x) up(res,c[x]);
  34. return res;
  35. }
  36. }T[N];
  37. //f[i][j]表示当前选了第i个,上一个选了第j个的方案总数
  38. int main(){
  39. scanf("%d",&n);
  40. for(int i = 1;i <= n;++i) scanf("%d%d",&a[i].li,&a[i].ri);
  41. sort(a + 1,a + n + 1,cmp);
  42. for(int i = 1;i <= n;++i) f[i][0] = 1,T[i].add(1,1);
  43. for(int i = 1;i <= n;++i){
  44. for(int j = 0;j < i;++j){
  45. if(a[i].li > a[j].ri) continue;
  46. if(a[i].li <= a[j].li)
  47. up(f[i][j],T[i].query(a[j].li));
  48. if(a[i].li > a[j].li)
  49. up(f[i][j],T[j].query(a[i].li));
  50. T[i].add(a[j].ri + 1,f[i][j]);
  51. }
  52. }
  53. int ans = 0;
  54. for(int i = 1;i <= n;++i){
  55. for(int j = 0;j < i;++j) up(ans,f[i][j]);
  56. }
  57. printf("%d\n",ans);
  58. return 0;
  59. }

LuoguP5464 缩小社交圈的更多相关文章

  1. [luogu5464]缩小社交圈

    不难证明合法当且仅当满足一下两个条件: 1.每一个位置最多被覆盖两次(无环) 2.将选择的区间按左端点从小到大排序,对于每一个左端点,其之前的区间的最大右端点不小于其(连通) (关于第一个的充分性证明 ...

  2. PhotoView实现图片随手势的放大缩小的效果

    项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...

  3. 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

    这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...

  4. FFmpeg滤镜实现区域视频增强 及 D3D实现视频播放区的拉大缩小

    1.区域视频增强 FFmpeg滤镜功能十分强大,用滤镜可以实现视频的区域增强功能. 用eq滤镜就可以实现亮度.对比度.饱和度等的常用视频增强功能. 推荐两篇写得不错的博文: (1)ffmpeg综合应用 ...

  5. 鼠标上下滑动总是放大缩小页面,按住ctrl+0

    鼠标上下滑动总是放大缩小页面,可能是ctrl键失灵了,幸好键盘有两个ctrl键,按住ctrl+0,页面就正常了,吓死宝宝了,~~~~(>_<)~~~~

  6. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

  7. (十四)WebGIS中地图放大缩小的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章中,我们给出了整个工具栏设计的核心,使用命令模式,并 ...

  8. OpenCV2:等间隔采样和局部均值的图像缩小

    图像的缩小从物理意义上来说,就是将图像的每个像素的大小缩小相应的倍数.但是,改变像素的物理尺寸显然不是那么容易的,从数字图像处理的角度来看,图像的缩小实际就是通过减少像素个数来实现的.显而易见的,减少 ...

  9. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

随机推荐

  1. iOS app发布流程

    http://www.xuebuyuan.com/1980497.html http://blog.csdn.net/alincexiaohao/article/details/38725367 ap ...

  2. python 模块的导入

  3. Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离

    给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意,root是树结点对象(Tr ...

  4. docker-compose进入容器出现unable to find user root: no matching entries in passwd file

    解决办法: 先docker-compose stop 容器,再docker-compose start 容器.虽然这样可以很快 解决问题,但并非长久之计.

  5. SharePoint开发中怎样使用Visual Studio给你的Web Part加入图标

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/36051545 SharePoint开发中怎样 ...

  6. Java练习 SDUT-1117_求绝对值(选择结构)

    C语言实验--求绝对值(选择结构) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 从键盘上输入任意一个整数,然后输出它 ...

  7. Quick BI独创千人千面的行级权限管控机制

    摘要 就数据访问权限而言,阿里巴巴以“被动式授权”为主,你需要什么权限就申请什么权限.但是,在客户交流过程中,我们发现绝大多数企业都是集中式授权,尤其是面向个人的行级权限管控,管理复杂度往往呈几何增长 ...

  8. HDU-1114_Piggy-Bank

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...

  9. H5页面IOS中键盘弹出导致点击错位的问题

    IOS在点击输入框弹出键盘  键盘回缩 后 定位没有相应改变  还有  textarea 也会弹出键盘 $("input").blur(function() { console.l ...

  10. 详解ThinkPHP支持的URL模式有四种普通模式、PATHINFO、REWRITE和兼容模式

    URL模式     URL_MODEL设置 普通模式    0 PATHINFO模式     1 REWRITE模式     2 兼容模式     3 如果你整个应用下面的模块都是采用统一的URL模式 ...