题目大意:给出一些海报和贴在墙上的区间。问这些海报依照顺序贴完之后,最后能后看到多少种海报。

思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化。

之后用线段树随便搞搞就能过。

关键是离散化的方法,这个题我时隔半年才A掉,之前一直就TTT,我还以为是线段树写挂了。

当我觉得我自己的水平这样的水线段树已经基本写不挂的时候又写了这个题,竟然还是T。

后来我对照别人的代码,才发现是我的离散化写渣了。

以下附AC代码(79ms),这个离散化写的比較优雅。时间也非常快,以后就这么写了。

CODE(POJ 79ms):

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100010
#define LEFT (pos << 1)
#define RIGHT (pos << 1|1)
using namespace std; pair<int,int> interval[MAX];
pair<int,int *> src[MAX << 1]; int cases;
int tree[MAX << 2];
int intervals;
int cnt,t;
bool color[MAX]; inline void Initialize()
{
t = cnt = 0;
memset(color,false,sizeof(color));
memset(tree,0,sizeof(tree));
} inline void PushDown(int pos)
{
if(tree[pos]) {
tree[LEFT] = tree[pos];
tree[RIGHT] = tree[pos];
tree[pos] = 0;
}
} inline void Modify(int l,int r,int x,int y,int pos,int c)
{
if(l == x && y == r) {
tree[pos] = c;
return ;
}
PushDown(pos);
int mid = (l + r) >> 1;
if(y <= mid) Modify(l,mid,x,y,LEFT,c);
else if(x > mid) Modify(mid + 1,r,x,y,RIGHT,c);
else {
Modify(l,mid,x,mid,LEFT,c);
Modify(mid + 1,r,mid + 1,y,RIGHT,c);
}
} void GetAns(int l,int r,int pos)
{
if(tree[pos]) {
color[tree[pos]] = true;
return ;
}
if(l == r) return ;
int mid = (l + r) >> 1;
GetAns(l,mid,LEFT);
GetAns(mid + 1,r,RIGHT);
} int main()
{
for(cin >> cases; cases; --cases) {
scanf("%d",&intervals);
Initialize();
for(int i = 1; i <= intervals; ++i) {
scanf("%d%d",&interval[i].first,&interval[i].second);
src[++cnt] = make_pair(interval[i].first,&interval[i].first);
src[++cnt] = make_pair(interval[i].second,&interval[i].second);
}
sort(src + 1,src + cnt + 1);
for(int i = 1; i <= cnt; ++i)
{
if(src[i].first != src[i - 1].first) ++t;
*src[i].second = t;
}
for(int i = 1; i <= intervals; ++i)
Modify(1,cnt,interval[i].first,interval[i].second,1,i);
GetAns(1,cnt,1);
int ans = 0;
for(int i = 1; i <= intervals; ++i)
ans += color[i];
printf("%d\n",ans);
}
return 0;
}

为了警醒后人,也为了警醒自己(以后再也不这么写离散化了)。我将我T的离散化代码也发上来,好孩子千万不要学习。

CODE(POJ TLE):

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 1000010
#define LEFT (pos << 1)
#define RIGHT (pos << 1|1)
using namespace std; pair<int,int> interval[MAX];
map<int,int> G; int cases;
int tree[MAX << 2];
int intervals,src[MAX << 1];
int cnt,t;
bool color[MAX]; inline void Initialize()
{
G.clear();
t = cnt = 0;
memset(color,false,sizeof(color));
memset(tree,0,sizeof(tree));
} inline void PushDown(int pos)
{
if(tree[pos]) {
tree[LEFT] = tree[pos];
tree[RIGHT] = tree[pos];
tree[pos] = 0;
}
} inline void Modify(int l,int r,int x,int y,int pos,int c)
{
if(l == x && y == r) {
tree[pos] = c;
return ;
}
PushDown(pos);
int mid = (l + r) >> 1;
if(y <= mid) Modify(l,mid,x,y,LEFT,c);
else if(x > mid) Modify(mid + 1,r,x,y,RIGHT,c);
else {
Modify(l,mid,x,mid,LEFT,c);
Modify(mid + 1,r,mid + 1,y,RIGHT,c);
}
} void GetAns(int l,int r,int pos)
{
if(tree[pos]) {
color[tree[pos]] = true;
return ;
}
if(l == r) return ;
int mid = (l + r) >> 1;
GetAns(l,mid,LEFT);
GetAns(mid + 1,r,RIGHT);
} int main()
{
for(cin >> cases; cases; --cases) {
scanf("%d",&intervals);
Initialize();
for(int i = 1; i <= intervals; ++i) {
scanf("%d%d",&interval[i].first,&interval[i].second);
src[++cnt] = interval[i].first;
src[++cnt] = interval[i].second;
}
sort(src + 1,src + cnt + 1);
G[src[1]] = ++t;
for(int i = 2; i <= cnt; ++i)
if(src[i] != src[i - 1])
G[src[i]] = ++t;
for(int i = 1; i <= intervals; ++i)
Modify(1,cnt,G[interval[i].first],G[interval[i].second],1,i);
GetAns(1,cnt,1);
int ans = 0;
for(int i = 1; i <= intervals; ++i)
ans += color[i];
printf("%d\n",ans);
}
return 0;
}

后来我和小伙伴门一起研究了这样的离散化方法,正常来说是不会T的,尽管多带了一个log。可是这个题是多组数据啊。坑啊,每一组数据就要clear一下map。据老师说map的clear是一个一个删的。。

。于是机制的我就每次new一个map,这样就不用clear了。结果交上去果然A了。

CODE(POJ 344ms):

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 1000010
#define LEFT (pos << 1)
#define RIGHT (pos << 1|1)
using namespace std; pair<int,int> interval[MAX];
map<int,int> *G; int cases;
int tree[MAX << 2];
int intervals,src[MAX << 1];
int cnt,t;
bool color[MAX]; inline void Initialize()
{
G = new map<int,int>;
t = cnt = 0;
memset(color,false,sizeof(color));
memset(tree,0,sizeof(tree));
} inline void PushDown(int pos)
{
if(tree[pos]) {
tree[LEFT] = tree[pos];
tree[RIGHT] = tree[pos];
tree[pos] = 0;
}
} inline void Modify(int l,int r,int x,int y,int pos,int c)
{
if(l == x && y == r) {
tree[pos] = c;
return ;
}
PushDown(pos);
int mid = (l + r) >> 1;
if(y <= mid) Modify(l,mid,x,y,LEFT,c);
else if(x > mid) Modify(mid + 1,r,x,y,RIGHT,c);
else {
Modify(l,mid,x,mid,LEFT,c);
Modify(mid + 1,r,mid + 1,y,RIGHT,c);
}
} void GetAns(int l,int r,int pos)
{
if(tree[pos]) {
color[tree[pos]] = true;
return ;
}
if(l == r) return ;
int mid = (l + r) >> 1;
GetAns(l,mid,LEFT);
GetAns(mid + 1,r,RIGHT);
} int main()
{
for(cin >> cases; cases; --cases) {
scanf("%d",&intervals);
Initialize();
for(int i = 1; i <= intervals; ++i) {
scanf("%d%d",&interval[i].first,&interval[i].second);
src[++cnt] = interval[i].first;
src[++cnt] = interval[i].second;
}
sort(src + 1,src + cnt + 1);
(*G)[src[1]] = ++t;
for(int i = 2; i <= cnt; ++i)
if(src[i] != src[i - 1])
(*G)[src[i]] = ++t;
for(int i = 1; i <= intervals; ++i)
Modify(1,cnt,(*G)[interval[i].first],(*G)[interval[i].second],1,i);
GetAns(1,cnt,1);
int ans = 0;
for(int i = 1; i <= intervals; ++i)
ans += color[i];
printf("%d\n",ans);
}
return 0;
}

POJ 2528 Mayor&#39;s posters 离散化+线段树的更多相关文章

  1. poj 2528 Mayor&#39;s posters 【线段树 + 离散化】

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50643   Accepted: 14675 ...

  2. POJ 2528 Mayor&#39;s posters 离散化和线段树题解

    本题就是要往墙上贴海报,问最后有多少可见的海报. 事实上本题的难点并非线段树,而是离散化. 由于数据非常大,直接按原始数据计算那么就会爆内存和时间的. 故此须要把数据离散化. 比方有海报1 6   7 ...

  3. poj2528 Mayor&#39;s posters(线段树,离散化)

    离散化的思想: 对于这样的数据 (3,10000). (9,1000000). (5.100000), (1,1000). (7,1000000) 我们能够将其处理为 (2,7). (5,9). (3 ...

  4. poj 2528 Mayor&#39;s posters

    这个题意是市长竞选,然后每一个人都能够贴广告牌.能够覆盖别人的看最后剩几个广告牌 这题目想了两个多小时,最后忍不住看了一下题解. 发现仅仅是简单地hash  和线段树成段更新 由于有10000个人竞选 ...

  5. 【hdu】Mayor&#39;s posters(线段树区间问题)

    须要离散化处理,线段树的区间改动问题. 须要注意的就是离散化的时候,由于给的数字是一段单位长度,所以须要特殊处理(由于线段的覆盖和点的覆盖是不一样的) 比方:(1,10)(1,4) (6,10) 离散 ...

  6. 线段树区间更新,区间统计+离散化 POJ 2528 Mayor&#39;s posters

    题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报.问最后从外面能看到几张不同的海报. 由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于 ...

  7. POJ2528 Mayor&#39;s posters 【线段树】+【成段更新】+【离散化】

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39795   Accepted: 11552 ...

  8. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  9. Mayor's posters(离散化线段树)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 54067   Accepted: 15713 ...

随机推荐

  1. luogu P2134 百日旅行

    题目链接 luogu P2134 百日旅行 题解 dp方程好想吧 优化有些玄学惹 不会证.... 不过我会三分和贪心 \滑稽 但还是写dp吧 代码 #include<cstdio> #in ...

  2. 【树状数组】【枚举约数】 - Ambitious Experiment

    给定一个序列,支持以下操作: 对区间[l,r]的每个i,将1i,2i,3i,...这些位置的数都加d. 询问某个位置的数的值. 如果把修改看作对区间[l,r]的每个数+d,那么询问x位置上的数时,显然 ...

  3. 【模拟】bzoj2760 [JLOI2011]小A的烦恼

    注意细节和初始化. #include<cstdio> #include<string> #include<algorithm> #include<iostre ...

  4. 【tarjan求割顶】BZOJ2730-[HNOI2012]矿场搭建

    [题目大意] 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍 ...

  5. Java高级架构师(一)第03节:多模块多Web应用合并War包

    多模块.多Web应用合并war包 在日常的系统开发中,如果担心各个系统的资源同名覆盖,可以在总的War模块下放置一份最终的资源. 将版本号改成9.1.0.v20131115,ok 在Idea中的Mav ...

  6. Windows python 3 安装OpenCV

    本文适用于想在window下使用python 3 的童鞋,安装openCV 有问题的参考 一.你要确定自己的python版本是3.x,在命令行窗口输入python 本人使用的是python 3.6 二 ...

  7. Visual Studio 断点无法命中怎么办?

    经常远程调试服务器打断点是空心的,很抓狂,正确的方法应该是 #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { System.Diagnos ...

  8. C# 6.0可能会支持模式匹配了

    今天在CodePlex的Roslyn讨论区发现了一个帖子:Draft spec for records and pattern-matching in C#,估计MS计划在C# 6.0中支持模式匹配了 ...

  9. 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇) 转

    https://www.ancii.com/database/30842.html 微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这 ...

  10. 查看Java代码对应的汇编指令又一利器,JITWatch 转

    http://www.tuicool.com/articles/IRrIRb3 时间 2015-05-13 08:00:00  Liuxinglanyue's Blog 原文  http://java ...