POJ 2528 Mayor's posters 线段树离散化+区间更新
来源:互联网 发布:php时间戳长度 编辑:程序博客网 时间:2024/05/22 02:10
http://www.douban.com/note/273509745/ 这文章真不错,原来豆瓣不仅仅有影评啊,真是肤浅啊我
题目就是一张墙上贴海报,先贴的会被后贴的覆盖,问最后可以看到多少张海报
题目给的数据 1 <= i <= n, 1 <= li <= ri <= 10000000,
这样直接来超时先不说肯定内存都受不了的,离散化处理,映射的时候没写好,弄了挺久的,太搓了
#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#include<cctype>#define ll long long#define LL __int64#define eps 1e-8#define inf 0xfffffff//const LL INF = 1LL<<61;using namespace std;//vector<pair<int,int> > G;//typedef pair<int,int > P;//vector<pair<int,int> > ::iterator iter;////map<ll,int >mp;//map<ll,int >::iterator p;const int N = 20000 + 5;typedef struct Node {int l,r;int a;};Node tree[N * 4];int le[N * 2],ri[N * 2];int vis[N * 2];int ans;typedef struct Line {int x;//区间端点int num;//编号};Line line[N * 2];//离散化void init() {memset(vis,0,sizeof(vis));ans = 0;}bool cmp(Line x,Line y) {return x.x < y.x;}void build(int l,int r,int id) {tree[id].l = l;tree[id].r = r;tree[id].a = 0;if(l == r)return ;int mid = (l + r)/2;build(l,mid,id<<1);build(mid+1,r,id<<1|1);}void push_down(int id) {if(tree[id].a > 0) {tree[id<<1].a = tree[id].a;tree[id<<1|1].a = tree[id].a;tree[id].a = 0;}}void update(int l,int r,int id,int w) {if(l <= tree[id].l && r >= tree[id].r) {tree[id].a = w;return;}push_down(id);int mid = (tree[id].l + tree[id].r)/2;if(r <= mid)update(l,r,id<<1,w);else if(l > mid)update(l,r,id<<1|1,w);else {update(l,mid,id<<1,w);update(mid+1,r,id<<1|1,w);}}void query(int id) {if(tree[id].a > 0) {if(vis[tree[id].a] == 0) {ans++;vis[tree[id].a] = 1;}return;}query(id<<1);query(id<<1|1);}int main() {int t;scanf("%d",&t);while(t--) {init();int n;scanf("%d",&n);for(int i=0;i<n;i++) {scanf("%d %d",&le[i],&ri[i]);line[i<<1].x = le[i];line[i<<1|1].x = ri[i];line[i<<1].num = -(i + 1);//都是正的话,我比较弱,不好操作,弄个负的好搞line[i<<1|1].num = i + 1;}sort(line,line + 2 * n,cmp);int tmp = line[0].x;int cnt = 1;for(int i=0;i<2*n;i++) {if(tmp != line[i].x) {cnt++;tmp = line[i].x;}if(line[i].num < 0)le[-line[i].num - 1] = cnt;else ri[line[i].num - 1] = cnt;}build(1,cnt,1);for(int i=0;i<n;i++)update(le[i],ri[i],1,i+1);query(1);printf("%d\n",ans);}return 0;}
0 0
- POJ 2528 Mayor's posters 区间离散化线段树
- poj 2528 Mayor's posters(线段树+区间离散化)
- 线段树区间更新,区间统计+离散化 POJ 2528 Mayor's posters
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
- poj 2528 Mayor's posters 线段树+离散化 区间更新
- poj 2528 Mayor's posters(线段树区间更新+离散化)经典题目,较难。。。
- POJ 2528 Mayor's posters 线段树离散化+区间更新
- POJ 2528-Mayor's posters(线段树区间更新+离散化)
- POJ 2528 Mayor's posters (离散化+线段树区间更新)
- poj 2528 Mayor's posters(线段树 离散化 区间更新 贴海报)
- POJ 2528 Mayor's posters // 线段树 区间更新 离散化
- POJ 2528 Mayor's posters 线段树区间更新+离散化
- POJ 2528 Mayor's posters (线段树区间更新 + 离散化)
- Poj 2528 Mayor's posters (线段树区间更新+离散化)
- poj 2528 Mayor's posters(线段树 二分 大数据离散化 区间更新)
- POJ 2528 Mayor's posters (线段树区间更新、离散化)
- poj 2528 Mayor's posters 线段树区间更新 + 离散化
- POJ 2528 Mayor's posters (线段树 区间更新+离散化 经典染色问题)
- Rails中如何避免N+1问题
- C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete
- IATHOOk相关
- 截取系统 API 调用
- opencv 矩阵合并
- POJ 2528 Mayor's posters 线段树离散化+区间更新
- ubuntu上svn的简单用法
- ipcs ipcrm 信号量(命令)+ 共享内存函数shmget、shmat、shmdt、shmctl
- 【问题】使用ifcfg*文件并重启网络服务之后有两个ipv6地址
- 读写ini配置文件时的相对路径问题
- c++ 产生随机数
- EXT日期时间选择控件,目前最好用的版本
- 按位与,按位或,异或等运算
- ReportStudio入门教程(五十九) - JS-设置下拉框默认值