T1 囚人的旋律





思路:
一般图的独立集问题是 NP 问题,所以肯定转换成序列做

考虑怎么转换成序列
序列上连边的两点为逆序对
对于图上一点 u,与它相连的点中比它大的点有 k 个,所以序列的位置 u 后有 k 个位置的值比 val[u]
从序列开头枚举到结尾,对于每一个位置统计后面比它大的数的个数
它就是剩下的数中的第 k+1 大的数
时间复杂度: O ( n 2 ) O(n^2) O(n2)

考虑满足独立集
集合中任意两点未连边,所以集合中的点不存在逆序对,所以选出的序列单调上升

考虑满足覆盖集
对于任意不在集合中的一点,存在一点与之连边,且在集合中
在序列上选的点将序列分段,设一段的左端点为 l,右端点为 r
对于 l − r l-r l−r 中任意一点 u,肯定与 l 或 r l或r l或r 成逆序对,有 u < l 或 者 u > r u<l或者u>r u<l或者u>r

于是可以 dp,转移方程为:
f [ i ] = ∑ j = 1 i − 1 f [ 满 足 条 件 的 j ] f[i]=\sum_{j=1}^{i-1} f[满足条件的j] f[i]=j=1∑i−1​f[满足条件的j]
枚举 i,j,暴力验证,时间复杂度: O ( n 3 ) O(n^3) O(n3)
考虑优化
从左到右枚举每个位置,枚举每个它可以转移到的位置,维护大于左端点的最小值
时间复杂度: O ( n 2 ) O(n^2) O(n2)

代码:

#include <bits/stdc++.h>
using namespace std;
#define re register
namespace IO {inline char ch() {static char buf[1 << 21], *p1 = buf, *p2 = buf;return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)? EOF: *p1++;
}
inline int in() {int s = 0, f = 1;char x;for (x = ch(); x < '0' || x > '9'; x = ch())if (x == '-') f = -1;for (; x >= '0' && x <= '9'; x = ch()) s = (s * 10) + (x & 15);return f == 1 ? s : -s;
}
}  // namespace IO
using namespace IO;const int A = 5e5 + 5;
const int mod = 1e9 + 7;
const int INF = 1e9;
int n, m;
int head[A], tot_road;
struct Road {int nex, to;
} road[2 * A];
inline void edge(int x, int y) {road[++tot_road] = {head[x], y};head[x] = tot_road;
}
int ex[A];
int val[A];
int f[A];inline void build() {for (int i = 1; i <= n; i++) {int num = 0;for (int y = head[i]; y; y = road[y].nex) {int z = road[y].to;if (z > i) num++;}for (int j = 1; j <= n; j++) {if (!ex[j]) num--;if (num == -1) {val[i] = j;ex[j] = 1;break;}}}return;
}// inline void DP(){//   f[0]=1;
//   for(int i=1;i<=n+1;i++){//     for(int j=0;j<i;j++){//       if(val[j]>val[i]) continue;
//       int pos=0;
//       for(int k=j+1;k<i;k++){//         if(val[k]>val[j]&&val[k]<val[i]){//           pos=1;
//           break;
//         }
//       }
//       if(pos) continue;
//       f[i]=(f[i]+f[j])%mod;
//     }
//   }
//   return;
// }
// n^3inline void DP() {f[0] = 1;for (int i = 0; i <= n; i++) {int minn = INF;for (int j = i + 1; j <= n+1; j++) {if (val[j] > val[i] && minn > val[j]) f[j] = (f[j] + f[i]) % mod;if (val[j] > val[i]) minn = min(minn, val[j]);}}return;
}
//n^2signed main() {// freopen("senritsu.in", "r", stdin);// freopen("senritsu.out", "w", stdout);n = in(), m = in();for (int i = 1; i <= m; i++) {int u = in(), v = in();edge(u, v), edge(v, u);}build();val[0] = 0, val[n + 1] = n+1;DP();printf("%d\n", f[n + 1]);puts("");return 0;
}
/*
5 5
2 4
2 5
1 4
3 4
3 5
*/

20200718 SCOI模拟T3(dp)相关推荐

  1. 20200731 SCOI模拟T3(线段树分治)

    T3 越野赛车问题 思路: 将 l,rl,rl,r 用线段树分治维护 用并查集维护连通性 维护最长链可以对每个连通块记录最长链两端点 合并时设两端点分别是 s,ts,ts,t 和 x,yx,yx,y ...

  2. 某 SCOI 模拟赛 T3 s3mple【生成函数 拉格朗日插值】

    题意 对于序列 a a a,记 v i v_i vi​ 为位置距离 a i a_i ai​ 最近的.比 a i a_i ai​ 大的数与它的距离(假设 a 0 a_0 a0​ 和 a n + 1 a_ ...

  3. 8.12模拟:dp递推

    文章目录 前言 本次最大收获 考场 复盘 T1 lecture T2 n-thlon T3 assignment T4 recoverset 总结 前言 245分 100+70+40+35 不太满意q ...

  4. 【CodeForces - 545 ABCDE套题训练题解】贪心, 构造,模拟,dp,最短路树(Dijkstra+变形)

    A: 题干: Input The first line contains integer n (1 ≤ n ≤ 100) - the number of cars. Each of the next  ...

  5. 【 HRBUST - 1055】Single(模拟,dp,打表)(总结)

    题干: There are many handsome single boys in our team, for example, me. Some times, we like count sing ...

  6. Codeforces Round #552 (Div. 3) E stl模拟 F dp G gcd

    contest链接 https://codeforces.com/contest/1154 E 题解思路 直接哈希模拟删除T了,可以用setsetset和lowerlowerlower_boundbo ...

  7. 寒假算法学习 OI生涯 - 悄无声息(模拟+线性DP优化) OI生涯 - 德国心脏病 (模拟)

    OI生涯 - 悄无声息 题目描述 「李」走路是没有动静的,如果你在干「李」不让你干的事情,他会神不知鬼不觉的走到你的身后,然后把你奶一顿! 因为你知道「李」走路没有动静,所以为了提防,可以认为「李」有 ...

  8. [模拟/区间DP]Csp M4 T1T2T4

    目录 A.[模拟]数鸭子 题意 样例 样例输入: 样例输出: 思路 总结 代码 B.[模拟]宇宙射线 题意 样例 样例输入: 样例输出: 思路 总结 代码 C.[区间DP]危机 题意 样例 样例输出: ...

  9. 2019.03.27【GDOI2019】模拟 T3

    题目大意 给出$n$, $p$, 求有多少长度为$n$的排列可以被分成三个上升子序列, 数量对$p$取模, 数据范围 $3 \leq n \leq 500$. 思路 首先让我们考虑如果有一个排列,如何 ...

最新文章

  1. 深度学习如炼丹,你有哪些迷信做法?网友:Random seed=42结果好
  2. mysql数据库字符集作用_MYSQL数据库字符集支持
  3. 动画库 Lottie 的使用
  4. Java安卓 使用视图组 布局
  5. kratos import 飘红问题
  6. ngix入门 Linux系统Ubuntu ngix安装
  7. Android O WMS(3) -- addwindow
  8. [渝粤教育] 内蒙古大学 微生物学 参考 资料
  9. LSTM实现情感分类
  10. 安卓获取wifi列表_大家好,我是来给你家 WiFi 提速的
  11. Informix数据库学习随笔
  12. pytest官方文档 6.2 中文翻译版(第十章):警告捕捉
  13. xiuno开发文档_大白 · TinyMCE编辑器v1.9_Xiuno Plugin_奇狐插件商店_奇狐网
  14. Relax中的量化管理
  15. Leetcode刷题笔记 354 俄罗斯套娃
  16. finalize()用法
  17. mysql恢复root权限设置密码_MySQL修改root密码及恢复权限的多种方法
  18. 强化学习应用简述---强化学习方向优秀科学家李玉喜博士创作
  19. 兄弟连兄弟会机构好不好
  20. java环境JDK的安装及判断是否安装成功

热门文章

  1. Python自学第一步-安装软件
  2. nginx的反向代理upstream说明
  3. echarts 三种数据双y轴显示 (文末附带完整代码)
  4. 3D-太阳系、牧师与恶魔小游戏
  5. python 时间戳转换_python 时间戳
  6. [Python]简单几行代码带你完成Python切换代理IP
  7. 个人网站和博客赚钱方式 (如何把WordPress网站变成一门生意)
  8. 从西贝的“不雅视频”看门店升级数字媒体重要性
  9. opencv 图像雾检测_opencv-python烟雾图像处理
  10. 机器学习学习笔记(三)之分类器