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
- HDU 5372 Segment Game(2015 Multi-University Training Contest 7 1004)
- hdu 5299 Circles Game 2015 Multi-University Training Contest 1
- Multi-University 2015 #7 D(hdu 5372 Segment Game)
- 2016 Multi-University Training Contest 1 C Game(hdu 5725)
- 2015 Multi-University Training Contest 7
- 2015 Multi-University Training Contest 7(HDOJ5379)
- 2015 Multi-University Training Contest 7
- 2015 Multi-University Training Contest 7 Clock
- 2014 Multi-University Training Contest 1 - 1004 / hdu 4864 Task
- 2016 Multi-University Training Contest 1-1004---HDU 5726 GCD
- hdu 5294 Tricks Device 2015 Multi-University Training Contest 1
- hdu 5289 Assignment 2015 Multi-University Training Contest 1
- 2015 Multi-University Training Contest 1 Hdu 5289 Assignment
- 2015 Multi-University Training Contest 1 Hdu 5292 Pocket Cube
- 2015 Multi-University Training Contest 1 Hdu 5297 Y sequence
- HDU 5289 Assignment (2015 Multi-University Training Contest 1)
- hdu 5291 Candy Distribution 2015 Multi-University Training Contest 1
- hdu 5289 Assignment(2015 Multi-University Training Contest 1)
- ftp上传图片的简单用法
- aapt简介及常用命令
- 简单实现类似Spring的在任意代码中获取Request的功能
- Javadoc导出java类的文档结构小结
- Watson之心:DeepQA
- HDU 5372 Segment Game(2015 Multi-University Training Contest 7 1004)
- vivado中改变代码字体的大小
- 在任意线程给Handler发送的消息为什么会在创建Handler的那个线程被执行?
- webservice使用get请求
- 包含对象成员的类 vs普通公有继承的派生类 and 对象成员vs私有继承
- linux学习笔记----目录处理命令----mkdir
- matlab界面语言修改
- hdu 3371 Connect the Cities(prim算法)
- mvc3.0 导出excel文件