http://acm.hdu.edu.cn/showproblem.php?

pid=5372

Segment Game

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1284    Accepted Submission(s): 375

Problem Description
Lillian is a clever girl so that she has lots of fans and often receives gifts from her fans.



One day Lillian gets some segments from her fans Lawson with lengths of 1,2,3... and she intends to display them by adding them to a number line.At the i-th add operation,she will put the segment with length of i on the number line.Every time she put the segment
on the line,she will count how many entire segments on that segment.During the operation ,she may delete some segments on the line.(Segments are mutually independent)
 
Input
There are multiple test cases.



The first line of each case contains a integer n — the number of operations(1<=n<=2∗105,∑n<=7∗105)



Next n lines contain the descriptions of the operatons,one operation per line.Each operation contains two integers a , b. 



if a is 0,it means add operation that Lilian put a segment on the position b(|b|<109)
of the line.

(For the i-th add operation,she will put the segment on [b,b+i] of the line, with length of i.)



if a is 1,it means delete operation that Lilian will delete the segment which was added at the b-th add operation.
 
Output
For i-th case,the first line output the test case number.



Then for each add operation,ouput how many entire segments on the segment which Lillian newly adds.
 
Sample Input
3
0 0
0 3
0 1
5
0 1
0 0
1 1
0 1
0 0
 
Sample Output
Case #1:
0
0
0
Case #2:
0
1
0
2
Hint
For the second case in the sample: At the first add operation,Lillian adds a segment [1,2] on the line. At the second add operation,Lillian adds a segment [0,2] on the line. At the delete operation,Lillian deletes a segment which added at the first add operation. At the third add operation,Lillian adds a segment [1,4] on the line. At the fourth add operation,Lillian adds a segment [0,4] on the line
 
Author
UESTC
 
Source
 

题意:

每次插入一个线段。或删除一个已存在的线段,每次插入后输出当前插入的线段能完整覆盖存在的几条线段。

题解:对于新插入的线段。查询有多少个线段左端点大于等于该线段的左端点。

再查询有多少个线段的右端点大于该线段右端点, 两者之差就是答案。用两个树状数组搞定。

时间复杂度nlogn

一共就4种情况。画绘图应该能发现。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>
using namespace std;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) pt(x / 10);
putchar(x % 10 + '0');
}
typedef pair<int, int> pii;
typedef long long ll;
const int N = 450007;
struct Tree {
int c[N], maxn;
void init(int n) { maxn = n; for (int i = 0; i <= n; i++)c[i] = 0; }
int lowbit(int x) { return x&-x; }
int sum(int x) {
int ans = 0;
while (x)ans += c[x], x -= lowbit(x);
return ans;
}
void update(int pos, int val) {
while (pos <= maxn)c[pos] += val, pos += lowbit(pos);
}
}A, B;
int n;
set<pii> s;
int op[N], l[N], r[N];
pii a[N];
vector<int>G;
int main() {
int cas = 0;
while (cin>>n) {
G.clear();
int top = 0;
for (int i = 1; i <= n; i++) {
rd(op[i]), rd(l[i]);
if (op[i] == 0)
{
G.push_back(l[i]);
r[i] = l[i] + (++top);
G.push_back(r[i]);
}
}
printf("Case #%d:\n", ++cas);
sort(G.begin(), G.end()); G.erase(unique(G.begin(), G.end()), G.end());
top = 0;
for (int i = 1; i <= n; i++)
if (op[i] == 0) {
l[i] = lower_bound(G.begin(), G.end(), l[i]) - G.begin() + 1;
r[i] = lower_bound(G.begin(), G.end(), r[i]) - G.begin() + 1;
a[++top] = { l[i], r[i] };
}
A.init(G.size()); B.init(G.size());
int all = 0;
for (int i = 1; i <= n; i++)
{
if (op[i] == 0)
{
int ans = B.sum(r[i]);
ans -= A.sum(l[i]-1);
pt(ans); putchar('\n');
A.update(l[i], 1);
B.update(r[i], 1);
all++;
}
else {
A.update(a[l[i]].first, -1);
B.update(a[l[i]].second, -1);
all--;
}
}
}
return 0;
}

当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game的更多相关文章

  1. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

  2. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. NBOJv2 1050 Just Go(线段树/树状数组区间更新单点查询)

    Problem 1050: Just Go Time Limits:  3000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  % ...

  4. BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 两种操作: 1.求序列末尾n个数中的最大值. 2.在序列末尾插入一个数. 分析 线段树求 ...

  5. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  6. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  7. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

  8. ZJOI 2017 树状数组(线段树套线段树)

    题意 http://uoj.ac/problem/291 思路 不难发现,九条カレン醬所写的树状数组,在查询区间 \([1,r]\) 的时候,其实在查询后缀 \([r,n]\) :在查询 \([l,r ...

  9. 【BZOJ3236】【AHOI2013】作业 线段树 分治 树状数组

    题目描述 给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出1.区间\([l,r]\)有多少范围在\([a,b]\)的数:2.区间\([l,r]\)有多 ...

随机推荐

  1. PCB .NET连接MySQL与Oracle DLL文分享件 MySql.Data,Oracle.ManagedDataAccess

    虽然我们C#对SQL SERVER天然的支持,但对于C#要连接MYSQL或Oracle就不同了, 需要用到第3方组件才行,本文将2个组件连接数据库代码与DLL下载地址贴出. 一.C#连接MYSQL   ...

  2. rancher导入k8s集群后添加监控无数据

    1.日志报错 rancher导入k8s集群后添加监控无数据,rancher日志报错: k8s.io/kube-state-metrics/pkg/collectors/builder.go:: Fai ...

  3. [JZOJ3809]设备塔

    其实我并没有JZOJ的号...但既然dalao说了是JZOJ上的题,那就是了吧...... 为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔. 简单的说,这座设备塔是一个漂浮在异空间中 ...

  4. python 3:str.upper()与str.lower()(使字符串字母全部大写或小写)

    name = "Hello,World! Hello,Python!" print(name.upper()) #字母全部大写 print(name.lower()) #字母全部小 ...

  5. github添加公钥出现 github ssh key Key is invalid. Ensure you've copied the file correctly的解决办法

    因为在公钥查看的时候可能是利用了vim明明查看,所以会有换行,导致这个错误,解决方法是用cat命令查看文件,或者其他方式查看,总之公钥不能有换行.

  6. 关于基础的Set 和Get

    先附上一篇文章,讲的很清楚 在Core中,我们要是先这样设置了.在我们对这个上下文做查询工作的时候,例如: var head = _OMSECDatabase.OmsEcorderHead.Where ...

  7. SQL Server对数据进行修改

    SQL Server对数据进行修改,修改数据库中的数据. auto"> <tr style="background:red"> <td>编号 ...

  8. 《计算机图形学基础(OpenGL版)》勘误表

    第1版第1次印刷: 所在页码 所在行 原内容 更正为 41 16 k=Δx/Δy k=Δy/Δx 46 6 s-t=2Δy/Δx(xi+1)+2b+2yi-1 s-t=2Δy/Δx(xi+1)+2b- ...

  9. fiddler抓包 IOS11以上系统

    想要使用fiddler对iphone X进行抓包,按照以前的配置方法,走一遍.还是抓不成,原来是因为IOS11操作系统中,安装完证书之后,还需要再手动信任证书才能正常抓包. 以下内容来自:https: ...

  10. 与Java注释相关的一些知识

    * Html标签:        * <a> 可定义锚,主要有以下两种属性            * href(最重要):创建指向另外一个文档的链接(或超链接)            * ...