给出一些操作,

0是将第i次增加的线段放在b位置,第i次放的线段的长度为i

1是将第b次增加操作放的线段删除

每次增加操作完之后,询问这条线段上面的完整的线段的条数

每次询问统计比这条线段左端点大的线段的条数 L,比这条线段右端点大的线段的条数 R,两个相减就是完整的线段的条数

另外因为给的b很大,所以需要离散化一下,而且b可能会相同,所以相同大小的应该占据一个编号

然后就像求逆序对那样的算

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int n;
int a[maxn],c[maxn],b[maxn]; int lowbit(int x){ return x &(-x);} int sum1(int x){
int ret =;
while(x>){
ret+=c[x];x-=lowbit(x);
}
return ret;
} void add1(int x,int d){
while(x<=maxn){
c[x]+=d;x+=lowbit(x);
}
} int sum2(int x){
int ret =;
while(x>){
ret+=b[x];x-=lowbit(x);
}
return ret;
} void add2(int x,int d){
while(x<=maxn){
b[x]+=d;x+=lowbit(x);
}
} struct node{
int x,y;
int l,r;
int lb,ub;
int id;
int idx;
}; int cmp1(node n1,node n2){
return n1.l < n2.l;
} int cmp2(node n1,node n2){
return n1.r < n2.r;
} node p[maxn],cmd[maxn],add[maxn]; int main(){
int q;
int kase = ;
while(scanf("%d",&q) != EOF){
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(c,,sizeof(c)); int cnt = ;
for(int i = ;i <= q;i++){
scanf("%d %d",&cmd[i].x,&cmd[i].y);
if(cmd[i].x == ){
cmd[i].id = cnt;
add[cnt].l = cmd[i].y; p[cnt].l = cmd[i].y;
add[cnt].r = add[cnt].l + cnt;p[cnt].r = add[cnt].l + cnt;
add[cnt].idx = cnt;p[cnt].idx = cnt;
cnt++;
}
}
printf("Case #%d:\n",++kase); sort(p+,p+cnt,cmp1);
for(int i=,j=;i< cnt;i++){
if(i==||p[i].l != p[i-].l) j++;
add[p[i].idx].lb=j;
} sort(p+,p+cnt,cmp2);
for(int i=,j=;i< cnt;i++){
if(i==||p[i].r != p[i-].r) j++;
add[p[i].idx].ub=j;
} for(int i = ;i <= q;i++){
if(cmd[i].x == ){
int k = cmd[i].id;
int c1 = add[k].lb;
int c2 = add[k].ub;
int l = (k-) - sum1(c1 -);
int r = (k-)- sum2(c2 );
int ans = abs(l-r);
printf("%d\n",ans);
add1(c1,);add2(c2,);
}
if(cmd[i].x == ){
int k = cmd[i].y;
int c1 = add[k].lb;
int c2 = add[k].ub;
int d1 = sum1(c1) - sum1(c1-);
if(d1 != ) add1(c1,-); int d2 = sum2(c2) - sum2(c2-);
if(d2 != ) add2(c2,-);
}
}
}
return ;
}

hdu 5372 Segment Game 【 树状数组 】的更多相关文章

  1. HDU 5372 Segment Game (树状数组)

    题意是指第i此插入操作,插入一条长度为i的线段,左端点在b[i],删除某一条线段,问每次插入操作时,被当前线段完全覆盖的线段的条数. 题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端 ...

  2. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

  3. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

  4. HDU 3333 Turing Tree (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...

  5. HDU 4325 Flowers(树状数组+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...

  6. hdu 5775 Bubble Sort 树状数组

    Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...

  7. HDU - 1541 Stars 【树状数组】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...

  8. HDU 3854 Glorious Array(树状数组)

    题意:给一些结点,每个结点是黑色或白色,并有一个权值.定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大.给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前 ...

  9. HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  10. HDU 5101 Select --离散化+树状数组

    题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数. 解法:n * Cnt[n] <= 1000*100 = 100000, 即最多10^5个人,所以枚举每个值x,求 ...

随机推荐

  1. Java中面向对象三大特性之——封装

    概述 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改. 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问.要访问该类的数据,必须通 ...

  2. vs code格式化代码快捷键

    windows:shift+alt+F ubuntu: ctrl+shift+i

  3. HDU-3015 Disharmony Trees [数状数组]

    Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...

  4. alsa文章

    http://blog.csdn.net/azloong/article/details/6140824 http://blog.csdn.net/tianshuai1111/article/deta ...

  5. matplotlib 显示两张图片,折线图 和 scipy

    显示两张图片的代码: import numpy as np from scipy.misc import imread, imsave, imresize import matplotlib.pypl ...

  6. C#强化系列:HttpModule,HttpHandler,HttpHandlerFactory简单使用

    这三个对象我们在开发Asp.net程序时经常会用到,似乎很熟悉,但有时候又不太确定.本文通过一个简单的例子来直观的比较一下这三个对象的使用.HttpModule:Http模块,可以在页面处理前后.应用 ...

  7. 查看eclipse的安装路径

    在桌面上快捷方式右键  点击属性  起始位置便是.

  8. HDU2188 选拔志愿者

    /* HDU2188 选拔志愿者 http://acm.hdu.edu.cn/showproblem.php?pid=2188 博弈论 巴什博奕 巴什博奕要注意n<=m时是必胜态 * * * * ...

  9. Python爬虫之正則表達式

    1.经常使用符号 .  :匹配随意字符,换行符 \n 除外 *  :匹配前一个字符0次或无限次 ? :匹配前一个字符0次或1次 .*  :贪心算法.尽可能的匹配多的字符 .*?  :非贪心算法 () ...

  10. poj - 1159 - Palindrome(滚动数组dp)

    题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...