离散化的思想:

对于这样的数据
(3,10000)。
(9,1000000)。
(5。100000),
(1,1000)。
(7,1000000)
我们能够将其处理为
(2,7)。
(5,9)。
(3,8),
(1,6),
(4,9)

我们再对离散化之后的数据进行处理即可了。
题目意思:

n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000)。

求出最后还能看见多少张海报。

參考代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXN = 10000+5;
struct Node{
int l,r;
int c;
}tree[14*MAXN]; //线段树
struct Seg{
int l,r;
}s[MAXN]; //存储报纸的范围
struct Seg2{
int p;
int index;
}a[2*MAXN]; //存放端点信息
bool cmp(Seg2 x,Seg2 y){
return x.p<y.p;
}
int color[2*MAXN];
int ans=0;
void build(int node,int l,int r){
tree[node].l=l,tree[node].r=r,tree[node].c=0;
if (l==r) return;
build(node*2,l,(l+r)/2);
build(node*2+1,(l+r)/2+1,r);
}
void update(int node,int l,int r,int v){
//cout<<l<<" "<<r<<endl;
if (tree[node].l>=l && tree[node].r<=r){
tree[node].c=v;
return;
}
if (tree[node].c>0){
tree[2*node].c=tree[2*node+1].c=tree[node].c;
tree[node].c=0;
}
int mid=(tree[node].l+tree[node].r)/2;
if (r<=mid)
update(2*node,l,r,v);
else if (mid<l)
update(2*node+1,l,r,v);
else{
update(2*node,l,mid,v);
update(2*node+1,mid+1,r,v);
}
}
void count(int node){
if (tree[node].c>0){
if (color[tree[node].c]==0){
ans++;
color[tree[node].c]++;
}
return;
}
if (tree[node].l==tree[node].r)
return;
count(2*node);
count(2*node+1);
}
void solve(int n,int t){
build(1,1,t);
//cout<<"--------"<<endl;
for (int i=1;i<=n;i++){
update(1,s[i].l,s[i].r,i);
//cout<<"123456789\n";
}
ans=0;
memset(color,0,sizeof(color));
count(1);
printf("%d\n",ans);
}
int main(){
int t,n;
scanf("%d",&t);
while (t--){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&s[i].l,&s[i].r);
a[2*i-1].p=s[i].l;
a[2*i-1].index=i; //标记为左端点
a[2*i].p=s[i].r;
a[2*i].index=-i; //标记为右端点
}
sort(a+1,a+2*n+1,cmp);
//数据离散化
int t=1;
int tmp=a[1].p;
for (int i=1;i<=2*n;i++){
if (tmp!=a[i].p){
tmp=a[i].p;
t++;
}
if (a[i].index>0)
s[a[i].index].l=t;
else
s[-a[i].index].r=t;
}
/*
for (int i=1;i<=n;i++){
printf("%d %d\n",s[i].l,s[i].r);
}
*/
solve(n,t);
}
return 0;
}

poj2528 Mayor&#39;s posters(线段树,离散化)的更多相关文章

  1. [poj2528] Mayor's posters (线段树+离散化)

    线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...

  2. POJ 2528 Mayor's posters(线段树+离散化)

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

  3. poj 2528 Mayor's posters 线段树+离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

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

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

  5. Mayor's posters(线段树+离散化POJ2528)

    Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 51175 Accepted: 14820 Des ...

  6. POJ 2528 Mayor's posters (线段树+离散化)

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

  7. poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

  8. POJ2528Mayor's posters[线段树 离散化]

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

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

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

随机推荐

  1. sqlite学习笔记7:C语言中使用sqlite之打开数据库

    数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...

  2. fgets()函数和sscanf()函数的使用方法

    fgets 百度百科:从文件结构体指针stream中读取数据,每次读取一行.读取的数据保存在buf指向的字符数组中.每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),假设文件里 ...

  3. Cocos2D-x设计模式发掘之中的一个:单例模式

    http://www.tuicool.com/articles/NBRn2murl=pVtZACoQFKXC3u3uGwMLnTy4YDWihcVg0ata5gy506pmPpQEc0PO9hm6wG ...

  4. Struts2概述及与Struts1的对照

    Struts2 概述 1,仍然是一个基于请求响应的MVC框架 2,Struts2不是Struts1的升级 3,Struts2与Struts1的体系结构差距非常大 4,Struts2採用了还有一个MVC ...

  5. HDU 2054 A==B? 大数

    Problem Description Give you two numbers A and B, if A is equal to B, you should print "YES&quo ...

  6. ExtJs--16--Ext.override()方法专门用来重写对象的方法

    Ext.onReady(function(){ /** * Ext.override()方法专门用来重写对象的方法 */ //定义个类 Ext.define("U",{ //该类的 ...

  7. angularjs1- ng-include

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. redis模拟消息订阅

    使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 客户端例子: redis 127.0.0.1:6379> subscribe news Read ...

  9. 问题集锦 ~ PHP

    #switch //当variable为数字0的时候,case为true,会执行第一段case代switch (variable) { case 'value': # code... break; d ...

  10. Tomcat转jboss踩的那些坑

    问题背景 今天发版本,是一个httpclient的跳转(由于公司网络原因,所以对外网的访问都经过这个代理服务出去). 问题原因 之前的开发一直在window系统的tomcat服务器上进行的,对jbos ...