zoukankan      html  css  js  c++  java
  • Crayon 线段树或者树状数组

    Crayon

    Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
    SubmitStatus

    Problem Description

    Background

    Mary love painting so much, but as we know she can't draw very well. There is no one appreciate her works, so she come up with a puzzle with herself.

    Description

    There are only one case in each input file, the first line is a integer N (N ≤ 1,000,00) denoted the total operations executed by Mary.

    Then following N lines, each line is one of the folling operations.

    • D L R : draw a segment [L, R], 1 ≤ L ≤  R ≤ 1,000,000,000.
    • C I : clear the ith added segment. It’s guaranteed that the every added segment will be cleared only once.
    • Q L R : query the number of segment sharing at least a common point with interval [L, R]. 1 ≤ L ≤ R ≤ 1,000,000,000.

    Input

    n

    Then following n operations ...

    Output

    For each query, print the result on a single line ...

    Sample Input

    6
    D 1 3
    D 2 4
    Q 2 3
    D 2 4
    C 2
    Q 2 3

    Sample Output

    2
    2

    线段树
      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <math.h>
      4 #include <string.h>
      5 #include <algorithm>
      6 using namespace std;
      7 #define ll long long
      8 typedef struct abcd
      9 {
     10     int l,r,ci,i;
     11     char x;
     12 } abcd;
     13 abcd a[110000];
     14 typedef struct abc
     15 {
     16     int x,i;
     17 } abc;
     18 abc c[300000];
     19 int cn=0,b[110000],bn=1;
     20 bool cmp(abc x,abc y)
     21 {
     22     return x.x<y.x;
     23 }
     24 bool cmp1(abcd x,abcd y)
     25 {
     26     return x.l<y.l;
     27 }
     28 bool cmp2(abcd x,abcd y)
     29 {
     30     return x.r<y.r;
     31 }
     32 bool cmp3(abcd x,abcd y)
     33 {
     34     return x.i<y.i;
     35 }
     36 typedef struct tree
     37 {
     38     int a,d,sub;
     39 } tree;
     40 tree t[600000];
     41 void fun(int x)
     42 {
     43     if(t[x].d)
     44     {
     45         t[x<<1].d+=t[x].d;
     46         t[x<<1].sub+=t[x].d;
     47         t[x<<1|1].sub+=t[x].d;
     48         t[x<<1|1].d+=t[x].d;
     49         t[x<<1].a+=t[x].d;
     50         t[x<<1|1].a+=t[x].d;
     51         t[x].d=0;
     52     }
     53 }
     54 void update(int x,int y,int b,int c,int tt,int z)
     55 {
     56     if(x<=b&&y>=c)
     57     {
     58         t[tt].sub+=z;
     59         t[tt].d+=z;
     60         t[tt].a+=z;
     61         return ;
     62     }
     63     if(t[tt].d)
     64     fun(tt);
     65     int m=(b+c)>>1;
     66     if(x<=m&&y>m)t[tt].sub+=z;
     67     if(x<=m)update(x,y,b,m,tt<<1,z);
     68     if(y>m)update(x,y,m+1,c,tt<<1|1,z);
     69     t[tt].a=t[tt<<1].a+t[tt<<1|1].a-t[tt].sub;
     70 }
     71 int query(int x,int y,int b,int c,int tt)
     72 {
     73     if(x<=b&&y>=c)
     74     {
     75         return t[tt].a;
     76     }
     77     if(t[tt].d)
     78     fun(tt);
     79     int m=(b+c)>>1;
     80     int r=0,sub;
     81     if(x<=m)r=query(x,y,b,m,tt<<1);
     82     if(y>m)r=r+query(x,y,m+1,c,tt<<1|1);
     83     t[tt].a=t[tt<<1].a+t[tt<<1|1].a-t[tt].sub;
     84     if(x<=m&&y>m)
     85         return r-t[tt].sub;
     86     else return r;
     87 }
     88 int main()
     89 {
     90     int n,i,j;
     91    //freopen("in.txt","r",stdin);
     92     scanf("%d",&n);
     93     for(i=0; i<n; i++)
     94     {
     95         getchar();
     96         scanf("%c",&a[i].x);
     97         if(a[i].x=='C')
     98         {
     99             scanf("%d",&a[i].ci);
    100         }
    101         else
    102         {
    103             scanf("%d%d",&a[i].l,&a[i].r);
    104             c[cn++].x=a[i].l,c[cn++].x=a[i].r;
    105             if(a[i].x=='D')
    106                 b[bn++]=i;
    107         }
    108         a[i].i=i;
    109     }
    110     int now=2;
    111     sort(c,c+cn,cmp);
    112     c[0].i=1;
    113     for(i=1; i<cn; i++)
    114     {
    115         if(c[i].x==c[i-1].x)
    116             c[i].i=c[i-1].i;
    117         else c[i].i=now++;
    118     }
    119 
    120     sort(a,a+n,cmp1);
    121     j=0;
    122     for(i=0; i<n; i++)
    123     {
    124         while(i<n&&a[i].x=='C')i++;
    125         if(i==n)break;
    126         while(a[i].l!=c[j].x)j++;
    127         a[i].l=c[j].i;
    128     }
    129     sort(a,a+n,cmp2);
    130     j=0;
    131     for(i=0; i<n; i++)
    132     {
    133         while(i<n&&a[i].x=='C')i++;
    134         if(i==n)break;
    135         while(a[i].r!=c[j].x)j++;
    136         a[i].r=c[j].i;
    137     }
    138     sort(a,a+n,cmp3);
    139     /*for(i=0; i<n; i++)
    140         cout<<a[i].x<<" "<<a[i].l<<" "<<a[i].r<<endl;*/
    141     memset(t,0,sizeof(t));
    142     for(i=0; i<n; i++)
    143     {
    144         if(a[i].x=='D')
    145         {
    146             update(a[i].l,a[i].r,1,c[cn-1].i,1,1);
    147         }
    148         else if(a[i].x=='C')
    149         {
    150             update(a[b[a[i].ci]].l,a[b[a[i].ci]].r,1,c[cn-1].i,1,-1);
    151         }
    152         else
    153         {
    154             printf("%d
    ",query(a[i].l,a[i].r,1,c[cn-1].i,1));
    155         }
    156     }
    157 }
    View Code

     树状数组

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <math.h>
      4 #include <string.h>
      5 #include <algorithm>
      6 using namespace std;
      7 #define ll long long
      8 typedef struct abcd
      9 {
     10     int l,r,ci,i;
     11     char x;
     12 } abcd;
     13 abcd a[110000];
     14 typedef struct abc
     15 {
     16     int x,i;
     17 } abc;
     18 abc c[300000];
     19 int cn=0,b[110000],bn=1;
     20 bool cmp(abc x,abc y)
     21 {
     22     return x.x<y.x;
     23 }
     24 bool cmp1(abcd x,abcd y)
     25 {
     26     return x.l<y.l;
     27 }
     28 bool cmp2(abcd x,abcd y)
     29 {
     30     return x.r<y.r;
     31 }
     32 bool cmp3(abcd x,abcd y)
     33 {
     34     return x.i<y.i;
     35 }
     36 int ab[800000][2],m;
     37 int lowbit(int x)
     38 {
     39     return x&(-x);
     40 }
     41 void update(int y,int x,int z)
     42 {
     43     while(x<=m)
     44     {
     45         ab[x][y]+=z;
     46         x+=lowbit(x);
     47     }
     48 }
     49 int query(int y,int x)
     50 {
     51     int sum=0;
     52     while(x>0)
     53     {
     54         sum+=ab[x][y];
     55         x-=lowbit(x);
     56     }
     57     return sum;
     58 }
     59 int main()
     60 {
     61     int n,i,j;
     62    // freopen("in.txt","r",stdin);
     63     scanf("%d",&n);
     64     for(i=0; i<n; i++)
     65     {
     66         getchar();
     67         scanf("%c",&a[i].x);
     68         if(a[i].x=='C')
     69         {
     70             scanf("%d",&a[i].ci);
     71         }
     72         else
     73         {
     74             scanf("%d%d",&a[i].l,&a[i].r);
     75             c[cn++].x=a[i].l,c[cn++].x=a[i].r;
     76             if(a[i].x=='D')
     77                 b[bn++]=i;
     78         }
     79         a[i].i=i;
     80     }
     81     int now=2,sum=0;
     82     sort(c,c+cn,cmp);
     83     c[0].i=1;
     84     for(i=1; i<cn; i++)
     85     {
     86         if(c[i].x==c[i-1].x)
     87             c[i].i=c[i-1].i;
     88         else c[i].i=now++;
     89     }
     90 
     91     sort(a,a+n,cmp1);
     92     j=0;
     93     for(i=0; i<n; i++)
     94     {
     95         while(i<n&&a[i].x=='C')i++;
     96         if(i==n)break;
     97         while(a[i].l!=c[j].x)j++;
     98         a[i].l=c[j].i;
     99     }
    100     sort(a,a+n,cmp2);
    101     j=0;
    102     for(i=0; i<n; i++)
    103     {
    104         while(i<n&&a[i].x=='C')i++;
    105         if(i==n)break;
    106         while(a[i].r!=c[j].x)j++;
    107         a[i].r=c[j].i;
    108     }
    109     sort(a,a+n,cmp3);
    110     /*for(i=0; i<n; i++)
    111         cout<<a[i].x<<" "<<a[i].l<<" "<<a[i].r<<endl;*/
    112     m=c[cn-1].i;
    113     for(i=0; i<n; i++)
    114     {
    115         if(a[i].x=='D')
    116         {
    117             update(0,a[i].l,1);
    118             update(1,a[i].r,1);
    119             sum++;
    120         }
    121         else if(a[i].x=='C')
    122         {
    123             update(0,a[b[a[i].ci]].l,-1);
    124             update(1,a[b[a[i].ci]].r,-1);
    125             sum--;
    126         }
    127         else
    128         {
    129             int ans=query(0,a[i].r);
    130             ans-=query(1,a[i].l-1);
    131             printf("%d
    ",ans);
    132         }
    133     }
    134 }
    View Code
  • 相关阅读:
    AOP AspectJ 字节码 语法 MD
    判断小米华为等系统 MD
    vuejs2.0实现分页组件,使用$emit进行事件监听数据传递
    vuejs2.0实现一个简单的分页
    vuejs2.0使用Sortable.js实现的拖拽功能
    JavaScript之Number、String、Array常用属性与方法手册
    CSS3效果:5种预载动画效果
    vuejs 1.x
    window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果
    如何用JavaScript判断dom是否有存在某class的值?
  • 原文地址:https://www.cnblogs.com/ERKE/p/3852956.html
Copyright © 2011-2022 走看看