• [codeVS] 1191 数轴染色


    题目描述 Description

    在一条数轴上有N个点,分别是1~N。一开始所有的点都被染成黑色。接着
    我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后
    剩余黑色点的个数。

    输入描述 Input Description

    输入一行为N和M。下面M行每行两个数Li、Ri

    输出描述 Output Description

    输出M行,为每次操作后剩余黑色点的个数。

    样例输入 Sample Input

    10 3
    3 3
    5 7
    2 8

    样例输出 Sample Output

    9
    6
    3

    数据范围及提示 Data Size & Hint

    数据限制
    对30%的数据有1<=N<=2000,1<=M<=2000
    对100%数据有1<=Li<=Ri<=N<=200000,1<=M<=200000

    思路

    线段树;

    代码实现

     1 #include<cstdio>
     2 const int maxn=2e5+10;
     3 inline int min_(int x,int y){return x<y?x:y;}
     4 inline int max_(int x,int y){return x>y?x:y;}
     5 int n,m,l,r;
     6 int t[maxn<<2];
     7 void move(int k,int l,int r,int al,int ar){
     8     if(t[k]==r-l+1) return;
     9     if(l==al&&r==ar){
    10         t[k]=r-l+1;
    11         return;
    12     }
    13     int mid=l+r>>1,ls=k<<1,rs=ls|1;
    14     if(al<=mid) move(ls,l,mid,al,min_(ar,mid));
    15     if(ar>mid) move(rs,mid+1,r,max_(al,mid+1),ar);
    16     t[k]=t[ls]+t[rs];
    17 }
    18 int main(){
    19     scanf("%d%d",&n,&m);
    20     for(int i=1;i<=m;i++){
    21         scanf("%d%d",&l,&r);
    22         move(1,1,n,l,r);
    23         printf("%d
    ",n-t[1]);
    24     }
    25     return 0;
    26 }
  • 相关阅读:
    URAL 1658. Sum of Digits(DP)
    HDU 4433 locker(SPFA+DP)
    Vijos 1092 全排列
    POJ 1141 Brackets Sequence(DP)
    HDU 4597 Play Game
    HDU 1693 Eat the Trees(插头DP)
    USACO 5.4 Twofive(DP)
    USACO 5.5 Hidden Password(搜索+优化)
    USACO 5.5 Picture(周长并)
    USACO 5.4 Telecowmunication(最大流+枚举)
  • 原文地址:https://www.cnblogs.com/J-william/p/8067413.html
Copyright © 2020-2023  润新知