题目链接


题目大意:

就是给你很多行的010101串,长度是1e91e91e9,每一行都有若干段的连续的111,对于给定的串集合是美丽的美丽的美丽的的条件是任意相邻两行的串至少有一个列是同时有111的,问你至少删除多少行使得这些010101是美丽的?
n,m∈[3e5]n是行数,m是线段数n,m\in[3e5]n是行数,m是线段数n,m∈[3e5]n是行数,m是线段数
输入是i,l,ri,l,ri,l,r意思是第iii行的[l,r][l,r][l,r]的范围内是111


解题思路:

  1. 这个题目有个比较麻烦的地方就是要输出方案
  2. 首先我们很明显的dp的思想就是dp[i]表示选了第i行并且以第i行结尾能构成最大的dp[i]表示选了第i行并且以第i行结尾能构成最大的dp[i]表示选了第i行并且以第i行结尾能构成最大的01串集合01串集合01串集合
  3. dp[i]=1+max{dp[j]}∣如果第j行和i行有同列为1dp[i] = 1+max\{dp[j]\}|如果第j行和i行有同列为1dp[i]=1+max{dp[j]}∣如果第j行和i行有同列为1
  4. 但是这个非常不好维护,那么dp维数+1dp维数+1dp维数+1进行进一步的细分
  5. dp[i][j]dp[i][j]dp[i][j]表式前iii行并且在第jjj列有1的最大集合
  6. 很明dp[i][j]=1+maxk∈Ci{dp[i][k]}Ci是i行里面有1的列dp[i][j] =1+max_{k\in C_i} \{dp[i][k]\} Ci是i行里面有1的列dp[i][j]=1+maxk∈Ci​​{dp[i][k]}Ci是i行里面有1的列
  7. 实际上上面的dp方程可以写成
  8. dp[i][k]=1+max{dp[i−1][k]}∣k∈Cidp[i][k] =1+max \{dp[i-1][k]\}|_{k\in C_i}dp[i][k]=1+max{dp[i−1][k]}∣k∈Ci​​
  9. Ci是i行里面有1的列C_i是i行里面有1的列Ci​是i行里面有1的列
  10. 那么这个dp是一段区间一段区间的进行更新的!!因为1是连续的那么就是线段树啦线段树维护的是当前行可以跟新的每一列的信息,要求区间加,然后维护区间最大值!!
  11. 因为要输出方案,那么我们在线段树里面保存最大值是被哪一行更新的就可以了

AC代码:

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 600010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
struct Segtree {PII tr[maxn << 2];int lazy[maxn << 2];void build(int rt, int l, int r) {tr[rt] = {0,-1};//第一位dp。第二维更新的位置lazy[rt] = 0;if(l == r) return;build(Lson);build(Rson);}void pushdown(int rt) {if(lazy[rt]) {lazy[rt<<1] = lazy[rt<<1|1] = 1;tr[rt<<1] = tr[rt<<1|1] = tr[rt];lazy[rt] = 0;}}void pushup(int rt) {tr[rt] = max(tr[rt<<1],tr[rt<<1|1]);}PII quray(int rt, int l, int r, int posl, int posr) {if(posl <= l && posr >= r) return tr[rt];pushdown(rt);PII res = {0,-1};if(posl <= mid) res = max(quray(Lson,posl,posr),res);if(posr > mid) res = max(quray(Rson,posl,posr),res);return res;}void update(int rt, int l, int r, int posl, int posr, PII mx) {if(posl <= l && posr >= r) {tr[rt] = mx;lazy[rt] = 1;return;}pushdown(rt);if(posl <= mid) update(Lson,posl,posr,mx);if(posr > mid) update(Rson,posl,posr,mx);pushup(rt);}
}sgt;int path[maxn];
vector<int> lis;
vector<PII> lin[maxn];
bool vis[maxn];
inline int getid(int x) {return lower_bound(lis.begin(),lis.end(),x) - lis.begin() + 1;
}int main() {IOS;int n, m;read(n,m);for(int i = 1; i <= m; ++ i) {int idx, l, r;read(idx,l,r);lin[idx].push_back({l,r});lis.push_back(l);lis.push_back(r);}sort(lis.begin(),lis.end();//离散化lis.erase(unique(lis.begin(),lis.end()),lis.end());int len = lis.size();sgt.build(1,1,len);for(int i = 1; i <= n; ++ i) for(int j = 0; j < lin[i].size(); ++ j) {lin[i][j].first = getid(lin[i][j].first);lin[i][j].second = getid(lin[i][j].second);}for(int i = 1; i <= n; ++ i) {PII mx = {0,-1};for(auto it : lin[i]) mx = max(mx,sgt.quray(1,1,len,it.first,it.second));path[i] = mx.second;//保持dp更新路径mx.first ++;mx.second = i;//区间更新for(auto it : lin[i]) sgt.update(1,1,len,it.first,it.second,mx);}PII mx = sgt.quray(1,1,len,1,len);int cur = mx.second;int siz = n;while(cur != -1) {vis[cur] = true;siz --;cur = path[cur];}cout << siz << "\n";for(int i = 1; i <= n; ++ i)if(!vis[i])cout << i << " ";return 0;
}

线段树 ---- Codeforces 737 Div2 D. Ezzat and Grid 维护dp相关推荐

  1. Codeforces 833B 题解(DP+线段树)

    题面 传送门:http://codeforces.com/problemset/problem/833/B B. The Bakery time limit per test2.5 seconds m ...

  2. CodeForces - 160E Buses and People(线段树+三维偏序)

    题目链接:点击查看 题目大意:(网上复制一下别人的题意..懒) 有n辆公交车,每辆公交车有s(起始点),f(终点),t(发车时间) (行驶不需要时间) 有m个人,每个人有l(起点),r(终点),t(出 ...

  3. Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个打乱的排列,每个位置都各有一个价值,让你选择一个分界点,分成p1,p2,...,prp_1,p_2,...,p_rp1​,p2​,...,pr​和pr ...

  4. CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化

    题目链接: http://codeforces.com/contest/19/problem/D 题意: 有三种操作"add x y"往平面上添加(x,y)这个点,"re ...

  5. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  6. 【转载】线段树题目2

    1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...

  7. 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并

    题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...

  8. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  9. P4588 [TJOI2018]数学计算(线段树维护区间乘和单点修改)

    P4588 [TJOI2018]数学计算 刚看到这题根本每想到用线段树,直接每次记录计算结果然后找到要除的数字就好了呗 但是!你会注意到,如果连续乘很多很多次,然后再除的话,如果不取模会爆 long ...

最新文章

  1. 六分钟学会创建Oracle表空间的步骤
  2. [转]pthread用于进程间通信
  3. 使用movetable收缩表空间
  4. (转)iOS里面Frameworks介绍
  5. 工作107:插入请求头
  6. 深度 | 从DevOps到BizDevOps, 研发效能提升的系统方法
  7. 计算机网络之物理层:3、奈式准则和香农公式
  8. 联想e480一键恢复小孔_thinkpade480win10如何一键还原
  9. 如何调用gitee仓库真实图片链接
  10. 二维旋转矩阵公式推导
  11. 15个数据可视化的绝妙案例
  12. html li去掉前面的小黑点 项目符号
  13. pubwin修改服务器时间,如何解决控制台打开(Pubwin)提示服务器没有启动或者服务器IP地址改变问题...
  14. python web py入门(12)- 实现用户登录论坛
  15. 养肾=养命!这7个最伤肾的行为你犯了吗?程序员收藏
  16. SpringBoot Validation 快速失败(failFast)
  17. 神经网络 注意力机制 Q K V 理解
  18. PIC单片机该怎么加密
  19. 扩增子图片解读7三元图
  20. php简易留言板功能,简单实现PHP留言板功能

热门文章

  1. 爬虫之 lxml模块的安装与使用示例
  2. 本科-人工智能模拟卷
  3. python位运算符
  4. 一个用于styleGAN图像处理的编码器
  5. Java 读写Properties配置文件
  6. 基于Jquery插件Uploadify实现实时显示进度条上传图片
  7. Fork and Join: Java Can Excel at Painless Parallel Programming Too!---转
  8. reorder-list——链表、快慢指针、逆转链表、链表合并
  9. MarkdownPad2.5 注册码
  10. 大型网站技术架构(3):WEB 前端性能优化