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:
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; }
相关文章推荐
- container_of()详解
- TIME_WAIT 与 CLOSE_WAIT
- 2015 Multi-University Training Contest 7(HDOJ5379)
- 2015 Multi-University Training Contest 6(hdu5362 - Just A String)dp求期望
- 219 Contains Duplicate II
- OC_ self , 属性特性readwrite readonly assign retain copy nonatomic
- [BZOJ1660] [Usaco2006 Nov]Bad Hair Day 乱发节
- TEXT CLASSIFICATION FOR SENTIMENT ANALYSIS – NAIVE BAYES CLASSIFIER
- 2015 Multi-University Training Contest 7 1011
- HDU 4750 Count The Pairs
- 1086. Tree Traversals Again (25)
- 1086. Tree Traversals Again (25)
- hdu 3571 Hotaru's problem || 2015 Multi-University Training Contest 7 (manacher算法)
- 217 Contains Duplicate
- hdu 1532 Drainage Ditches 最大流 dinic算法
- hdu 1532 Drainage Ditches 最大流 dinic算法
- 一个简单的wed服务器SHTTPD(9)————main函数文件,Makefile,头文件
- Post方法调用公司发Mail的接口
- 关于List contains方法的一些使用心得
- Hdu 2015 Multi-University Training Contest7