hdu 5372 离散化加树状数组

原创 2016年05月31日 08:57:43

注意离散化的时候是对左右端点一起离散化的,所以maxn要开成2倍的~

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+10;
struct node{
    int op,l,r;
}a[maxn];
int c1[maxn<<1],c2[maxn<<1];
int lowbit(int x){
    return x&(-x);
}
void update(int n,int num,int *c){
    while(n<maxn*2){
        c[n]+=num;n+=lowbit(n);
    }
}
int query(int n,int *c){
    int ans=0;
    while(n>0){
        ans+=c[n];n-=lowbit(n);
    }
    return ans;
}
int n,op,l,r;int cas;
int b[maxn<<1];int opt[maxn<<1];
vector<int>vec;
int main(){
    cas=1;
    while(scanf("%d",&n)!=EOF){
        int num=1;vec.clear();int cnt=0;
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=1;i<=n;i++){
            scanf("%d%d",&op,&l);
            if(op==0){
                r=l+num;opt[num]=i;num++;
                b[cnt++]=l;b[cnt++]=r;
            }
            a[i].op=op;a[i].l=l;a[i].r=r;
        }
        sort(b,b+cnt);
        cnt=unique(b,b+cnt)-b;
    //  cout<<"sz = "<<cnt<<endl;
    //  for(int i=0;i<cnt;i++){
    //      cout<<"i = "<<i<<" b [i] = "<<b[i]<<endl;
    //  }
    //  int now=lower_bound(b,b+cnt,5)-b+1;
    //  cout<<" now = "<<now<<endl;*/
        int num1;int num2;
        printf("Case #%d:\n",cas++);
        for(int i=1;i<=n;i++){
            if(a[i].op==0){
                l=lower_bound(b,b+cnt,a[i].l)-b+1;
                r=lower_bound(b,b+cnt,a[i].r)-b+1;
                num1=query(l-1,c1);
                num2=query(r,c2);
                //cout<<" l= "<<l<<" r= "<<r<<endl;
                //cout<<" num1=  "<<num1<<" num2= "<<num2<<endl;  
                printf("%d\n",num2-num1);
                update(l,1,c1);
            /*  cout<<" update check "<<endl;
                for(int i=1;i<=cnt;i++){
                    cout<<" i = "<<i<<" cnt= "<<c1[i]<<endl;  
                }*/
                update(r,1,c2);
            }
            else{
                l=opt[a[i].l];int j=l;
            //  cout<<" (((( l= "<<l<<endl;
            //  cout<<" ======  "<<a[l].l<<" a[r].r = "<<a[l].r<<endl;
            //  system("pause");
                l=lower_bound(b,b+cnt,a[j].l)-b+1;
                r=lower_bound(b,b+cnt,a[j].r)-b+1;
                //system("pause");
                update(l,-1,c1);
                update(r,-1,c2);
            }
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 5792 离散化+树状数组

链接:戳这里 World is Exploding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 6553...
  • libin66
  • libin66
  • 2016年08月02日 21:27
  • 839

离散化+树状数组求逆序数

题目:POJ2299   离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0---999 999 999;显然数组不肯能这么 大;而N的最大范围是50...
  • ACdreamers
  • ACdreamers
  • 2013年01月19日 14:52
  • 4136

HDU 5372 (树状数组 离散化)

Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T...
  • morejarphone
  • morejarphone
  • 2016年05月24日 15:06
  • 233

[离散化+树状数组]逆序对

看到这道题,我只能想到的思路是大暴力。。。我是蒟蒻。。去看了一下树状数组的介绍,还是半懂不懂,看了题解好长时间,才有点明白。树状数组传送门http://blog.csdn.net/int64ago/a...
  • jjqjinqiu
  • jjqjinqiu
  • 2016年05月01日 12:27
  • 233

树状数组--离散化

- 二分 Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status ...
  • idealistic
  • idealistic
  • 2016年08月17日 09:35
  • 304

hdu4325 树状数组+离散化

http://acm.hdu.edu.cn/showproblem.php?pid=4325 Problem Description As is known to all, the b...
  • u013573047
  • u013573047
  • 2015年02月06日 10:09
  • 1041

poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

转自:http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 这里说的很好,把求逆序的步骤说的很明白,我...
  • u012860063
  • u012860063
  • 2015年05月03日 20:03
  • 510

树状数组,离散化,突破口(Segment Game,HDU 5372)

树状数组讲解: http://blog.csdn.net/int64ago/article/details/7429868 经常会遇到一些题目,是一些经典问题的变化,但是各种经典算法无法很好的解决...
  • xl2015190026
  • xl2015190026
  • 2017年07月14日 11:19
  • 80

HDU 1754 树状数组 解法

要询问一个数列的某区间的最大值,其中会更新数据。 这样的题目使用树状数组是可以的,但是因为要牵涉到区间操作,故此还是线段树比较好点。 不过使用树状数组也是可以的,就是查询的时候麻烦点,注意计算,不...
  • kenden23
  • kenden23
  • 2014年06月06日 20:47
  • 869

HDU1540 树状数组+二分

题意: 有一串1,现在 D i 表示将第i个位置的点修改成0,R表示把最晚修改的一个数恢复成0,Q i表示询问包含第i个数在内的最长1串的长度 思路: 网上的代码大多用线段树维护连续区间的左右端...
  • hyc10
  • hyc10
  • 2017年03月29日 22:24
  • 124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 5372 离散化加树状数组
举报原因:
原因补充:

(最多只允许输入30个字)