其实我并没有见过原题,只是因为...这被改编成了互测题...

题目中提到了一个序列,这个序列是很重要的,否则这个问题好像是没有合理的时间复杂度解法的

但正因为有了这个序列,这个问题的时间复杂度才让人能够接受

序列的特性:逆序对!

根据题意,我们发现一个图上所有的连边一定来源于这个序列里的逆序对!

那么,如果要求一个点集内部没有连边,内部是不能有逆序对的!

那么这个条件等价于求出这个序列的上升子序列数目!

所以我们记dp[i]表示以i为结尾,获得所求点集的方案数

那么dp[i]就可以由dp[j]进行转移,其中j<i

但并不是所有的j都能转移到i,因为还有第二个约束条件

都要有连边怎么办?

我们发现,首先,如果想用f[j]来更新f[i],那么j~i之间的点都没有被使用,那这样一来我们就要让他们都与选中的点之间有连边

怎么做?

充要条件:对于任意j<k<i,有a[k]>a[i]或a[k]<a[j]

证明:首先我们知道,由于是上升序列,一定有:a[i]>a[j]

那么,如果要求都有连边,那么k要么会和i构成逆序对,要么会和j以内某个被选中的点构成逆序对

再考虑j以内所有值都比a[j]小,所以如果k能和j以内某个点构成逆序对,必然会和j构成逆序对

即要求:a[k]<a[j]

那么如果k与i构成逆序对,一定要求a[k]>a[i]

于是我们检验上述两个条件就好

可是这样做是O(n^3)过不了啊

再优化一下!

我们能够发现,如果有a[k]>a[i],根据单调性,一定有a[k]>a[j]!

而a[k]<a[j]的部分是已然成立的

所以我们仅需找出,对于所有a[k]>a[j]的k中最小的a[k]是否大于a[i]即可

而如果我们先枚举j,然后枚举i,那么是可以在枚举i的同时维护出这个最小的a[k]的!

这样时间就降到了O(n^2)

当然,我们忽略了一个问题:序列怎么求?

拓扑排序!

这里的拓扑稍特殊:需要用到优先队列,因为对于没有逆序对的部分,后面的一定比前面的大

最后贴代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define mode 1000000007
using namespace std;
int dp[];
int inr[];
int maps[][];
bool used[];
int a[];
int n,m;
int main()
{
freopen("is.in","r",stdin);
freopen("is.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x>y)
{
swap(x,y);
}
inr[y]++;
maps[x][y]=maps[y][x]=;
}
priority_queue <int> M;
for(int i=n;i>=;i--)
{
if(!inr[i])
{
used[i]=;
M.push(i);
}
}
int ttop=n;
while(!M.empty())
{
int u=M.top();
M.pop();
a[u]=ttop--;
for(int i=n;i>=;i--)
{
if(maps[u][i])
{
inr[i]--;
if(!inr[i]&&!used[i])
{
used[i]=;
M.push(i);
}
}
}
}
a[]=,a[n+]=n+;
dp[]=;
for(int j=;j<=n;j++)
{
int minval=n+;
for(int i=j+;i<=n+;i++)
{
if(a[i]<a[j]||a[i]>=minval)
{
continue;
}
dp[i]+=dp[j];
dp[i]%=mode;
minval=a[i];
}
}
printf("%d\n",dp[n+]);
return ;
}

bzoj 4715的更多相关文章

  1. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  2. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  3. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  4. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  5. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  6. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  7. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  8. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  9. bzoj 刷水

    bzoj 3856: Monster 虽然是sb题,,但是要注意h可能<=a,,,开始忘记判了WA得很开心. #include <iostream> #include <cst ...

随机推荐

  1. Python 12 - Mysql & ORM

    本节内容 1.数据库介绍 2.mysql数据库安装使用 3.mysql数据库基础 4.mysql命令 5.事务 6.索引 7.Python操作mysql 8.ORM sqlalchemy了解 数据库介 ...

  2. java中的进程与线程及java对象的内存结构【转】

    原文地址:http://rainforc.iteye.com/blog/2039501   1.实现线程的三种方式:   使用内核线程实现     内核线程(Kernel Thread, KLT)就是 ...

  3. laravel 关闭 csrf 验证 TokenMismatchException

    csrf验证失败 注释掉kernel.php 的 csrf 行代码

  4. 20165231 2017-2018-2 《Java程序设计》第3周学习总结

    教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制 从类看对象:类定义可以视 ...

  5. Linux就该这么学(3)-管道符、重定向与环境变量(学习笔记)

    1.Linux命令与文件读写操作有关的重定向技术: 学习目标:主要解决输出信息的保存问题. 标准覆盖输出重定向: 标准追加输出重定向 错误覆盖输出重定向 错误追加输出重定向 输入重定向 标准输入(ST ...

  6. 817. Linked List Components

    1. 原始题目 We are given head, the head node of a linked list containing unique integer values. We are a ...

  7. Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)

    Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.S ...

  8. vue中原生file上传图片

    效果 视图层 <el-form-item class="file-box" label="微信分享图片url链接" prop="wx_share ...

  9. P3830 [SHOI2012]随机树 题解

    P3830 随机树 坑题,别人的题解我看了一个下午没一个看得懂的,我还是太弱了. 题目链接 P3830 [SHOI2012]随机树 题目描述 输入输出格式 输入格式: 输入仅有一行,包含两个正整数 q ...

  10. 线性回归,逻辑回归,神经网络,SVM的总结

    目录 线性回归,逻辑回归,神经网络,SVM的总结 线性回归,逻辑回归,神经网络,SVM的总结 详细的学习笔记. markdown的公式编辑手册. 回归的含义: 回归就是指根据之前的数据预测一个准确的输 ...