题目链接:http://poj.org/problem?id=2528

题目:

题意:将n个区间进行染色(对于同一个区间,后一次染色会覆盖上一次的染色),问最后可见的颜色有多少种。

思路:由于区间长度太大,而n就1e4,假设每次要染色的区间端点值都不相同也就2n,所以我们可以将区间进行离散化,然后对区间进行建树(不是对1,n建树)。我们在节点结构体内部用mx来记录最后这个节点的颜色,flag来标记这个区间内部的颜色是否完全一样,对于一个节点的flag的更新方法为判断它的左右子节点的flag是否都为1(内部颜色完全相同)且左右子节点的颜色是否相同,如果满足这两个条件,那么就将其flag记为1,否则就是0。最后我们用set来维护所有区间的颜色,答案就是set的size。

代码实现如下:

 #include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef unsigned long long ull; #define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = 1e8;
const int maxn = 1e4 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f; inline int read() {//读入挂
int ret = , c, f = ;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * + c - '';
if(f < ) ret = -ret;
return ret;
} set<int> s;
int t, n, ans;
vector<int> v; struct s {
int l, r;
}a[maxn]; struct node {
int l, r, mx, flag;
}segtree[maxn*]; void push_down(int i) {
if(segtree[i].flag && segtree[i].l != segtree[i].r) {
segtree[i*].flag = ;
segtree[i*+].flag = ;
segtree[i*].mx = segtree[i].mx;
segtree[i*+].mx = segtree[i].mx;
segtree[i].flag = ;
}
} void build(int i, int l, int r) {
segtree[i].l = l, segtree[i].r = r;
segtree[i].mx = -, segtree[i].flag = ;
if(l == r) return;
int mid = (l + r) >> ;
build(lson);
build(rson);
} void update(int i, int l, int r, int cur) {
if(segtree[i].l == l && segtree[i].r == r) {
segtree[i].mx = cur;
segtree[i].flag = ;
return;
}
push_down(i);
int mid = (segtree[i].l + segtree[i].r) >> ;
if(l > mid) update(i * + , l, r, cur);
else if(r <= mid) update(i * , l, r, cur);
else {
update(lson, cur);
update(rson, cur);
}
if(segtree[i*].mx == segtree[i*+].mx && segtree[i*].flag == && segtree[i].flag == ) {
segtree[i].mx = segtree[i*].mx;
segtree[i].flag = ;
} else segtree[i].flag = ;
} void query(int i, int l, int r) {
if(segtree[i].flag) {
if(segtree[i].mx != -) s.insert(segtree[i].mx);
return;
}
push_down(i);
if(segtree[i].l == segtree[i].r) {
if(segtree[i].mx != -) s.insert(segtree[i].mx);
printf("%d %d %d\n", segtree[i].l, segtree[i].r, segtree[i].mx);
return;
}
int mid = (segtree[i].l + segtree[i].r) >> ;
query(lson), query(rson);
} int main() {
//FIN;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
v.clear();
s.clear();
ans = ;
int m = -;
for(int i = ; i <= n; i++) {
scanf("%d%d", &a[i].l, &a[i].r);
v.push_back(a[i].l);
v.push_back(a[i].r);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
for(int i = ; i <= n; i++) {
a[i].l = lower_bound(v.begin(), v.end(), a[i].l) - v.begin() + ;
m = max(m, a[i].l);
a[i].r = lower_bound(v.begin(), v.end(), a[i].r) - v.begin() + ;
m = max(m, a[i].r);
}
build(, , m);
for(int i = ; i <= n; i++) {
update(, a[i].l, a[i].r, i);
}
query(, , n);
printf("%d\n", s.size());
}
return ;
}

Mayor's posters(线段树+离散化+区间染色)的更多相关文章

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

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

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

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

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

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

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

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

  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 线段树+离散化 || hihocode #1079 离散化

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

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

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

  8. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  9. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

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

随机推荐

  1. Linux的ll命令详解

    ll 列出来的结果详细,有时间,是否可读写等信息 ,象windows里的 详细信息 ls 只列出文件名或目录名 就象windows里的 列表 ll -t 是降序,  ll -t | tac 是升序 l ...

  2. 无法打开mfc120.lib

    今天在用VS2013编译OSG的时候报错:无法打开mfc120.lib.仔细查了下资料. 我是这么解决的: 安装Multibyte MFC Library for Visual Studio 2013 ...

  3. Apriori算法详解

    一.Apriori 算法概述Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集的 算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的.它使用一种 ...

  4. fcntl函数详解

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control头文件: #include <unistd.h> #include & ...

  5. [C/C++] 大小端存储问题

    首先来看一下今天做的一道题: 解析: union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据 ...

  6. Luogu3936 Coloring(模拟退火)

    裸退火,每次交换两个格子即可.依旧不会调参,稍微抄了点参数并且把随机种子设成了一个神奇的数字终于过掉了. #include<iostream> #include<cstdio> ...

  7. CF484E Sign on Fence && [国家集训队]middle

    CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...

  8. 周记【距gdoi:133天】

    蔡大神坚持每天写日记记录他所剩的oi生涯. 可是我呢?自从搞完数据结构后都不知道在干什么,整天在傻叉.也许是给自己压力太大了,或许是真的自己在迷茫以及犹豫,更或者自己真的是想太多不想写题,觉得烦了,没 ...

  9. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  10. CentOS 装hadoop3.0.3 版本踩坑

    1.but there is no HDFS_NAMENODE_USER defined. Aborting operation. [root@xcff sbin]# ./start-dfs.sh S ...