[树状数组] hdu 5372 Segment Game

来源:互联网 发布:nginx负载均衡配置 编辑:程序博客网 时间:2024/06/05 00:50

题目分析

    记录左端点、右端点两棵线段树。在添加某线段时,其完全所覆盖的前面的线段数量为:ans=totnumlr
    其中,tot为总线段数,numl为小于当前线段左端点的左端点数,r为大于当前线段右端点的右端点数,numl和r都是没有被覆盖的线段数量,用总数-不合题意数得到的就是合题数。(由于前面的线段长度短,因此无重复)。
    记小于等于当前线段右端点的右端点数为numr,则r=totnumr
    故ans=numrnuml
    另外数据范围太大,需要离散化,由于需要的是左、右端点分别的对应大小关系,故只需分别离散化即可。

代码

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<map>#include<algorithm>#define lson l,mid,cur<<1#define rson mid+1,r,cur<<1|1typedef long long ll;using namespace std;const int maxn = 2e5+7;int maxb;int n;int btl[maxn], btr[maxn];inline int lowbit(int x){return x & -x;}void add(int bit[], int x, int val){for(int i = x; i <= maxb; i+=lowbit(i)) bit[i] += val;}int query(int bit[], int x){    int res = 0;    for(int i = x; i > 0; i -= lowbit(i)) res += bit[i];    return res;}int del[maxn],x[maxn],y[maxn],z[maxn];int ld,ly;int sub[maxn];void disc(int y[], const int &n){    for(int i=1;i<= n; i++) sub[i] = y[i];    sort(sub+1, sub+1 + n);    int *t = unique(sub+1, sub+1+n);    for(int i = 1; i <= n; i++)        y[i] = lower_bound(sub+1, t, y[i]) - sub;}int main(){    int cnt = 1;    while(cin>>n)    {        ld=ly=0;        printf("Case #%d:\n", cnt++);        for(int i = 1; i <= n; i++)        {            scanf("%d",&x[i]);            if(x[i])                scanf("%d", &del[++ld]);            else            {                scanf("%d", &y[++ly]);                z[ly] = y[ly] + ly;            }        }        maxb = ly;        for(int i  = 0; i <= maxb; i++)            btl[i] = btr[i] = 0;        disc(y,ly);        disc(z,ly);        int p1 = 0, p2 = 0;        for(int i = 1; i <= n; i++)        {            if(x[i])            {                add(btl, y[del[++p2]], -1);                add(btr, z[del[p2]], -1);            }            else            {                int l=y[++p1],r=z[p1];                printf("%d\n",query(btr,r)-query(btl,l-1));                add(btl,l,1);                add(btr,r,1);            }        }    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 个人社保忘交了怎么办 个人社保晚交了怎么办 医保晚交了几天怎么办 辞职后转为灵活就业养老怎么办 公司名称变更提取不了公积金怎么办 五险合一软件已经减员怎么办 法人社保不在投标单位怎么办 换工作单位后社保怎么办 在北京孩子没有一老一小怎么办 深户小孩怎么办社保卡 社保卡没办下来去医院住院怎么办 老年社保卡丢了怎么办 外墙掉瓷砖伤车伤人怎么办 医保卡姓名弄错了怎么办 走工伤和走社保怎么办 公司在朝阳社保在海淀怎么办 公司没缴纳个税怎么办 报个税工资报少了怎么办 医院预约单丢了怎么办 肛瘘手术后太疼怎么办 低位保肛手术后吻合口瘘怎么办 做完痔疮手术后大便困难怎么办 20岁长痔疮了怎么办 孕妇痔疮痒的难受怎么办 痔疮术后伤口不愈合怎么办 剖腹产液化伤口长的慢怎么办 内痔斑痕怎么办了能消化 油条面和稀了怎么办 解脲支原体感染怀孕怎么办 怀孕了检查出解脲支原体感染怎么办 大便是黑色的要怎么办 大人直肠给药不好意思怎么办 肛周脓肿长肉芽怎么办 二岁宝宝有直肠息肉怎么办 87岁老人得直肠息肉怎么办 做b超查出囊肿怎么办 解大便时肛门痒怎么办 生完孩子肛门痒怎么办 把达克宁软膏摸到肛门怎么办 痔疮手术后肛门痒怎么办 便秘拉完屁股疼怎么办