/**
多校联合2015-muti7-1004
<a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=5372">HDU 5372 Segment Game
<span style="font-family: Arial, Helvetica, sans-serif;"></span><span style="font-family: Arial, Helvetica, sans-serif;"></a></span>
树状数组
*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 400005
#define ll __int64
using namespace std;
int cl[maxn],cr[maxn];
int a[maxn],b[maxn];
int op[maxn];
int dis[maxn],cor;
int n;
void insert(int c[],int i,int val){
// cout<<n<<endl;
while(i<=cor){
c[i]+=val;
i+=(i&(-i));
}
}
int query_sum(int c[],int i){
int s=0;
while(i>0){
s+=c[i];
i-=(i&(-i));
}
return s;
}
int query(int c[],int last){
if(last>cor) return 0;
return query_sum(c,cor)-query_sum(c,last-1);
}
void Init(){
memset(cl,0,sizeof(cl));
memset(cr,0,sizeof(cr));
cor=0;
}
void disc(){ //离散化数组去重
sort(dis,dis+cor);
int t=0;
for(int i=1;i<cor;i++){
if(dis[i]==dis[i-1]) t++;
else dis[i-t]=dis[i];
}
cor-=t;
}
int index(int num){//返回离散值
return lower_bound(dis,dis+cor,num)-dis+1;
}
int main(){
int ii=1;
while(~scanf("%d",&n)){
printf("Case #%d:\n",ii++);
Init();
int l,r,A=1;
for(int i=0;i<n;i++){
scanf("%d%d",&a[i],&b[i]);
if(a[i]==0){
dis[cor++]=b[i];
dis[cor++]=b[i]+A;
A++;
}
}
disc();
A=1;
int ans=0;
for(int i=0;i<n;i++){
if(a[i]==0){
l=index(b[i]);
r=index(b[i]+A);
//左端点及阻断点后的左端点与右端点后的右端点之差即为所求
ans=(query(cl,l)-query(cr,r+1));
printf("%d\n",ans);
insert(cl,l,1);
insert(cr,r,1);
op[A]=b[i];
A++;
}
else{
l=index(op[b[i]]);
r=index(op[b[i]]+b[i]);
insert(cl,l,-1);
insert(cr,r,-1);
}
}
}
return 0;
}

HDU 5372 Segment Game的更多相关文章

  1. 当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game

    http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others)  ...

  2. 2015 Multi-University Training Contest 7 hdu 5372 Segment Game

    Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

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

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

  4. hdu 5372 Segment Game 【 树状数组 】

    给出一些操作, 0是将第i次增加的线段放在b位置,第i次放的线段的长度为i 1是将第b次增加操作放的线段删除 每次增加操作完之后,询问这条线段上面的完整的线段的条数 每次询问统计比这条线段左端点大的线 ...

  5. hdu 1558 Segment set 线段相交+并查集

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  6. HDU HDU1558 Segment set(并查集+判断线段相交)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一 ...

  7. hdu 1558 Segment set

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. hdu 5666 Segment 俄罗斯乘法或者套大数板子

    Segment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem ...

  9. HDU 5666 Segment 数论+大数

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5666 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

随机推荐

  1. JavaScript和Java的区别

    一个是编译型语言(客户端平台必须有仿真器或解释器),一个是解析型语言(不经过编译,直接将文本格式的字符代码发送给浏览器解释执行). 虽然JavaScript与Java有紧密的联系,但却是两个公司开发的 ...

  2. [转载]H3C&nbsp;S3600&nbsp;DHCP-SERVER&nbsp;配置【原创】

    原文地址:H3C S3600 DHCP-SERVER 配置[原创]作者:旅行者萧 案例要求: 在H3C S3600-28TP-SI 的vlan 里配置DHCP server,使用vlan 里部分网段为 ...

  3. Java基础10一面向对象

    抽象 概念:当一个类中没有足够的信息描述一个现实生活中具体存在的事物,那么这个类就是抽象类. 抽象类一般是对概念领域中的描述. 语法: [访问修饰符] abstract class 类名{ } 如: ...

  4. Java基础9一面向对象

    继承 1.特点 a) 要有一定的层次结构,并且具备可传递性. b) 判断两者之间是否有继承关系通过is-a来判断. c) 子类继承了父类,那么子类就继承了父类中所有的属性和方法,但是父类中的私有属性和 ...

  5. 【Oracle】闪回技术

    1.闪回技术描述 2.数据库的准备: --undo表空间要设置成AUTO,设置合适的保存时间.undo表空间: SYS@ENMOEDU> show parameter undo NAME TYP ...

  6. 【从零开始】【Java】【2】项目最开始都有什么鬼

    闲聊 刨其根知其底. 让我们从一开始就慢嚼细咽. 开始 先来看下项目都有什么: 项目结构图 pom文件图 项目结构 项目=核心代码+依赖管理文件+说明文件+IDE配套文件+外部依赖包: 核心代码:sr ...

  7. WIN系统查询版本

    cmd -> DISM /online /Get-CurrentEdition //查询系统版本 WIN+R -> slmgr.vbs -ipk 查询系统注册信息slmgr.vbs -dl ...

  8. mysql 各项操作流程

    启动mysql:进入命令行输入:net start mysql 如果失败则显示:服务名无效,需跳转到指定Bin目录下进行启动mysql, 成功则进行下一步:登陆 :mysql -uroot -proo ...

  9. 微信App支付:微信支付的appid,appsecret,商户号mch_id,微信交易支付密钥(mch_key)在哪里查看

    1-1) 查看微信支付 appid 的方法 微信支付使用的 appid, 是微信服务号的 appid, 需要你登录微信服务号后台, 在 开发-基本配置/开发者ID(AppID) 中查看微信支付 app ...

  10. Steamroller FreeCodeCamp

    function steamroller(arr) { // I'm a steamroller, baby var resultArr = []; for(var i = 0; i < arr ...