您的位置:首页 > 大数据 > 人工智能

HDU 5372 Segment Game(2015 Multi-University Training Contest 7 1004)

2015-08-12 15:55 495 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5372
题意:

给出n个操作,每个操作有a, b两个数。a=0表示在数轴上放一条端点分别是b和c的线段,c=b+(这次操作是第几次放置线段的操作)。a=1表示删掉第b次放置线段操作所放置的线段。每次a=0时要求输出要插入的线段完全覆盖了多少条线段。

思路:

由于数据范围比较大,先读入所有操作,将所有线段的端点离散化。之后用树状数组依次处理操作,每次要输出的答案为(左端点>=当前线段左端点的线段个数)-(右端点>该线段右端点的个数)。

好久没写离散化,mark一下

code:

#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;

//离散化
class Discr{
public:
int data[400000 + 10];
int cnt;

Discr(){
cnt = 0;
}

//向数字集合里加入一个数
void add(int a){
data[cnt++] = a;
}

//排序并去重
void sort_and_unique() {
sort(data, data + cnt);
int i = 0, j = 0;
for (; i < cnt; ){
data[j] = data[i];
while (i < cnt && data[j] == data[i])i++;
j++;
}
cnt = j;
}

//二分查找某个数离散化之后是什么数字
//从1开始
int get_id(int num){
return lower_bound(data, data + cnt, num) - data + 1;
}
};
Discr dis;

//树状数组
class BinaryIndexedTree{
public:
int in[262150];
static int MAX_SIZE;

void init(){
memset(in, 0, sizeof(in));
}

inline int lowbit(int x){
return x&(-x);
}

// end >= 1
int sum(int end){
int sum = 0;
while (end){
sum += in[end];
end -= lowbit(end);
}
return sum;
}

// pos >= 1
void add(int pos, int num){
while (pos <= MAX_SIZE){
in[pos] += num;
pos += lowbit(pos);
}
}
}bt1, bt2;

int BinaryIndexedTree::MAX_SIZE = 262144;

struct Query{
int type;
int b, c;
};
Query query[200010];
int addId[200010];
int n;

int main(){
int __ = 0;
while (scanf("%d", &n) != EOF){
dis.cnt = 0;
bt1.init(); bt2.init();
for (int i = 1, j = 1; i <= n; i++){
int a, b;
scanf("%d%d", &query[i].type, &query[i].b);
if (query[i].type == 0){
addId[j++] = i;
query[i].c = query[i].b + j;
dis.add(query[i].b);
dis.add(query[i].c);
}
}
dis.sort_and_unique();
printf("Case #%d:\n", ++__);
for (int i = 1; i <= n; i++){
if (query[i].type == 0){
int l = dis.get_id(query[i].b);
int r = dis.get_id(query[i].c);
printf("%d\n", bt2.sum(r) - bt1.sum(l - 1));
bt1.add(l, 1);
bt2.add(r, 1);
}
else{
int id = addId[query[i].b];
int l = dis.get_id(query[id].b);
int r = dis.get_id(query[id].c);
bt1.add(l, -1);
bt2.add(r, -1);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: