ZOJ-1610 Count the Colors
2016-05-24 16:41
393 查看
这道题把每个点表示成线段,比如a表示为a到a+1之间的线段,那么就可以用线段树区间更新加上延迟标记来完成.
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <queue> #define maxn 8005 using namespace std; typedef long long ll; int num[maxn<<2], color[maxn], p[maxn]; void Pushdown(int n){ if(num != -1){ num[n<<1] = num[n<<1|1] = num ; num = -1; } } void Update(int n, int l, int r, int L, int R, int d){ if(l == L && R == r){ num = d; return ; } Pushdown(n); int mid = (l + r) >> 1; if(R <= mid) Update(n<<1, l, mid, L, R, d); else if(L > mid) Update(n<<1|1, mid+1, r, L, R, d); else{ Update(n<<1, l, mid, L, mid, d); Update(n<<1|1, mid+1, r, mid+1, R, d); } } void Query(int n, int l, int r){ if(l == r){ p[l] = num ; return ; } Pushdown(n); int mid = (l + r) >> 1; Query(n<<1, l, mid); Query(n<<1|1, mid+1, r); } int main(){ //freopen("in.txt", "r", stdin); int n; while(scanf("%d", &n) == 1){ int a, b, c; memset(num, -1, sizeof(num)); memset(color, 0, sizeof(color)); for(int i = 1; i <= n; i++){ scanf("%d%d%d", &a, &b, &c); a++, b++; if(a == b) continue; Update(1, 1, 8000, a, b-1, c); } Query(1, 1, 8000); int i = 1; for(; i <= 8000; i++) if(p[i] != -1){ color[p[i]]++; break; } i++; for(; i <= 8000; i++){ if(p[i] != p[i-1] && p[i] != -1){ color[p[i]]++; } } for(int i = 0; i <= 8000; i++){ if(color[i]){ printf("%d %d\n", i, color[i]); } } puts(""); } return 0; }
相关文章推荐
- centos7安装docker
- POJ 1251
- [文摘20160524]为什么你的孩子不像德国孩子那样自律?看过这个就知道怎么做了!
- iOS常识名词解释 2016/04/05
- tabBar的图标不被系统渲染
- Clang Format
- C++ 值传递、指针传递、引用传递
- mysql 修改data目录后 无法使用脚本启动 推荐
- 第13周-交通类(3)
- 模拟实现部分库函数(strcpy,strcmp,strcat,strstr,memcpy,memmove,memset)
- Picasso 图片请求库(工具类)
- Open Baidu webpage and type in Chinese characters to start searching, press “Back” button to go to B
- 3、Git基本的工作流程
- HDU 1669 Monkey and Banana
- JavaScript学习
- RRC连接重配置
- java中GC回收和内存分配
- 《统计学习方法》——概论
- Unity3D中的Update, FixedUpdate, LateUpdate的区别
- file_put_contents 错误:failed to open stream: Invalid argument 一种原因