1. 程式人生 > >資料結構--線段樹&離散化可能有的問題--poj2528 Mayor's posters

資料結構--線段樹&離散化可能有的問題--poj2528 Mayor's posters

給定n個區間,按順序覆蓋後,問最後幾個是可見的。

l,r,範圍1e7,需要離散化。

//但是注意簡單的離散化可能會出現錯誤,給出下面兩個簡單的例子應該能體現普通離散化的缺陷:

//例子一:1-10 1-4 5-10

//例子二:1-10 1-4 6-10

//解決的辦法則是對於距離大於1的兩相鄰點,中間再插入一個點

這樣離散化後

例子一:[1,6] [1,3] [4,6]

例子二:[1,7] [1,3] [5,7]

#include <cstdio>
#include <iostream>
#include <map>
#include <cstring>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
#define lc (rt << 1)
#define rc (rt << 1 | 1)
#define mid (l + r) / 2

const int maxn = 1e4 + 5;
struct node{
    int l,r;
    int lid,rid;
}ns[maxn];
map<int,int> mp;
map<int,int>::iterator it,pit;
int N;
int tr[maxn << 4],setv[maxn << 4];
bool vis[maxn];

void init(int l,int r,int rt)//初始設為0,統計時不計入顏色
{
    if(l == r){
        tr[rt] = setv[rt] = 0;
        return ;
    }
    init(l,mid,lc);
    init(mid + 1,r,rc);
    tr[rt] = setv[rt] = 0;
}
void pushdown(int l,int r,int rt)
{
    if(setv[rt]){
        setv[lc] = setv[rc] = setv[rt];
        tr[lc] = tr[rc] = setv[rt];
        setv[rt] = 0;
    }
}
void update(int ql,int qr,int l,int r,int rt,int x)
{
    // printf("in update %d %d %d %d %d\n",ql,qr,l,r,x);
    if(ql <= l && r <= qr){
        tr[rt] = x;
        setv[rt] = x;
        return ;
    }
    pushdown(l,r,rt);
    if(ql <= mid) update(ql,qr,l,mid,lc,x);
    if(mid < qr) update(ql,qr,mid + 1,r,rc,x);
    
}
int query(int p,int l,int r,int rt)
{
    if(l == r) return tr[rt];
    pushdown(l, r, rt);
    if(p <= mid) return query(p, l, mid, lc);
    return query(p, mid + 1, r, rc);
}
int main()
{
    int T;scanf("%d",&T);
    int n;
    while(T --){
        scanf("%d",&n);
        
        mp.clear();
        memset(vis,0,sizeof(vis));
        for(int i = 1;i <= n;i ++){
            scanf("%d%d",&ns[i].l,&ns[i].r);
            //   if(ns[i].l > ns[i].r || ns[i].l < 1 || ns[i].r > 10000000) continue;
            mp[ns[i].l];mp[ns[i].r];
        }
        it = mp.begin();pit = it;it ++;
        vector<int> v;
        while(it != mp.end()){
            if(it->first - pit->first > 1) v.push_back(pit->first + 1);
            pit = it;it ++;
        }
        for(int i = 0;i < v.size();i ++) mp[v[i]];
        int p = 1;
        it = mp.begin();
        while(it != mp.end()) {it->second = p ++;it ++;}
        N = p ;
        init(1, N, 1);
        //  cout << "N = " << N << endl;
        for(int i = 1;i <= n;i ++){
            ns[i].lid = mp[ns[i].l];
            ns[i].rid = mp[ns[i].r];
            //            printf("%d -> %d\n",ns[i].l,ns[i].lid);
            //            printf("%d -> %d\n",ns[i].r,ns[i].rid);
        }
        for(int i = 1;i <= n;i ++){
            update(ns[i].lid ,ns[i].rid,1,N,1,i);
            // printf("update %d %d \n",ns[i].lid,ns[i].rid);
        }
        for(int i = 1;i <= N;i ++){
            int t = query(i,1,N,1);
            //   printf("at %d c = %d\n",i,t);
            
            vis[t] = 1;
        }
        int ans = 0;
        for(int i = 1;i <= n;i ++) if(vis[i]) ans ++;
        printf("%d\n",ans);
    }
    return 0;
}

相關推薦

資料結構--線段&離散可能有的問題--poj2528 Mayor's posters

給定n個區間,按順序覆蓋後,問最後幾個是可見的。 l,r,範圍1e7,需要離散化。 //但是注意簡單的離散化可能會出現錯誤,給出下面兩個簡單的例子應該能體現普通離散化的缺陷: //例子一:1-10 1-4 5-10 //例子二:1-10 1-4 6-10 //解決的

【POJ 2482】 Stars in Your Window(線段+離散+掃描線)

d+ opera algorithm ans som lov ble word wait 【POJ 2482】 Stars in Your Window(線段樹+離散化+掃描線) Time Limit: 1000MS M

卿學姐與基本法 (線段+離散)

esp rdquo fine truct r+ lose row log ram “做專題也要按照基本法” 離開了詭異的村莊,卿學姐來到了威廉·聖·亂七八糟王國,這裏的國王鹹魚王是個智障。 國家渙散,盜賊四起,民不聊生

POJ 1151 Atlantis 線段+離散

roc 線段樹 aps sin program cal ase gree org 題目鏈接:http://poj.org/problem?id=1151 http://acm.hdu.edu.cn/showproblem.php?pid=1542 題目大意:給你幾個矩形的

POJ 2528 Mayor's posters線段 離散+區間更新+區間求值 )

href eof 求值 給定 一個點 一個 stream 問題 void 題目鏈接:http://poj.org/problem?id=2528 題意:塗色問題,給定n個要塗色的區間(每次用的顏色不一樣,顏色覆蓋性極強),問最後能看到多少種顏色。(貼海報問題轉換) 題解

hdoj 4325 Flowers 線段+離散

string 註意 stream date void href pre sca include hdoj 4325 Flowers 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接線段樹,按照花的開放區

CodeForces - 915E 動態開點線段||離散線段

 題意: 給定1-n的一段空區間,每次給出 x  y  z  的詢問,z == 1 時將 x - y 區間全部填充,否則為空,問最後一共有多少空區間 分析: 很明顯的線段樹題目,不過主要是想學習以下動態開點,不過陣列範圍自己一時間也還不懂怎麼處理。

牛客練習賽 資料結構 線段

連結:https://www.nowcoder.com/acm/contest/200/B 來源:牛客網   qn姐姐最好了~     qn姐姐給你了一個長度為n的序列還有m次操作讓你玩,     1 l r 詢問區間[l,r]內的元

資料結構------線段1:概述與建樹

資料結構——線段樹   作為一枚蒟蒻,學習是重要的。最近,我接觸了一種新資料結構——線段樹。我一見,只是全身懵逼,[流汗],怎麼這麼藍? 於是,我開始努力學,努力學······(此處省略INF個努力學),決定寫一下部落格。   線段樹是一棵二叉樹,並與分治有著密切關係。 就說說

D - Mayor's posters (線段 + 離散)

滴答滴答---題目連結 The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral pos

資料結構------線段2:區間詢問與單點修改

上一次我們講到線段樹的概念和建樹,今天,我們來講線段樹的區間詢問與單點修改。 ~~~~~~~~~~~~ |       區間詢問       | ~~~~~~~~~~~~ 一般來說,區間詢問是以這樣的形式出現滴: 給定一個區間 [ l ,

poj2528 - Mayor's posters - 線段離散(詳解)

Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79035   Accepted

poj1151 Atlantis(線段+離散+掃描線)

題意:給出一堆座標,問最後構成的面積有多少(重複的面積只能算一次) 思路:首先,這道題的資料量完全可以暴力過的,但是下面這麼做只是想練練線段樹和離散化的結合。給出的座標不是整數,所以可以這麼做。把各個x,從小到大掃描,然後對所有y值進行離散化,給其一個整數標號,這樣y就可以用線段樹進行維護了。然

簡單資料結構——線段

線段樹常常用於求解某些區間上的問題,它通過區間標記和分治思想,可以較快的處理區間問題,在理解線段樹前,我們先理解一種較為簡單的思想——分塊 分塊:   顧名思義,將要處理的區間分成塊,一般一個塊的大小為sqrt(n),   例如,我們要對某個區間做加法,之後查詢一段的值,顯然我們對於

線段+離散poj2528

http://poj.org/problem?id=2528 題意是給你n個區間,後來的區間會覆蓋前面的區間,問你最後有多少區間沒有被完全覆蓋 由於r的最大值是10000000,所以先將資料進行離散化處理,把所有所有區間的l,r排序,離散化後在從後往前去覆蓋區間 如果該區間已經被覆蓋,則返回false

P - Atlantis HDU - 1542(矩形面積並 + 線段離散優化)

There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of t

N - Picture POJ - 1177(矩形周長並 + 線段 + 離散

本程式碼採用的是橫向掃描一遍和縱向掃描一遍來得到最終的結果,核心部分就是求舉行周長並,當然也要對線段樹比較熟悉才行,畢竟矩形周長並,面積並,面積交都要用到線段樹來計算。說說求舉行周長並的過程吧,我們先計算橫向線段的長度,把所有座標的y軸座標按照升序排列,掃描線從y的最小值依次向上掃描,求出每

Flower[hdu4325][線段][離散]

傳送門 離散化 線段樹區間修改+單點查詢就可以了 #include<cstdio> #include<cstring> #include<algorithm> #include<string> #define N 100050 using

poj 2528 Mayor's posters(線段+離散)

The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at

POJ 1151 Atlantis 線段+離散+掃描線 (java實現)

Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these text