HDU 5372 Segment Game
/**
多校联合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的更多相关文章
- 当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game
http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others) ...
- 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 ...
- HDU 5372 Segment Game (树状数组)
题意是指第i此插入操作,插入一条长度为i的线段,左端点在b[i],删除某一条线段,问每次插入操作时,被当前线段完全覆盖的线段的条数. 题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端 ...
- hdu 5372 Segment Game 【 树状数组 】
给出一些操作, 0是将第i次增加的线段放在b位置,第i次放的线段的长度为i 1是将第b次增加操作放的线段删除 每次增加操作完之后,询问这条线段上面的完整的线段的条数 每次询问统计比这条线段左端点大的线 ...
- hdu 1558 Segment set 线段相交+并查集
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- HDU HDU1558 Segment set(并查集+判断线段相交)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一 ...
- hdu 1558 Segment set
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 5666 Segment 俄罗斯乘法或者套大数板子
Segment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- HDU 5666 Segment 数论+大数
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5666 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
随机推荐
- luogu2242 公路维修问题
题目大意 把一个高速公路看作由连续排列的一个个格子组成,有n个格子上有坑.给出m,要求出m段区间,使得这m区间覆盖到所有坑(交通管制),且占据的格子数量最少.输出占据的格子数. 题解 换个角度看问题. ...
- Windows下Go语言 幽灵蛛的配置
这里是环境变量 目录结构 在这其中,我主要需要观察src
- contest hunter5105 Cookies
神题 先按贪婪值大到小排序,根据贪心的思想g[i]越大a[i]也越大(这个微扰可以证,给个提示,a>b且c<d 则 (a-b)(c-d)<0 则 ac+bd<ad+bc) DP ...
- I NEED A OFFER!(hdoj--1203--01背包)
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HBase编程 API入门系列之HTable pool(6)
HTable是一个比较重的对此,比如加载配置文件,连接ZK,查询meta表等等,高并发的时候影响系统的性能,因此引入了“池”的概念. 引入“HBase里的连接池”的目的是: 为了更高的,提高程序的并发 ...
- 使用C#正则表达式获取必应每日图片地址
微软的Bing搜索引擎首页每天都会提供了一些有趣的图片,下面使用正则表达式获取图片的地址,不管是在手机app还是在网站上都是很好的图片素材,而且每天更新,非常不错. 首先访问微软的API,该地址返回的 ...
- HTML与CCS(十一)
1.1 HTML介绍 1.1.1 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) s ...
- js 根据固定位置获取经纬度--腾讯地图
1.首先引入jq 和 腾讯地图js <script src="../js/jQuery.js"></script> <script charset=& ...
- testdirector
TestDirector是全球最大的软件测试工具提供商Mercury Interactive公司生产的企业级测试管理工具,也是业界第一个基于Web的测试管理系统
- ORACLE 11g 导出数据
ORACLE 11g 导出 表的时候 不会导出空表 导出空表操作步骤 :(使用PLSQL) 1.打开SQL window 执行下面的 SQL Select 'alter table '||table_ ...