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);
            }
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj1681 高斯消元

题目大意: 一个n*n 的方格 ,我们对它进行染色,每个格子都 可以 染成 白色和黄色,( 一旦我们对这个格子染色 ,他的上下左右 都将改变颜色);给定一个初始状态 , 求将 所有的 格子 染成黄色...
  • yp_2013
  • yp_2013
  • 2017年04月08日 10:53
  • 137

hdu5862树状数组加扫描线

树状数组加扫描线的思想 #include #include #include #include #include #include #include #include #include...
  • yp_2013
  • yp_2013
  • 2016年08月18日 23:05
  • 214

Segment Game (hdu 5372 树状数组+离散化)

题意:两种操作,添加线段和删除线段,第i次添加时告诉线段起点并且要添加长度为i的线段,删除第i次添加的线段,问每次添加后有多少线段是落在当前要画的线段内部的。 思路:因为每次画的线段的长度是递增的,所...

HDU 5372 Segment Game - 离散化&树状数组

题目描述表示看错题目的一小部分,wa了两个小时!!!题目大意:有 n 个操作,每次要么插入一条线段,要么删除一条已存在的线段,其中第 i 次插入的线段的长度为 i。 对于每次插入,输出当前插入的线...

hdu 5372 Segment Game(树状数组+离散化)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5372 题意:有两种操作,输入a b,①a==0,插入第i条线段[b,b+i],输出[b,b+i]内有多少...
  • w20810
  • w20810
  • 2015年08月12日 13:12
  • 404

HDU 5372 Segment Game (树状数组+离散化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5372 题面: Segment Game Time Limit: 3000/1500 MS (J...

HDU - 3743 Frosh Week(树状数组+离散化)

题意: 给你一个长度为n的序列(最长100万),每次只能交换相邻的两个数字,问最小交换多少次,能使得序列有序。 解析: 这道题的数据量很大,所以要找规律,最小的排序次数,就是这个序列的逆序数的...

hdu_2227_Find the nondecreasing subsequences_树状数组,离散化

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 题意:给你一个集合,让你求递增子序列有多少个,和树状数组求逆序对差不多,不过数据比较大,要离散化...

hdu-4605 Magic Ball Game[离散化+回溯+树状数组]

题目大意很简单。 有一颗树(10^5结点),所有结点要么没有子结点,要么有两个子结点。 然后每个结点都有一个重量值,根结点是1 然后有一个球,从结点1开始往子孙结点走。 每碰到一个结点,有三种情...

2015 南阳 CCPC hdu 5542 The Battle of Chibi(DP+树状数组优化+离散化)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5542 题目大意: 给一段长为n的序列,现在要找出m个严格递增的数,问这样的找法有多少种。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 5372 离散化加树状数组
举报原因:
原因补充:

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