1. 程式人生 > >2528 Mayor's posters(離散化+區間更新)

2528 Mayor's posters(離散化+區間更新)

給你n個桌布,桌布之間高度相同,按照順序粘桌布,問能看見多少張桌布。

首先桌布的距離範圍太長,無法用陣列儲存,需要先離散化,然後進行區間更新,用陣列維護區間,每個區間陣列的值有(-1:這個區間沒桌布;0:這個區間有多個桌布;1~n:這個區間是第i個桌布)。程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 30000
#define lmin 1
#define rmax n
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
int cl[maxn<<2] , lazy[maxn<<2] , a[maxn] ;
struct node{
    int id1 , id2 , k ;
}p[maxn];
bool cmp(node a,node b)
{
    return a.k < b.k ;
}
void push_up(int_now)
{
    if( !cl[rt<<1] || !cl[rt<<1|1] || cl[rt<<1] != cl[rt<<1|1] )
        cl[rt] = 0 ;
    else
        cl[rt] = cl[rt<<1|1] ;
}
void push_down(int_now)
{
    if( lazy[rt] != -1 )
    {
        lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt] ;
        cl[rt<<1] = cl[rt<<1|1] = lazy[rt] ;
        lazy[rt] = -1 ;
    }
}
void update(int ll,int rr,int x,int_now)
{
    if( ll > r || rr < l )
        return ;
    if( ll <= l && r <= rr )
    {
        cl[rt] = lazy[rt] = x ;
        return ;
    }
    push_down(now);
    update(ll,rr,x,lson);
    update(ll,rr,x,rson);
    push_up(now);
}
void query(int ll,int rr,int_now,int *a)
{
    if( cl[rt] == -1 )
        return ;
    else if(cl[rt] > 0)
    {
        a[ cl[rt] ] = 1 ;
        return ;
    }
    push_down(now);
    query(ll,rr,lson,a);
    query(ll,rr,rson,a);
}
int main()
{
    int t , i , n , m , l , r , x ;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &m);
        for(i = 0 ; i < m ; i++)
        {
            scanf("%d %d", &p[i].k, &p[i+m].k);
            p[i].id1 = i ;
            p[i+m].id1 = i+m ;
        }
        sort(p,p+2*m,cmp);
        int temp = -1 ;
        n = 0 ;
        for(i = 0 ; i < 2*m ; i++)
        {
            if( p[i].k == temp )
                p[i].id2 = n ;
            else
            {
                p[i].id2 = ++n ;
                temp = p[i].k ;
            }
            a[ p[i].id1 ] = p[i].id2 ;
        }
        memset(cl,-1,sizeof(cl));
        memset(lazy,-1,sizeof(lazy));
        for(i = 0 ; i < m ; i++)
        {
            update(a[i],a[i+m],i+1,root);
        }
        memset(a,0,sizeof(a));
        query(1,n,root,a);
        int num = 0;
        for(i = 1 ; i <= m ; i++)
            if(a[i])
                num++ ;
        printf("%d\n", num);
    }
    return 0;
}

相關推薦

2528 Mayor's posters離散+區間更新

給你n個桌布,桌布之間高度相同,按照順序粘桌布,問能看見多少張桌布。 首先桌布的距離範圍太長,無法用陣列儲存,需要先離散化,然後進行區間更新,用陣列維護區間,每個區間陣列的值有(-1:這個區間沒桌布;0:這個區間有多個桌布;1~n:這個區間是第i個桌布)。程式碼如下: #

poj2528——Mayor's posters離散+區間覆蓋

Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing t

POJ2528——Mayor's posters 線段樹區間更新查詢+離散

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

POJ - 2528 Mayor's posters 離散+線段樹區間修改

clu max 單位 cover rst unique ace output https https://cn.vjudge.net/problem/POJ-2528 題意 給定一些海報,可能相互重疊,告訴你每個海報的寬度(高度都一樣的)和先後疊放順序,問沒有被完全蓋

POJ 2528 Mayor's posters線段樹+離散

Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 60691 Accepted: 17565 Description The citizens of Byteto

poj 2528 Mayor's posters樹狀陣列+離散

Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 63793 Accepted: 18415 Description The citizens of Byteto

POJ 2528 Mayor's posters 線段樹成段更新+離散

題意:很多張海報貼在牆上 求可以看到幾張海報 看那兩張圖就行了 第一張俯檢視 思路:最多2W個不同的數 離散化一下 然後成段更新 a[rt] = i代表這個區間是第i張報紙 更新玩之後一次query cover[i]=1代表可以看到第i張報紙 #include <c

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

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

poj 2528 Mayor's posters區間離散

文章目錄題目連結: 題目連結: http://poj.org/problem?id=2528 題意:就是有 N 種海報,每種海報有個長度[L,R],後來的海報會覆蓋前面來的海報,問最後從最上面看,能看得到幾種海報 input: 3 3 5 6 4 5 6 8

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

POJ 2528 Mayor's posters 線段樹成段更新+離散

題意: 給出N個海報,每個海報有一個長度區間(a,b).按順序貼在牆上。 問最後可以看到幾張海報。 思路: 一想到的就是線段樹,對每個區間進行染色,最後查詢一共有多少種顏色。 第一次寫玩沒看資料大小。MLE了。。仔細一看,海報長度1QW。 然後寫了個離散化的,300MS+。

POJ 2528 Mayor's posters [ 離散 + 線段樹 ]

題目連結: 題意概括: 依次貼上 n 張海報,每張海報會覆蓋一個區間。後貼上的海報會覆蓋前貼的海報,問最後可以看見幾張海報 這裡的區間不是拿兩端點來維護的,是直接按單位最小區間來編號。如 [3, 5] 區間是由編號為 3、4、5的區間組成的 資料範圍:

POJ2528 Mayor's posters線段樹+離散

Mayor’s posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 57835 Accepted: 16725 Description The ci

【線段樹 + 離散 + 詳細註釋】北大 poj 2528 Mayor's posters

/* THE PROGRAM IS MADE BY PYY */ /*----------------------------------------------------------------------------// Copyright (c) 2011 panyanyany All rig

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

題意: 市長競選,每個市長都往牆上貼海報,海報之間彼此可以覆蓋,給出貼上順序和每個海報的起點和終點,問最後又多少海報時可見的。 剛接觸離散化,先寫一寫本人的理解: 如果原資料太大,建樹會超記憶體。因此可以先對這些數排序,然後將它們對映成排序後的序號。比如在該題中,[1,

POJ 2528 Mayor's posters (線段樹+離散 成段替換)

題目大意: 就是在一段區間上貼海報, 後來的區間會把前面來的區間覆蓋掉, 為貼完海報後能看到幾張海報(只看到一部分也算看到) 大致思路: 就是區間替換更新, 標記一下當前區間的所有的海報是否一致, 用懶惰標記標記一下當前區間的類別 聽說資料比較水...布吉島嚴格的資料下這

POJ 2528 Mayor's posters 區間染色問題

題目意思 每個案例一個數字n,接下來n行表示張貼海報的起點與終點,求有多少海報沒有被完全遮住,經典區間染色問題。本題資料量比較大,所以需要將起點和終點離散化處理。 Sample Input 1 5 1 4 2 6 8 10

EOJ2458離散+線段樹

這題題意就是問n個點序列,從小到大排列,問區間裡最長的相等點的長度是多少。那麼我們很容易想到線段樹,將相同點相連即使一條線段,然後問區間裡線段最長的是多少。因為題目給的是1 ≤ n, q ≤ 100000,所以直接建樹勢必複雜度將會很大,因此這裡我們對初始資

HDU - 4348 To the moon主席樹區間更新

ring targe 鏈接 query panel iostream ref c++ span 題目鏈接:To the moon 題意:給個數組,三種操作,第一種詢問當前區間[l,r]的和,第二種給區間[l,r]的每一個數加上d,第三種詢問在第幾次修改後[l,r]的權值

ZOJ - 1610 Count the Colors線段樹區間更新

線段樹 pan 遍歷 cst include stdin cstring syn bit https://cn.vjudge.net/problem/ZOJ-1610 題意 給一個n,代表n次操作,接下來每次操作表示把[l,r]區間的線段塗成k的顏色其中,l,r,k的範