题目链接:点击查看

题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的

规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 111

题目分析:正难则反,题目要求删除最少,那么我们思考如何使得保留下来的串最多。考虑 dp[i]dp[i]dp[i] 为以第 iii 个序列为结尾的,可以保留的最多的串的个数,模仿最长不下降子序列的思路,dp[i]=dp[j]+1dp[i]=dp[j]+1dp[i]=dp[j]+1,当且仅当串 iii 和串 jjj 是可以连通的,在本题中判断两个串是否连通,可以用线段树判断是否存在区间交即可

其实更简单的,因为我们转移 dpdpdp 时是线性递推的过程,假如对于第 iii 个串来说,存在区间 [l,r][l,r][l,r] 都是 111 的序列,那么不难看出与区间 [l,r][l,r][l,r] 存在交集的 jjj 串都是可以转移的,但是我们只需要最大值就可以了,所以线段树实际上维护一下区间 [l,r][l,r][l,r] 内最大的 dpdpdp 值就可以了

需要注意的是区间特别大,所以需要离散化一下,动态开点好像会被卡常,输出答案的时候可以转换为 dp 的路径输出问题

代码:

// Problem: D. Ezzat and Grid
// Contest: Codeforces - Codeforces Round #737 (Div. 2)
// URL: https://codeforces.com/contest/1557/problem/D
// Memory Limit: 256 MB
// Time Limit: 2500 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
vector<pair<int,int>>node[N];
int dp[N],pre[N];
bool ban[N];
struct Node {int l,r,mmax,lazy;
}tree[N<<2];
void pushup(int k) {tree[k].mmax=dp[tree[k<<1].mmax]>dp[tree[k<<1|1].mmax]?tree[k<<1].mmax:tree[k<<1|1].mmax;
}
void pushdown(int k) {if(tree[k].lazy) {int lz=tree[k].lazy;tree[k].lazy=0;tree[k<<1].lazy=tree[k<<1|1].lazy=lz;tree[k<<1].mmax=tree[k<<1|1].mmax=lz;}
}
void build(int k,int l,int r) {if(l>r) {return;}tree[k]={l,r,0,0};if(l==r) {return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}
void update(int k,int l,int r,int val) {if(tree[k].l>r||tree[k].r<l) {return;}if(tree[k].l>=l&&tree[k].r<=r) {tree[k].mmax=val;tree[k].lazy=val;return;}pushdown(k);update(k<<1,l,r,val);update(k<<1|1,l,r,val);pushup(k);
}
int query(int k,int l,int r) {if(tree[k].l>r||tree[k].r<l) {return 0;}if(tree[k].l>=l&&tree[k].r<=r) {return tree[k].mmax;}pushdown(k);int ans1=query(k<<1,l,r),ans2=query(k<<1|1,l,r);if(dp[ans1]>dp[ans2]) {return ans1;} else {return ans2;}
}
vector<int>dis;
int get_id(int x) {return lower_bound(dis.begin(),dis.end(),x)-dis.begin()+1;
}
void discreate() {sort(dis.begin(),dis.end());dis.erase(unique(dis.begin(),dis.end()),dis.end());for(int i=1;i<N;i++) {for(auto &it:node[i]) {it.first=get_id(it.first),it.second=get_id(it.second);}}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;read(n),read(m);for(int i=1;i<=m;i++) {int id,l,r;read(id),read(l),read(r);node[id].push_back({l,r});dis.push_back(l),dis.push_back(r);}discreate();build(1,1,dis.size());dp[0]=0,pre[0]=-1;for(int i=1;i<=n;i++) {dp[i]=1,pre[i]=0;for(auto it:node[i]) {int l=it.first,r=it.second;int p=query(1,l,r);if(dp[p]+1>dp[i]) {dp[i]=dp[p]+1;pre[i]=p;}}for(auto it:node[i]) {int l=it.first,r=it.second;update(1,l,r,i);}}int mmax=*max_element(dp+1,dp+1+n);for(int i=1;i<=n;i++) {if(mmax==dp[i]) {int pos=i;while(pos!=-1) {ban[pos]=true;pos=pre[pos];}break;}}vector<int>ans;for(int i=1;i<=n;i++) {if(!ban[i]) {ans.push_back(i);}}cout<<ans.size()<<endl;for(auto it:ans) {cout<<it<<' ';}cout<<endl;return 0;
}

CodeForces - 1557D Ezzat and Grid(线段树+dp)相关推荐

  1. Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

    传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...

  2. Codeforces 1398 F. Controversial Rounds —— 线段树+dp

    This way 题意: 给你一个字符串,有些位置是已知的,有些是未知的,从位置1开始,如果有连续的0或者1大于等于k个,那么就算一轮游戏,然后0,1重新计数.问你当k=1~n的时候,游戏轮数最多是多 ...

  3. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  4. Codeforces 444C DZY Loves Colors 线段树区间更新

    // Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...

  5. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  6. CodeForces - 960F[动态开点线段树优化dp]详解

    题意:给一张有向图,每条边有边权与编号,求一条最长的路径,这条路径的边权与编号都是递增的.(编号指输入顺序) 首先我们回忆一下普通得LIS得做法:就是dp[i]以第i个结尾得最长上升子序列的长度,那么 ...

  7. CodeForces - 487B Strip(线段树+dp+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...

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

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

  9. C2 - Pokémon Army (hard version)(思维+差分/线段树+dp)详解

    https://codeforces.com/contest/1420/problem/C2 这道题十分的锻炼思维,也让我知道了同样是差分,从前面减后面和从后面减前面是有不同的意义的. 还记得c1吗? ...

最新文章

  1. R语言dplyr包as.tbl函数(转化为tibble类型)和is.tbl函数(检查数据是否为tibble类型)实战
  2. C#支持中文的格式化字符长度方法
  3. wampserver 绑定域名 外部可以正常访问
  4. php四则运算出题器_四则运算出题器3
  5. __construct()和__initialize()
  6. [vue] 说说你对vue的错误处理的了解?
  7. c/c++,字符,字符串,各种方式读入与对空格,回车的处理
  8. c++直角坐标系与极坐标系的转换_平面向量的奇技淫巧——斜坐标系的一系列低级研究...
  9. 为什么要用枚举实现单例模式(避免反射、序列化问题)
  10. FFMPEG针对视频操作的基本命令
  11. jstack+top 定位占用资源的进程
  12. webpack 编译完成执行代码
  13. 电商促销页面需要的辅助图形给设计师准备好了,拿走!
  14. [PyTorch] 安装
  15. 7个免费的服务器监控工具
  16. lordPE转自http://blog.sina.com.cn/s/blog_6e8f83bc01014115.html
  17. access数据库应用系统客观题_Access制作客观题考试系统的应用
  18. 西门子PLCSIM仿真PLC的网口连接与设置
  19. 欧式二元期权的定价公式及实现
  20. HackTheBox-Chaos-CTF_解题过程

热门文章

  1. 代码编辑器揭露性格,你是哪一种?
  2. MySQL常见的主从复制架构_如何搭建经典的MySQL 主从复制架构
  3. java主机上切换用户,linux 主机上更换默认的jdk
  4. MySQL总结连接查询
  5. Dubbo集成Zookeeper的实现原理
  6. 垂直拆分后,遇到瓶颈,数据水平拆分
  7. 微服务网关路由过滤作用介绍
  8. 添加拦截器解析用户信息
  9. 单点登录之SessionExpireFilter重置session有效期
  10. 单点登录Redis存储Session及SessionId问题说明与集群实战-1