博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[优先队列][dp] Luogu P5464 缩小社交圈
阅读量:5077 次
发布时间:2019-06-12

本文共 1098 字,大约阅读时间需要 3 分钟。

题目描述

社交圈子里有 nnn 个人,每个人都有一个 SAN 值范围 [li,ri][l_i,r_i][li,ri]。当两个人的 SAN 值交集不为空时,这两个人有 PY 关系。

现在希望从社交圈子里面挑选出一些人组成一个集合 SSS,如果将所有集合内的人中有 PY 关系的那一对人都连上边,则 SSS 刚好成为一个树(森林不行哦)。

请问,有多少种可以选择的方案?由于答案可能很大,请对 109+710^{9}+7109+7 取模。

 

 

题解

  • 我们首先将这些人的左端点从小到大排序,然后题目要求是要形成一棵树
  • 这样的话,每一个点最多只能被两个区间覆盖,否则就会形成环
  • 考虑dp怎么做,设f[i][j]表示我们从左到右选区间,倒数第二个区间为i,最后一个区间为j的方案数
  • 我们转移的时候枚举j(r[j]<l[i])和k(r[k]<l[j]),就是i和j有交集,k和j有交集,i和k没有交集
  • 动态转移方程为:f[i][j]+=f[j][k],f[j][i]+=f[j][k]

 

代码

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #define ll long long 7 using namespace std; 8 const ll N=2010,mo=1e9+7; 9 struct node { ll l,r; }q[N];10 struct Node 11 { 12 ll x,y; 13 bool operator < (const Node &a)const { return x>a.x; }14 };15 priority_queue
Q;16 ll n,ans,bz[N],g[N],f[N][N];17 bool cmp(node x,node y) { return x.l==y.l?x.r>y.r:x.l
q[i].r) f[j][i]+=1+g[j]; else f[i][j]+=1+g[j];35 ans=(ans+1+g[j])%mo;36 }37 }38 printf("%lld",(ans+n)%mo);39 }

 

转载于:https://www.cnblogs.com/Comfortable/p/11309290.html

你可能感兴趣的文章
QML学习笔记之一
查看>>
Window 的引导过程
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
IOS-图片操作集合
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
团队项目开发客户端——登录子系统的设计
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>