POJ - 2528 Mayor's posters (线段树离散化+区间更新)
2017-06-09 00:37
423 查看
POJ - 2528 http://poj.org/problem?id=2528
以为过了但是看了discuss,有组数据有问题,先放着,之后会回来改。//在下面改正了。
想要学习骚气的写法所以改了改自己的线段树,第一次自己能主动想到离散化,结果还是有问题。
改了一下,主要是离散化的过程,因为poj是用的段的标号,把它改成点,再离散化,离散化后注意叶子值就不能是一个点了
以为过了但是看了discuss,有组数据有问题,先放着,之后会回来改。//在下面改正了。
想要学习骚气的写法所以改了改自己的线段树,第一次自己能主动想到离散化,结果还是有问题。
//离散化+线段树(区间更新) /*过不了的数据 3 3 5 6 4 5 6 8 3 主要是这组 1 10 1 3 6 10 5 1 4 2 6 8 10 3 4 7 10 */ #include <cstdio> #include <iostream> #include <cstring> #include <map> #include <set> using namespace std; #define met(a,b) memset(a,b,sizeof(a)) #define istr map<int, int> :: iterator map<int,int> id; map<int ,int > val; //离散化 const int maxn = 1e5+10; struct node{int l,r;}q[maxn]; set<int> re; int d[maxn<<1],tag[maxn<<3]; int num = 0;int n; void init() { id.clear(); val.clear(); re.clear(); num = 0; met(d,0); met(tag,0); } void pre() { for(int i = 1 ; i <= n ; i++) { int a,b; scanf("%d%d",&a,&b); id[a] = 1,id[b] = 1; q[i].l = a; q[i].r = b; } istr it = id.begin(); for(; it != id.end(); it++) id[it->first] = ++num; } void pushup(int t,int id) { tag[id<<1] = tag[id<<1|1] = t; tag[id] = 0; } void add(int al,int ar,int v,int l,int r,int id) { if(r < al || l > ar ) return; if(r <= ar && l >= al){tag[id] = v;return ;} if(tag[id]) pushup(tag[id],id); int m = l+r>>1; if(al <= m) add(al,ar,v,l,m,id<<1); if(ar > m) add(al,ar,v,m+1,r,id<<1|1); } void query(int ql,int qr,int id,int l,int r) { //cout<<" l r" << l << " " << r<<endl; if(r < ql || l > qr) return; if(tag[id]) { for(int i = l; i <= r; i++) d[i] = tag[id]; return; } int m = l+r>>1; query(ql,qr,id<<1,l,m); query(ql,qr,id<<1|1,m+1,r); } int main() { int t; scanf("%d",&t); while(t--) { init(); scanf("%d",&n); pre(); for(int i = 1; i <= n; i++) add(id[q[i].l],id[q[i].r],i,1,num,1); query(1,num,1,1,num); int ans = 0; //cout<<num<<endl; //for(int i = 1; i <= num; i++) //cout<<d[i]<<endl; for(int i = 1; i <= num; i++) { if(re.count(d[i]) == 0 && d[i] != 0) { ans++; re.insert(d[i]); } } printf("%d\n",ans); } return 0; }
改了一下,主要是离散化的过程,因为poj是用的段的标号,把它改成点,再离散化,离散化后注意叶子值就不能是一个点了
#include <cstdio> #include <iostream> #include <cstring> #include <map> #include <set> #include <algorithm> using namespace std; #define met(a,b) memset(a,b,sizeof(a)) #define istr map<int, int> :: iterator map<int,int> id; const int maxn = 2e5+10; int x[maxn<<2]; struct node{int l,r;}q[maxn]; set<int> re; int d[maxn << 2],tag[maxn << 3]; int xnum = 0;int n; void init() { id.clear(); re.clear(); xnum = 0; met(d,0); met(tag, c761 0); } void pre() { for(int i = 1 ; i <= n ; i++) { int a,b; scanf("%d%d",&a,&b); x[xnum++] = a; x[xnum++] = ++b; q[i].l = a; q[i].r = b; } sort(x,x + xnum); xnum = unique(x, x + xnum) - x; for(int i = 0; i < xnum; i++) { id[ x[i] ] = i + 1; } } void pushup(int t,int id) { tag[id<<1] = tag[id<<1|1] = t; tag[id] = 0; } void add(int al,int ar,int v,int l,int r,int id) { //cout<<"id l r "<<id<<" "<< l << " " << r <<endl; if(r < al || l > ar ) return; if(r <= ar && l >= al){tag[id] = v;return ;} if(r == l+1){return;} if(tag[id]) pushup(tag[id],id); int m = l+r>>1; if(al < m) add(al,ar,v,l,m,id<<1); if(ar >= m) add(al,ar,v,m,r,id<<1|1); } void query(int id,int l,int r) { if(tag[id]) { //cout<<id<<endl; for(int i = l; i < r; i++) d[i] = tag[id]; tag[id] = 0; return; } if(r == l+1) return; int m = l+r>>1; query(id<<1,l,m); query(id<<1|1,m,r); } int main() { //freopen("D:\\in.txt","r",stdin); int t; scanf("%d",&t); while(t--) { init(); scanf("%d",&n); pre(); for(int i = 1; i <= n; i++) { // int rid = q[i].l == q[i].r? id[q[i].r] : id[q[i].r] - 1; add(id[q[i].l],id[q[i].r],i,1,xnum,1); } query(1,1,xnum); int ans = 0; for(int i = 1; i <= xnum; i++) { //cout<<d[i]<<"\t"; if(re.count(d[i]) == 0 && d[i] != 0) re.insert(d[i]),ans++; } //cout<<endl; printf("%d\n",ans); } return 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[线段树][区间更新]
- poj 2528 Mayor's posters(线段树区间覆盖、离散化)
- poj 2528 Mayor's posters 线段树+离散化 区间更新