hdu 5372 Segment Game 【 树状数组 】
给出一些操作,
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 【 树状数组 】的更多相关文章
- HDU 5372 Segment Game (树状数组)
题意是指第i此插入操作,插入一条长度为i的线段,左端点在b[i],删除某一条线段,问每次插入操作时,被当前线段完全覆盖的线段的条数. 题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端 ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU 4325 Flowers(树状数组+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...
- hdu 5775 Bubble Sort 树状数组
Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
- HDU 3854 Glorious Array(树状数组)
题意:给一些结点,每个结点是黑色或白色,并有一个权值.定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大.给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前 ...
- HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- HDU 5101 Select --离散化+树状数组
题意:n 组,每组有一些值,求 在不同的两组中每组选一个使值的和大于k的方法数. 解法:n * Cnt[n] <= 1000*100 = 100000, 即最多10^5个人,所以枚举每个值x,求 ...
随机推荐
- 347. 前K个高频元素
题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...
- List或者Map等对象创建语句放在循环外和循环内的区别
每一个对象创建的时候都会有一个ID,List对象在执行add方法的时候是将对象的引用放入List中. 如果把创建Map对象的语句放在外面,在将对象add到List中时,前后向List中add的对象都是 ...
- MySQL笔记5-----索引(覆盖索引等)
1.概念: 覆盖索引:(个人理解)就是包含所有查询记录的索引.当查询量过大时可以采用覆盖索引来进行查询,效率较高. 回表:建立覆盖索引就是避免回表,回表效率会很慢. select查询的字段只有索引列, ...
- Python爬虫2------爬虫屏蔽手段之代理服务器实战
1.代理服务器: 一个处于客户端与互联网中间的服务器,如果使用代理服务器,当我们浏览信息的时候,先向代理服务器发出请求,然后由代理服务器向互联网获取信息,再返回给我们. 2.代码: import ...
- NGUI学习随笔
一.NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加.(注:用Component添加无效). 2. ...
- github配置单个及多个sshkey的操作方法
一.配置单个sshkey 配置SSHKey命令操作: git --version //检验git是否装好了 cd / cd ~/.ssh //到master目录下 ll //展示所有文件 ssh-ke ...
- Codeforces 787B Not Afraid( 水 )
链接:传送门 题意:判断 m 组数,如果某一组中出现负数就判断这一组中是否存在与之相反的数,如果每一组中都满足要求则输出 "NO" 反之输出 "YES" 思路: ...
- BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...
- Python Django log日志
log日志 log开发日志 一.创建项目 1.python -m venv ll_env # 创建虚拟环境 2.source ll_env/bin/activate # 激活虚拟环境 3.pip in ...
- Django入门--url路由基本配置
URL(Uniform Resoure Locater)统一资源定位符,是对可以从互联网上得到资源位置和访问方法的一种简洁形式,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含 ...