题意

有长度为n初始全为0的数组A和仅由0和1组成的数组B。现在给出m个区间,每次可以选择某个区间[l,r],使得A数组下标在[l,r]之间的元素变为1。问A和B最小不同位置数量是多少。
n,m<=200000

分析

比赛的时候看成是区间取反,就以为这是道不可做题。
这题的题解用了比较巧妙的转化方式。把(ai,bi)看成是一个数对,那么答案其实就是(1,0)和(0,1)的数量,也就相当于(0,1)+(@,0)-(0,0)的最小值,其中@表示可以取任意值。注意到(@,0)的数量是固定的,那么要求的实际就是(0,1)-(0,0)的最小值,也就是说,1的没有贡献的。
然后就可以大力dp了。
设f[i,j]表示前i个数已经确定,且当前的最后一个1在位置j时的最小代价。
我们可以枚举以i为起点的区间,设为[i,r]
那么有f[i,r]=min(f[i-1,k]+w[k+1,i-1])。其中若l>r则w[l,r]=0,反之则w[l,r]为b[l,r]中1的数量-0的数量。
用线段树优化即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int N=200005;
const int inf=1000000000;int n,m,s1[N],s0[N];
struct tree{int mn,tag;}t[N*5];
vector<int> vec[N];
pair<int,int> a[N];int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}void pushdown(int d,int l,int r)
{if (!t[d].tag||l==r) return;int w=t[d].tag;t[d].tag=0;t[d*2].tag+=w;t[d*2+1].tag+=w;t[d*2].mn+=w;t[d*2+1].mn+=w;
}void ins(int d,int l,int r,int x,int y)
{pushdown(d,l,r);if (l==r) {t[d].mn=min(t[d].mn,y);return;}int mid=(l+r)/2;if (x<=mid) ins(d*2,l,mid,x,y);else ins(d*2+1,mid+1,r,x,y);t[d].mn=min(t[d*2].mn,t[d*2+1].mn);
}void modify(int d,int l,int r,int x,int y,int z)
{if (x>y) return;pushdown(d,l,r);if (l==x&&r==y) {t[d].tag+=z;t[d].mn+=z;return;}int mid=(l+r)/2;modify(d*2,l,mid,x,min(y,mid),z);modify(d*2+1,mid+1,r,max(x,mid+1),y,z);t[d].mn=min(t[d*2].mn,t[d*2+1].mn);
}int query(int d,int l,int r,int x,int y)
{if (x>y) return inf;pushdown(d,l,r);if (l==x&&r==y) return t[d].mn;int mid=(l+r)/2;return min(query(d*2,l,mid,x,min(y,mid)),query(d*2+1,mid+1,r,max(x,mid+1),y));
}int main()
{n=read();for (int i=1;i<=n;i++){s0[i]=s0[i-1];s1[i]=s1[i-1];int x=read();if (!x) s0[i]++;else s1[i]++;}m=read();for (int i=1;i<=m;i++) a[i].first=read(),a[i].second=read();sort(a+1,a+m+1);for (int i=1;i<=m;i++) vec[a[i].first].push_back(a[i].second);for (int i=1;i<=n*4+4;i++) t[i].mn=inf;ins(1,0,n,0,0);for (int i=1;i<=n;i++){for (int j=0;j<vec[i].size();j++) ins(1,0,n,vec[i][j],query(1,0,n,0,vec[i][j]));if (s1[i]-s1[i-1]) modify(1,0,n,0,i-1,1);else modify(1,0,n,0,i-1,-1);}printf("%d",query(1,0,n,0,n)+s0[n]);return 0;
}

AtCoder Regular Contest 085 F NRE 线段树优化dp相关推荐

  1. [Atcoder ARC085 F] NRE 线段树优化dp

    Atcoder ARC085 F NRE 海明距离好像不知道是什么东西,这道题目还是直接看DOFY dalao的题解的. 似乎这道题目只能有一种设计状态的方法,其他方法都会GG. 设f[i][j]表示 ...

  2. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)

    题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...

  3. CF 474E Pillars(线段树优化DP)

    CF 474E Pillars 题目描述 Marmot found a row with n n n pillars. The i i i -th pillar has the height of h ...

  4. AtCoder Regular Contest 100 E - Or Plus Max Sos dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为2n2^n2n的数组,让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的ai+aj,0≤i<j≤2n−1 ...

  5. hdu 4521(线段树优化dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Pro ...

  6. CF834D. The Bakery(线段树优化dp 决策单调性优化dp)

    linkkkkk 题意: 将一个长度为 n 的序列分为 m段,使得总价值最大. 一段区间的价值表示为区间内不同数字的个数. n≤35000,m≤50 思路: 考虑朴素的dpdpdp方程:dp[i][j ...

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

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

  8. 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...

  9. [CF1603D] Artistic Partition——欧拉函数,线段树优化DP

    [CF1603D] Artistic Partition 题解 问题其实就是要你把 1 ∼ n 1\sim n 1∼n 分成 k k k 段,最小化每一段的 c c c 值的和. 首先我们会想到,如果 ...

最新文章

  1. PHP autoload实践
  2. java https双向验证_java https双向认证证书
  3. 漫谈LiteOS之开发板-串口(基于GD32450i-EVAL)
  4. csv文件怎么转成excel_Python操作Excel文件(1):花式大师pyexcel
  5. [原创]java WEB学习笔记54:Struts2学习之路--- 编写Struts2 的第一个程序,HelloWord,简述 package ,action,result...
  6. 微信公众平台开发者原理图解
  7. Word怎么转换成PDF?
  8. easyui打开新的选项卡_easyUI多选项卡后台模板主题_easyUI Tabs选项卡_easyUI模板
  9. 华为eSight 监控AR系列路由器端口流量
  10. 基于单片机的空气质量(PM2.5)监测系统设计(#0423)
  11. 自由浮动时间与总浮动时间
  12. 关于工业相机的基本知识
  13. jedis的Read timed out异常解决
  14. 计算机关机 休眠睡眠有什么区别,电脑“关机”、“睡眠”、“休眠”三者区别是什么...
  15. 【淘宝商家应用接口】拼多多平台流量解析,如何充分利用平台分配的流量?
  16. JsonMappingException: Problem deserializing 'setterless' property '': get method returned null
  17. 拆字在线版-扌斥字在纟戋片反【转】------字库增强版
  18. 新手向,从用Spark求平均值到reduceByKey详解
  19. WIN7开机后网络连接启动慢的手动解决方法
  20. 爱奇艺携手网心科技构建下一代混合CDN,入选IDC中国边缘云最佳实践

热门文章

  1. 泰森多边形之边界计算
  2. 苹果证书99美元_苹果打破2万亿美元壁垒创造华尔街历史
  3. iPhone 4G 的工程样机
  4. springboot集成XXL-JOB分布式任务调度平台
  5. 大数据Flink(四):Standalone独立集群模式
  6. 任务调度系统(定时任务)
  7. squeezenet论文详解
  8. android 千位分隔符 价格分隔符
  9. Tapestry的数据校验功能
  10. 遗传算法及其Matlab实现