Description

设有一长度为n的初始每个位置均为0的序列A。再给定一个长度为n的01序列B。
有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变。
现在你需要最小化A,B的海明距离。即最小化对应数值不同的位置数目。

Input

第一行包括一个整数n。
接下来一行n个整数,描述序列B。
输入一行一个整数Q。
接下来Q行,每行两个整数li,ri 。

Output

输出最小的海明距离。

Sample Input

输入1:

9
0 1 0 1 1 1 0 1 0
3
1 4
5 8
6 7

输入2:

15
1 1 0 0 0 0 0 0 1 0 1 1 1 0 0
9
4 10
13 14
1 7
4 14
9 11
2 6
7 8
3 12
7 13

Sample Output

输出1:

3

输出2:

5

Data Constraint

Solution

  • 首先将区间按左端点从小到大排序,依次处理。

  • 设 f[i]f[i] 表示做到第 ii 个区间时对答案的贡献(即不选的答案 - 最优答案)。

  • 再设 p[i]p[i] 表示从 1 到 i 的答案贡献前缀和(当前位置是 1 则加一,0 则减一)。

  • 那么转移区间 i 就有两种情况:

    1. 当区间 j 与区间 i 没有相交(r[j]<l[i]r[j]) ,则:

      f[i]=max{f[j]+sum[r[i]]−sum[l[i]−1]}

      f[i]=max\{f[j]+sum[r[i]]-sum[l[i]-1]\}

    2. 当区间 j 与区间 i 相交了(l[i]≤r[j]l[i]\leq r[j]) ,则:

      f[i]=max{f[j]+sum[r[i]]−sum[r[j]]}

      f[i]=max\{f[j]+sum[r[i]]-sum[r[j]]\}

  • 那么我们只需用线段树维护一下 f[i]f[i] 和 f[i]−sum[r[i]]f[i]-sum[r[i]] 两个值的最大值来转移即可。

  • 时间复杂度 O(N log N)O(N\ log\ N) 。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=2e5+1;
struct data
{int x,y;
}g[N<<2],b[N];
int sum,ans;
int a[N],f[N],p[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool cmp(data x,data y)
{return x.x<y.x || x.x==y.x && x.y<y.y;
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline void change(int v,int l,int r,int x,int y,bool pd)
{if(l==r){if(pd) g[v].y=y; else g[v].x=y;return;}int mid=l+r>>1;if(x<=mid) change(v<<1,l,mid,x,y,pd); else change(v<<1|1,mid+1,r,x,y,pd);if(pd) g[v].y=max(g[v<<1].y,g[v<<1|1].y); else g[v].x=max(g[v<<1].x,g[v<<1|1].x);
}
inline int find(int v,int l,int r,int x,int y,bool pd)
{if(l>=x && r<=y) return pd?g[v].y:g[v].x;int mid=l+r>>1;if(y<=mid) return find(v<<1,l,mid,x,y,pd);if(x>mid) return find(v<<1|1,mid+1,r,x,y,pd);return max(find(v<<1,l,mid,x,mid,pd),find(v<<1|1,mid+1,r,mid+1,y,pd));
}
int main()
{int n=read();for(int i=1;i<=n;i++){sum+=a[i]=read();p[i]=p[i-1]+(a[i]?1:-1);}int m=read();for(int i=1;i<=m;i++) b[i].x=read(),b[i].y=read();sort(b+1,b+1+m,cmp);memset(g,128,sizeof(g));memset(f,128,sizeof(f));for(int i=1;i<=m;i++){int num=b[i].x-1?find(1,1,n,1,b[i].x-1,false):0;if(num<0) num=0;f[i]=max(f[i],num+p[b[i].y]-p[b[i].x-1]);num=find(1,1,n,b[i].x,b[i].y,true);f[i]=max(f[i],num+p[b[i].y]);change(1,1,n,b[i].y,f[i],false);change(1,1,n,b[i].y,f[i]-p[b[i].y],true);ans=max(ans,f[i]);}printf("%d",sum-ans);return 0;
}

JZOJ 5489. 【清华集训2017模拟11.28】海明距离相关推荐

  1. JZOJ 5490. 【清华集训2017模拟11.28】图染色

    Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...

  2. JZOJ 5484. 【清华集训2017模拟11.26】快乐树

    Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...

  3. JZOJ 5483. 【清华集训2017模拟11.26】简单路径

    Description 给定一棵带边权的树,选择两条没有公共边的简单路径(长度可以为0),使得所有在任意一条路径上的边的异或和尽量大. Input 第一行一个数n表示点数,点的编号是0到n-1. 接下 ...

  4. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

  5. JZOJ5498. 【清华集训2017模拟12.10】大佬的难题

    Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...

  6. [JZOJ5498]【清华集训2017模拟12.10】大佬的难题

    Description 给出三个1~n的排列a,b,c 求 ∑1≤i,j≤n[ai<aj][bi<bj][ci<cj] \sum\limits_{1\leq i,j\leq n}[a ...

  7. 【清华集训2017模拟】Catalan

    Description 求Cnmod3814697265625(518)C_n \mod 3814697265625(5^{18})其中CnC_n为卡特兰数第n项 n<=10^18,T<= ...

  8. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  9. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

最新文章

  1. Android AIDL示例-回调方法版
  2. dbms_metadata.get_ddl的使用总结
  3. nginx动静分离配置_Nginx 动静分离与负载均衡的实现
  4. 一上来,就问原理,问上亿(MySQL)大表的索引优化,我的天...
  5. java 数据库操作教程_数据库基本操作:增删改查及联表操作
  6. PDF文档解析,公司公告信息抽取(附数据集)
  7. 主力用计算机吸筹,通达信主力吸筹指标
  8. Mapbox矢量切片本地化(离线)生成与发布方案
  9. GIS系列专题(2):Clipper计算机图形库使用说明(Vatti‘s clipping algorithm),类似刀具补偿
  10. python中无法安装xpath库,Python爬虫 | xpath的安装
  11. 陕西电大计算机上机考试题,XX年电大计算机上机操作题(带答案)
  12. js定时器介绍:倒计时定时器setTimeout、间隔定时器setInterval
  13. android手机图片和价格,安卓拍照手机强势推荐及报价【图文】
  14. UI灵感分析笔记#3(22.1.2)
  15. 反激式开关电源-手机充电器5V/1A
  16. 7-9 兔子繁衍问题分数 15
  17. 屋面房顶白色外壁降温用凉凉胶隔热面漆 隔热性能十分优异
  18. python爬取58上的招聘信息
  19. 计算机主板按那三种方法分类,如何查看计算机主板型号,几秒钟即可了解三种方法...
  20. web APIS DOM&&BOM

热门文章

  1. 转]Window, Linux动态链接库的分析对比
  2. improve php,解析提高PHP执行效率
  3. [云炬创业基础笔记]第五章创业机会评估测试7
  4. [我的1024开源程序]60元写的宠物网页和音乐网页
  5. 云炬Android开发教程 查看android studio版本
  6. 系列笔记 | 深度学习连载(2):梯度下降
  7. 深度学习 500 问!一份火爆 GitHub 的面试手册
  8. 台湾大学林轩田机器学习基石课程学习笔记7 -- The VC Dimension
  9. Unet项目解析(1): run_training.py
  10. 静态链接中的那点事儿(1)