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

来源:互联网 发布:网络大电影产值 编辑:程序博客网 时间:2024/06/02 15:16

题目链接:

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 >= 1int sum(int end){int sum = 0;while (end){sum += in[end];end -= lowbit(end);}return sum;}// pos >= 1void 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;}


0 0
原创粉丝点击