没有传送门辣。

神奇的DP题。

首先看到这道题第一眼应该想到正解不是在图上搞,肯定要把原图转化成序列。

根据逆序对的性质。每个点和标号大于他的点连边的点,其权值必定要小于该点,而没和他连边的且标号大于他的点,权值也必定大于他。

根据这个,我们就可以递增的枚举标号,每次判定该点和几个标号大于他的点连右边,即确定在未被选的权值里有多少个点比他小。

然后就可以确定当前点的标号了。

这样就成功的把原图转化成了序列。

接下来考虑在序列上做DP。

很显然,如果选中的一些点是满足要求的。必然要满足其构成一个上升子序列,只有上升子序列的点集才是题目所称的独立集。

覆盖集就不是那么好处理了。假设我们已经选定了一堆点,那么对于未选定的点,必定和其中某一个点构成逆序对。用数学公式表示一下就是这样的:

$\forall a_i \notin V_1$,必定$\exists a_j \in V_2$使得$a_i>a_j$且$i<j$或者$a_i<a_j$且$i>j$。

那么接下来考虑序列上的一个片段$(L,R)$,其中$L,R$都是已经被钦定的点。那么对于在$(L,R)$中的所有点$a_i$,一定不满足$a_L \leq a_i \leq a_R$。

但是不能存在一个点满足上述条件但是和之前的点存在逆序对关系吗?

考虑一个点满足上述条件。那么另一个被钦定的点要么大于$a_L$,要么小于$a_R$,这样就不满足独立集的关系了。

所以根据这个做DP即可。

即设$f[i]$表示以$i$结尾的方案数,加一些小优化即可满足$O(N^2)$的复杂度。

  1. //senritsu
  2. //by Cydiater
  3. //2017.1.17
  4. #include <iostream>
  5. #include <queue>
  6. #include <map>
  7. #include <ctime>
  8. #include <cstring>
  9. #include <string>
  10. #include <iomanip>
  11. #include <ctime>
  12. #include <algorithm>
  13. #include <cstdlib>
  14. #include <cstdio>
  15. #include <bitset>
  16. #include <set>
  17. #include <vector>
  18. using namespace std;
  19. #define ll long long
  20. #define up(i,j,n) for(int i=j;i<=n;i++)
  21. #define down(i,j,n) for(int i=j;i>=n;i--)
  22. #define cmax(a,b) a=max(a,b)
  23. #define cmin(a,b) a=min(a,b)
  24. #define Auto(i,node) for(int i=LINK[node];i;i=e[i].next)
  25. #define FILE "senritsu"
  26. const int MAXN=1e4+5;
  27. const int oo=0x3f3f3f3f;
  28. const int mod=1000000007;
  29. inline int read(){
  30. char ch=getchar();int x=0,f=1;
  31. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  32. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  33. return x*f;
  34. }
  35. int N,M,LINK[MAXN],len=0,arr[MAXN],f[MAXN];
  36. bool used[MAXN];
  37. struct edge{
  38. int y,next;
  39. }e[MAXN<<10];
  40. namespace solution{
  41. inline void insert(int x,int y){
  42. e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;
  43. }
  44. inline void Insert(int x,int y){
  45. insert(x,y);
  46. insert(y,x);
  47. }
  48. void Prepare(){
  49. N=read();M=read();
  50. up(i,1,M){
  51. int x=read(),y=read();
  52. Insert(x,y);
  53. }
  54. up(i,1,N){
  55. int cnt=0,K=0;
  56. Auto(j,i)if(e[j].y>i)cnt++;
  57. up(j,1,N)if(!used[j]){
  58. K++;
  59. if(K==cnt+1){
  60. used[j]=1;
  61. arr[i]=j;
  62. break;
  63. }
  64. }
  65. }
  66. arr[0]=-oo;arr[N+1]=oo-1;
  67. }
  68. void Solve(){
  69. int Min;
  70. f[0]=1;
  71. up(i,0,N+1){
  72. Min=oo;
  73. up(j,i+1,N+1){
  74. if(arr[j]>arr[i]&&Min>arr[j])(f[j]+=f[i])%=mod;
  75. if(arr[j]>arr[i])cmin(Min,arr[j]);
  76. }
  77. }
  78. cout<<f[N+1]<<endl;
  79. }
  80. }
  81. int main(){
  82. freopen(FILE".in","r",stdin);
  83. freopen(FILE".out","w",stdout);
  84. using namespace solution;
  85. Prepare();
  86. Solve();
  87. return 0;
  88. }

[HAOI2017模拟]囚人的旋律的更多相关文章

  1. bzoj4715 囚人的旋律

    4715: 囚人的旋律 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 74  Solved: 48[Submit][Status][Discuss] ...

  2. 【BZOJ4715】囚人的旋律

    题解: 思考了很久这个图的特点没有发现 看了题解瞬间醒悟原来要在序列上做 还原出这张图显然是O(N^2)可以做的 然后其实就比较简单了 首先为了满足独立集,我们需要保证所取元素递增 为了满足覆盖集,我 ...

  3. 【bzoj4715】囚人的旋律 dp

    题目描述 给你一个 $1\sim n$ 的排列 $a_i$ ,若 $i\le j$ 且 $a_i\ge a_j$ ,则 $i$ 到 $j$ 有一条边.现在给你这张图,求既是独立集(任意两个选定点都没有 ...

  4. [HAOI2017模拟]百步穿杨

    今天的考试题. 考试的时候因为以前做过还写过题解,然后就以为模型已经很清楚了,然后就开始直接推.最后因为蜜汁自信一定能推出来,然后模型搞错了,只能交个暴力上去,于是这场考试GG. 第一次碰上这道题是在 ...

  5. unity3d Human skin real time rendering 真实模拟人皮实时渲染(转)

    先放出结果图片...由于网上下的模型是拼的,所以眼皮,脸颊,嘴唇看起来像 存在裂痕,解决方式是加入曲面细分和置换贴图 进行一定隆起,但是博主试了一下fragment shader的曲面细分,虽然细分成 ...

  6. unity3d Human skin real time rendering 真实模拟人皮实时渲染

    先放出结果图片...由于网上下的模型是拼的,所以眼皮,脸颊,嘴唇看起来像存在裂痕,解决方式是加入曲面细分和置换贴图 进行一定隆起,但是博主试了一下fragment shader的曲面细分,虽然细分成功 ...

  7. git 学习(3) ----- 代码共享和多人协作

    当我们开发项目的时候,项目会越来越大,就有可能需要其它同事进行参与,甚至进行开源,这时就需要找一个地方把代码存放起来,好供其它人下载并开发.这个地方,最好放到服务器上,因为只要能上网,就可以获取到, ...

  8. Netty多人聊天室

    在简单聊天室的代码中修改ChatServerHandler类,就可以模拟多人聊天的功能 package com.cppdy.server; import io.netty.channel.Channe ...

  9. webrtc笔记(5): 基于kurento media server的多人视频聊天示例

    这是kurento tutorial中的一个例子(groupCall),用于多人音视频通话,效果如下: 登录界面: 聊天界面: 运行方法: 1.本地用docker把kurento server跑起来 ...

随机推荐

  1. java 从服务器下载文件并保存到本地

    昨天在做一个项目时,用到了从服务器上下载文件并保存到本地的知识,以前也没有接触过,昨天搞了一天,这个小功能实现了,下面就简单的说一下实现过程: 1.基础知识          当我们想要下载网站上的某 ...

  2. CentOS中制作本地yum源

    1.光盘指向镜像 2.将镜像挂载到某个目录 mkdir /mnt/cdrom mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom 3.修改本机上的YUM源配置文件 ...

  3. Notice: Undefined index: wjs_cookie

    w执行顺序. ok <!doctype html> <html> <head> <meta charset="UTF-8"> < ...

  4. Yii框架2.0的安装过程

    Yii框架是个不错的php开发框架,大型项目上都可以使用.和大多框架一样他也是开源,而且采用了mvc结构的. Yii1.*,直接下载然后用脚步可以创建自己的项目了,最近看了下Yii2.0版本的,他推荐 ...

  5. CF #301 E:Infinite Inversions(逆序数,树状数组)

    A-Combination Lock  B-School Marks   C-Ice Cave   D-Bad Luck Island   E-Infinite Inversions E:Infini ...

  6. git学习------> Gitlab如何进行备份恢复与迁移?

    前段时间,在某台CenterOS服务器上搭建了Gitlab环境,并且大家陆陆续续的都把代码从svn迁移到了gitlab,但是之前的CenterOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某 ...

  7. notepad快捷键总结

    notepad快捷键总结 常用快捷键: 快捷键 功能1.Ctrl-D 复制当前行2.Ctrl-L 删除当前行3.Ctrl-T 把当前行和前面一行调换位置4.F11 切换全屏模式5.Ctrl-Shft- ...

  8. (2.4)Mysql之SQL基础——下载与使用测试库

    (2.4)SQL基础——下载与使用测试库 1.查看与下载测试数据库 2.查看安装向导视图 3.安装 [1]安装:解压后用 mysql 命令安装(记得加上set autocommit=1) [2]核验: ...

  9. 小技巧-如何加快github下载代码的速度(转)

    作为开发人员,github是大家的标配了,常常会苦恼于gitclone某个项目的时候速度太慢,看着控制台那几K十几K的龟速,吐血!! 原因很简单:github的CDN被伟大的墙屏蔽所致. 所以解决方案 ...

  10. EditText把回车键变成搜索

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/mingyue_1128/article/details/31376159 在xml文件里的EditT ...