[HAOI2017模拟]囚人的旋律
没有传送门辣。
神奇的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)$的复杂度。
//senritsu
//by Cydiater
//2017.1.17
#include <iostream>
#include <queue>
#include <map>
#include <ctime>
#include <cstring>
#include <string>
#include <iomanip>
#include <ctime>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define Auto(i,node) for(int i=LINK[node];i;i=e[i].next)
#define FILE "senritsu"
const int MAXN=1e4+5;
const int oo=0x3f3f3f3f;
const int mod=1000000007;
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int N,M,LINK[MAXN],len=0,arr[MAXN],f[MAXN];
bool used[MAXN];
struct edge{
int y,next;
}e[MAXN<<10];
namespace solution{
inline void insert(int x,int y){
e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;
}
inline void Insert(int x,int y){
insert(x,y);
insert(y,x);
}
void Prepare(){
N=read();M=read();
up(i,1,M){
int x=read(),y=read();
Insert(x,y);
}
up(i,1,N){
int cnt=0,K=0;
Auto(j,i)if(e[j].y>i)cnt++;
up(j,1,N)if(!used[j]){
K++;
if(K==cnt+1){
used[j]=1;
arr[i]=j;
break;
}
}
}
arr[0]=-oo;arr[N+1]=oo-1;
}
void Solve(){
int Min;
f[0]=1;
up(i,0,N+1){
Min=oo;
up(j,i+1,N+1){
if(arr[j]>arr[i]&&Min>arr[j])(f[j]+=f[i])%=mod;
if(arr[j]>arr[i])cmin(Min,arr[j]);
}
}
cout<<f[N+1]<<endl;
}
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
using namespace solution;
Prepare();
Solve();
return 0;
}
[HAOI2017模拟]囚人的旋律的更多相关文章
- bzoj4715 囚人的旋律
4715: 囚人的旋律 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 74 Solved: 48[Submit][Status][Discuss] ...
- 【BZOJ4715】囚人的旋律
题解: 思考了很久这个图的特点没有发现 看了题解瞬间醒悟原来要在序列上做 还原出这张图显然是O(N^2)可以做的 然后其实就比较简单了 首先为了满足独立集,我们需要保证所取元素递增 为了满足覆盖集,我 ...
- 【bzoj4715】囚人的旋律 dp
题目描述 给你一个 $1\sim n$ 的排列 $a_i$ ,若 $i\le j$ 且 $a_i\ge a_j$ ,则 $i$ 到 $j$ 有一条边.现在给你这张图,求既是独立集(任意两个选定点都没有 ...
- [HAOI2017模拟]百步穿杨
今天的考试题. 考试的时候因为以前做过还写过题解,然后就以为模型已经很清楚了,然后就开始直接推.最后因为蜜汁自信一定能推出来,然后模型搞错了,只能交个暴力上去,于是这场考试GG. 第一次碰上这道题是在 ...
- unity3d Human skin real time rendering 真实模拟人皮实时渲染(转)
先放出结果图片...由于网上下的模型是拼的,所以眼皮,脸颊,嘴唇看起来像 存在裂痕,解决方式是加入曲面细分和置换贴图 进行一定隆起,但是博主试了一下fragment shader的曲面细分,虽然细分成 ...
- unity3d Human skin real time rendering 真实模拟人皮实时渲染
先放出结果图片...由于网上下的模型是拼的,所以眼皮,脸颊,嘴唇看起来像存在裂痕,解决方式是加入曲面细分和置换贴图 进行一定隆起,但是博主试了一下fragment shader的曲面细分,虽然细分成功 ...
- git 学习(3) ----- 代码共享和多人协作
当我们开发项目的时候,项目会越来越大,就有可能需要其它同事进行参与,甚至进行开源,这时就需要找一个地方把代码存放起来,好供其它人下载并开发.这个地方,最好放到服务器上,因为只要能上网,就可以获取到, ...
- Netty多人聊天室
在简单聊天室的代码中修改ChatServerHandler类,就可以模拟多人聊天的功能 package com.cppdy.server; import io.netty.channel.Channe ...
- webrtc笔记(5): 基于kurento media server的多人视频聊天示例
这是kurento tutorial中的一个例子(groupCall),用于多人音视频通话,效果如下: 登录界面: 聊天界面: 运行方法: 1.本地用docker把kurento server跑起来 ...
随机推荐
- 让asp.net程序在修改web.config后不重启
默认情况下web.config修改后,asp.net程序会被重启.为了防止程序重启,要修改machine.config 文件. machine.config默认在C:\WINDOWS\Microsof ...
- nginx于tomcat项目整合(拆分静态文件)
1.在很多时候我们在网站上应用的时候都会用到nginx,由于我们是java开发者,不可避免的是我们需要在我们的tomcat的工程中应用到nginx,这里的应用可以是请求转发,负载均衡,反向代理,配置虚 ...
- Spring--简记
Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系. Spring的IoC(控制反转)容器提供了Bean实例缓存.生 ...
- 小程序 Page is not constructed because it is not found.
如下错误一般发生在点击事件切换页面的时候 解决方式: 在需要切换到的那个页面的js文件中添加Page({ })方法即可解决此问题. Tis:在js文件中输入Page回车,可自动添加Page方法,包括里 ...
- GITLAB服务基础
1.GITLAB介绍 一个基于GIT的源码托管解决方案基于Ruby on rails开发集成了nginx postgreSQL redis sidekiq等组件 2. 资源 官网:https://ab ...
- HDFS集群安装
DFS集群安装: 1.准备工作 (1)虚拟机(电脑8G 磁盘500GB) (2)3台linux系统(1台namenode 2台datanode) 2.安装HDFS(软件) (1)关闭防火墙 firew ...
- SpringBoot-URL路由:@Controller和@RequestMapping
SpringBoot定义URL处理方法:@Controller和@RequestMapping @Controller标注的类表示的是一个处理HTTP请求的控制器(即MVC中的C),该类中所有被@Re ...
- 从HD OJ 1005想到的
杭电OJ [1005](http://acm.hdu.edu.cn/showproblem.php?pid=1005): #####Problem Description > A number ...
- 文本情感分类:分词 OR 不分词(3)
为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...
- 产品固件(系统)升级——curl/wget
1.文件下载指令应用 支持断点续传 curl -C - -O "https://curl.haxx.se/download/archeology/curl-7.58.0.tar.gz&quo ...