#include<bits/stdc++.h>
using namespace std;
const int maxn = 0x3f3f3f3f;
int mn[801000];
int cost[200100];
int dp[200100];
vector<int>v[200100];
void add_edge(int l,int r,int root){
    if(l==r){
        mn[root]=maxn;//叶子节点
        return ;
    }
    int mid=(l+r)/2;
    add_edge(l,mid,root<<1);//递归构造左子树
    add_edge(mid+1,r,(root<<1)+1);//递归构造右子树
    mn[root]=min(mn[root<<1],mn[(root<<1)+1]);//根据左右子树根节点的值,更新当前根节点的值
}
int query(int left,int right,int l,int r,int root){//区间查找,l和r表示当前区间端点,left和right表示查询区间端点
    if(left<=l&&r<=right)//当前节点区间包含在查询区间内
        return mn[root];
    int mid=(l+r)/2;
    int res=maxn;
    if(left<=mid)
        res=min(res,query(left,right,l,mid,root<<1));//分别从左右子树查询,返回两者查询结果的较小值
    if(right>mid)
        res=min(res,query(left,right,mid+1,r,(root<<1)+1));
    return res;
}
void update(int pos/*待更新节点的标*/,int val/*更新的值*/,int l,int r,int root){//当前区间的端点
    if(l==r){
        mn[root]=min(mn[root],val);//找到了相应的节点,更新(这里更新的是叶子节点,会对父节点产生影响)
        return;
    }
    int mid=(l+r)/2;
    if(pos<=mid)
        update(pos,val,l,mid,root<<1);//在左子树中更新
    else
        update(pos,val,mid+1,r,(root<<1)+1);//在右子树中更新
    mn[root]=min(mn[root<<1],mn[(root<<1)+1]);//根据左右子树的值回溯更新当前节点的值
}
int main(){
    int n,q;
    int cnt=0;
    scanf("%d",&n);
    add_edge(1,n,1);
    for(int i=1,j;i<=n;i++){
        scanf("%d",&j);
        cnt+=!j;//b中0的个数
        cost[i]=j?1:-1;//当前bi为1即为1,bi为0即为-1,在加和前x位时即可得到bi为1的数量减去bi为零的数量
    }
    scanf("%d",&q);
    for(int i=0,j,k;i<q;i++){
        scanf("%d%d",&j,&k);
        v[j].push_back(k);//存下区间
    }
    memset(dp,maxn,sizeof(dp));
    dp[0]=0;
    for(int i=1;i<=n;i++){
        int ct = v[i].size();//左端点为i的区间的个数
        for (int k = 0; k < ct;k++){
            int j=v[i][k];//右端点
            int tmp=dp[i-1];
            tmp=min(tmp,query(max(i-1,1)/*i为1时仍为1,其他为i-1*/,j,1,n,1));
            if(tmp<dp[j]){//存在更优解
                dp[j]=tmp;
                update(j,tmp,1,n,1);
            }
        }
        dp[i]=min(dp[i],dp[i-1]+cost[i]);//cost[i]为1表示b[i]=1,cost[i]为-1表示b[i]=0,由于dp[i]表示a0b1-a0b0
    }
    printf("%d\n",dp[n]+cnt);//cnt表示b0的数量
    return 0;
}
/*题目要求求min{(a=0&&b=1)+(a=1&&b=0)},即求min{(a=0&&b=1)+(b=0)-(a=0&&b=0)},
即求b=0+min{(a=0&&b=1)-(a=0&&b=0)},dp[i]表示前i个数的min{(a=0&&b=1)-(a=0&&b=0)}*/
/*线段树适合解决“相邻的区间的信息可以被合并成两个区间的并区间的信息”的问题
附上结构体区间更新的细节讲解http://www.cnblogs.com/TenosDoIt/p/3453089.html*/

ARC085F(动态规划,线段树)的更多相关文章

  1. BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树

    BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意:  约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...

  2. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  3. Codeforces 834D The Bakery - 动态规划 - 线段树

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  4. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  5. 【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树

    [BZOJ3939][Usaco2015 Feb]Cow Hopscotch Description Just like humans enjoy playing the game of Hopsco ...

  6. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)

    相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对.也即要将原序列划分成两个单增序列.由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉. 这个 ...

  7. 【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树

    [BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度 ...

  8. BZOJ 4881: [Lydsy1705月赛]线段游戏 动态规划 + 线段树

    Description quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,. ...

  9. bzoj 1835 base 基站选址 - 动态规划 - 线段树

    题目传送门 需要高级权限的传送门 题目大意 有$n$个村庄坐落在一条直线上,第$i \ \ \ (i>1)$个村庄距离第$1$个村庄的距离为$D_i$.需要在这些村庄中建立不超过$K$个通讯基站 ...

随机推荐

  1. Delphi - 数组和结构体

    技术交流,DH讲解. 记得很早之前我就说过,数组和结构体在内存中其实一样的,他们都是连续分布的.例如: ? 1 2 3 4 TMyStruct = record   A,B,C:Integer; en ...

  2. jQuery 对表单、表格的操作及更多应用-简略笔记

    [jQuery 对表单.表格的操作及更多应用] jquery对表单及表格的操作是实际应用中相当广泛. 对于表单的操作,可以实现 (1)获取和失去焦点改变样式: (2)在多行文本框中可以实现网站评论框的 ...

  3. 目标检测 — Inception-ResNet-v2

    这篇文章介绍的网络有Inception V1.Inception V2.Inception V3.Inception V4与Inception-ResNet-V2. 1.Inception V1 主要 ...

  4. ADO-添加msado15.dll及基本类对象的了解

    一.dll文件的导入 参考文献:https://blog.csdn.net/qq_31209383/article/details/51199762 要使用数据库,首先在stdafx.h中导入msad ...

  5. (转)#ifndef的用法

    原文链接:http://wenku.baidu.com/link?url=c4doqVo3U429RkwTN5eaJIfD2rEu-1bLKKQXuqO8drmL359PhUjVmzC7P94wBY9 ...

  6. Ffmpeg转码研究一

    Ffmpeg是一款功能强大的视频处理工具,那么转码肯定不是问题的,因为项目的需求,对转码进行了研究.刚开始首先去看了ffmpeg源代码中的一个例子transcode.c,但是发现该例子更应该称之为re ...

  7. P2P流媒体开源项目介绍

    P2P流媒体开源项目介绍1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据.节 ...

  8. bzoj 2160: 拉拉队排练 回文自动机

    题目: Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助 ...

  9. 洛谷P2896 [USACO08FEB]一起吃饭Eating Together

    题目描述 The cows are so very silly about their dinner partners. They have organized themselves into thr ...

  10. 系列文章--突袭HTML5之Javascript

    突袭HTML5之Javascript API扩展5 - 其他扩展 突袭HTML5之Javascript API扩展4 - 拖拽 突袭HTML5之Javascript API扩展3 - 本地存储 突袭H ...