青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數(shù)據(jù)加載中……

PKU 2777 Count Color

題目鏈接:http://poj.org/problem?id=2777
/*
題意:
    給定一個長度為N(N <= 100000)的數(shù)列Si,緊接著Q(Q <= 100000)條操作,操作
形式有兩種:
1. "C A B C" 將A到B的數(shù)都染成C這種顏色。 
2. "P A B" 輸出A和B之間不同顏色的數(shù)目。


解法:
線段樹(染色問題)

思路:
    一看到數(shù)據(jù)量就可以首先確定是線段樹了,經(jīng)典的區(qū)間染色問題,涉及到區(qū)間的
更新和詢問,和pku 3468 類似,巧妙運用lazy思想。就是每次更新區(qū)間段的時候延遲
更新,只是在完全覆蓋的區(qū)間打上一個lazy標(biāo)記。這題的詢問是求區(qū)間段中不同顏色的
數(shù)量,因為顏色數(shù)不多只有30種,可以巧妙運用二進(jìn)制位運算,用一個int就可以表示
當(dāng)前區(qū)間段的顏色情況。比如1001表示有兩種顏色,如果左子樹的當(dāng)前顏色情況是101
,而右子樹的顏色情況是011,那么父親的顏色情況就是兩者的位或,這樣就可以避免
掉重復(fù)的情況。
    再來談?wù)刲azy思想。做了這么多的線段樹,應(yīng)該總結(jié)一下,lazy是一個很經(jīng)典的思
想。所謂lazy,就是懶惰,每次不想做太多,只要插入的區(qū)間完全覆蓋了當(dāng)前結(jié)點所管
理的區(qū)間就不再往下做了,在當(dāng)前結(jié)點上打上一個lazy標(biāo)記,然后直接返回。下次如果
遇到當(dāng)前結(jié)點有l(wèi)azy標(biāo)記的話,直接傳遞給兩個兒子,自己的標(biāo)記清空。這樣做肯定是
正確的。我們以染色為例,可以這樣想,如果當(dāng)前結(jié)點和它的子孫都有l(wèi)azy標(biāo)記的話,
必定是子孫的先標(biāo)記,因為如果是自己先標(biāo)記,那么在訪問子孫的時候,必定會將自己
的標(biāo)記下傳給兒子,而自己的標(biāo)記必定會清空,那么lazy標(biāo)記也就不存在了。所以可以
肯定,當(dāng)前的lazy標(biāo)記必定覆蓋了子孫的,所以直接下傳即可,不需要做任何判斷。當(dāng)
然,這是染色問題,是直接賦值的,如果像pku 3468那樣,每次是區(qū)間加和,則傳遞標(biāo)
記的時候不能簡單的賦值,必須累加,這是顯而易見的。
*/
/*
lazy思想
    染色模型
        適合顏色數(shù)目較少(64以內(nèi))的區(qū)間染色問題。
        具體操作:
            1、對某個連續(xù)區(qū)間進(jìn)行染色。
            2、詢問某個連續(xù)區(qū)間的顏色情況(種類、數(shù)目等等)。
        適用題型:
            poj 2777 Count Color
            hdu 5023 A Corrupt Mayor's Performance Art
        結(jié)點存儲
            顏色值的位或colorBit:每個顏色用2的冪來表示,顏色值表示分別為1、2、4、8,該區(qū)間有哪些顏色就可以用他們的或來表示
            延遲標(biāo)記lazy:該段區(qū)間完全被染色成了lazy這種顏色,這里的lazy要么是2的冪,要么是0

        接口說明
            giveLazyToSon      傳遞延遲標(biāo)記給兩個子結(jié)點(調(diào)用子結(jié)點的updateByValue,并且lazy重置)
            updateByValue      通過某個顏色值更新當(dāng)前結(jié)點信息(更新colorBit、lazy)
            updateFromSon      通過兩個子結(jié)點更新當(dāng)前結(jié)點信息(更新colorBit)
            mergeQuery         詢問時用于對分割后的子結(jié)點進(jìn)行合并用,不同情況實現(xiàn)不同

        調(diào)用說明
            建樹:              調(diào)用靜態(tài)函數(shù)   treeNode::segtree_build(1, 1, n);
            插入([x, y], val): 調(diào)用靜態(tài)函數(shù)   treeNode::segtree_insert(1, 1, n, x, y, val);
            詢問([x, y]):       調(diào)用靜態(tài)函數(shù)   treeNode::segtree_query(1, 1, n, x, y, ans);

*/ 
#include <iostream>

using namespace std;

#define MAXN 131072
typedef int ValueType;


// 返回[l, r]和[x, y]兩條線段是否相交
bool is_intersect(int l, int r, int x, int y) {
      return !(r < x || l > y);
}
// 返回[x, y]是否完全包含[l, r]
bool is_contain(int l, int r, int x, int y) {
      return x <= l && r <= y;
}

struct treeNode {
    ValueType lazy;
    ValueType colorBit;
      int pid;
      int len;

    treeNode() {
        reset(-1, 0);
    }
      void reset(int p, int _len) {
        pid = p;
        colorBit = 0;
        lazy = 0;
        len = _len;
    }
    int lson() { return pid << 1; }
    int rson() { return pid<<1|1; }

    void updateByValue(ValueType _val);
    void giveLazyToSon();
    void updateFromSon();

    // 詢問的時候?qū)⒔Y(jié)點合并后計入答案
    void mergeQuery(int p);

    // 建樹 
    static void segtree_build(int p, int l, int r);
    // 插入線段[x, y]到[l, r]
    static void segtree_insert(int p, int l, int r, int x, int y, ValueType val);
    // 區(qū)間詢問[x, y]上的信息
    static void segtree_query(int p, int l, int r, int x, int y, treeNode& ans);
};

/* 全局變量 
    nodes[MAXN*2] 存儲所有靜態(tài)線段樹結(jié)點(動態(tài)開內(nèi)存太費時間)
    totalNodes    存儲結(jié)點數(shù)目
*/
treeNode nodes[MAXN*2];

void treeNode::updateByValue(ValueType _val) {
    lazy = _val;
    colorBit = _val;
}

void treeNode::giveLazyToSon() {
      if(lazy) {
        nodes[ lson() ].updateByValue(lazy);
        nodes[ rson() ].updateByValue(lazy);    
        lazy = 0;        
    }
}

void treeNode::updateFromSon() {
    colorBit = nodes[ lson() ].colorBit | nodes[ rson() ].colorBit;
}

void treeNode::mergeQuery(int p) {
    colorBit |= nodes[p].colorBit;
}

void treeNode::segtree_build(int p, int l, int r) {
    // 創(chuàng)建線段樹結(jié)點的時候只需要知道該線段樹結(jié)點管轄區(qū)間的長度,區(qū)間端點不用存,可以在遞歸的時候作為函數(shù)傳參
    nodes[p].reset(p, r-l+1);
      if (l < r) {
            int mid = (l + r) >> 1;
            // 遞歸創(chuàng)建左右兒子結(jié)點
        treeNode::segtree_build(p<<1, l, mid);
        treeNode::segtree_build(p<<1|1, mid+1, r);
        nodes[p].updateFromSon();
    }
}

void treeNode::segtree_insert(int p, int l, int r, int x, int y, ValueType val) {
      if( !is_intersect(l, r, x, y) ) {
            return ;
      }
      if( is_contain(l, r, x, y) ) {
        nodes[p].updateByValue(val);
            return ;
    } 
    nodes[p].giveLazyToSon();
      int mid = (l + r) >> 1; 
    treeNode::segtree_insert(p<<1, l, mid, x, y, val);
    treeNode::segtree_insert(p<<1|1, mid+1, r, x, y, val);
    nodes[p].updateFromSon();
}

void treeNode::segtree_query(int p, int l, int r, int x, int y, treeNode& ans) {
      if( !is_intersect(l, r, x, y) ) {
            return ;
      }
      if( is_contain(l, r, x, y) ) {
            ans.mergeQuery(p);
            return;
    }
    nodes[p].giveLazyToSon();
      int mid = (l + r) >> 1; 
    treeNode::segtree_query(p<<1, l, mid, x, y, ans);
    treeNode::segtree_query(p<<1|1, mid+1, r, x, y, ans);
    nodes[p].updateFromSon();


int n, t, o;

int main() {
    int i;
    while( scanf("%d %d %d", &n, &t, &o) != EOF ) {
            treeNode::segtree_build(1, 1, n);
            for(i = 1; i <= n; i++) {
            treeNode::segtree_insert(1, 1, n, i, i, 1<<0);
            }
            while(o--) {
                  char str[10];
                  int x, y, z;

                  scanf("%s", str);
                  if(str[0] == 'C') {
                           scanf("%d %d %d", &x, &y, &z);
                           if(x > y) swap(x, y);
                           treeNode::segtree_insert(1, 1, n, x, y, 1<<(z-1) );
                  }else {
                           scanf("%d %d", &x, &y);
                           if(x > y) swap(x, y);
                 treeNode ans;
                 treeNode::segtree_query(1, 1, n, x, y, ans);
                 z = 0;
                          for(i = 0; i < t; i++) {
                                if( (1<<i) & ans.colorBit ) {
                        z ++;
                    }
                }
                printf("%d\n", z);
            }
        }
    }
    return 0;
}

/*
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
*/

posted @ 2011-03-31 19:49 英雄哪里出來 閱讀(1637) | 評論 (0)編輯 收藏

ZJU 3349 Special Subsequence

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3349

/*
題意:
    給定一個d(0 <= d <= 10^8)和(N <= 10^5)的數(shù)列,求最長的特殊子序列,
所謂特殊子序列就是相鄰元素之間的絕對值之差小于等于d。

解法:
動態(tài)規(guī)劃+線段樹

思路:
    這題又是一個動態(tài)規(guī)劃,狀態(tài)轉(zhuǎn)移方程很容易想到:
    dp[ val[i] ] = 1 + max( dp[ val[i] - d ]  dp[ val[i] + d ] )
dp[j] 表示以j為止的最長特殊子序列的值,這樣就可以維護(hù)一個區(qū)間,每次
查詢和當(dāng)前數(shù)絕對值差小于等于d的數(shù)組成的區(qū)間,將最大值+1更新到當(dāng)前數(shù)
對應(yīng)的位置上,利用線段樹每次更新和查詢都是log(n)。
*/


#include 
<iostream>
#include 
<cstdio>
#include 
<cstring>
using namespace std;

#define maxn 600010

int n, d;
int val[maxn];

struct Tree {
    
int Max;
    
int son[2];

    
void clear() {
        son[
0= son[1= -1;
        Max 
= 0;
    }

}
T[maxn*4];
int tot;

int Max(int a, int b) {
    
return a > b ? a : b;
}

int Min(int a, int b) {
    
return a < b ? a : b;
}


void Query(int root, int nx, int ny, int l, int r, int& ans) {
    
if(nx > r || ny < l || root == -1 || T[root].Max <= ans)
        
return ;
    
if(nx <= l && r <= ny) {
        ans 
= Max(ans, T[root].Max);
        
return ;
    }

    
int mid = (l + r) >> 1;
    Query(T[root].son[
0], nx, ny, l, mid, ans);
    Query(T[root].son[
1], nx, ny, mid+1, r, ans);
}


void Insert(int& root, int nPos, int l, int r, int val) {
    
if(nPos < l || nPos > r)
        
return ;
    
if(root == -1{
        root 
= tot++;
        T[root].clear();
    }

    T[root].Max 
= Max(val, T[root].Max);

    
if(l == nPos && nPos == r) {
        
return ;
    }


    
int mid = (l + r) >> 1;
    Insert(T[root].son[
0], nPos, l, mid, val);
    Insert(T[root].son[
1], nPos, mid+1, r, val);
}


int main() {
    
int i;
    
int MMin, MMax;
    
while(scanf("%d %d"&n, &d) != EOF) {
        
for(i = 0; i < n; i++{
            scanf(
"%d"&val[i]);
            
if(i) {
                MMin 
= Min(MMin, val[i]);
                MMax 
= Max(MMax, val[i]);
            }
else {
                MMin 
= val[i];
                MMax 
= val[i];
            }

        }

        tot 
= 0;
        
int root = -1;
        
int ans = 1;

        
for(i = 0; i < n; i++{
            
int l = (val[i] - d) < MMin ? MMin : (val[i] - d);
            
int r = (val[i] + d) > MMax ? MMax : (val[i] + d);
            
int MM = 0;
            Query(root, l, r, MMin, MMax, MM);
            Insert(root, val[i], MMin, MMax, MM 
+ 1);
            
if(MM + 1 > ans)
                ans 
= MM + 1;
        }


        printf(
"%d\n", ans);
    }

    
return 0;
}

posted @ 2011-03-31 17:39 英雄哪里出來 閱讀(1085) | 評論 (0)編輯 收藏

ZJU 2451 Minimizing maximizer

     摘要: 題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1451 /**//*題意:    有這樣一個機(jī)器Maximizer,它的輸入是N(N <= 50000)個1到N的數(shù),輸出最大的數(shù)。這個機(jī)器的工作原理是通過讀入M(M <= 5...  閱讀全文

posted @ 2011-03-31 16:12 英雄哪里出來 閱讀(1603) | 評論 (0)編輯 收藏

HDU 2852 KiKi's K-Number

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2852
/*
題意:
    給出三種操作,
    0 在容器中插入一個數(shù)。
    1 在容器中刪除一個數(shù)。
    2 求出容器中大于a的第k大元素。

解法:
二分+樹狀數(shù)組

思路:
    樹狀數(shù)組的特點就是對點更新,成段求和,而且常數(shù)非常小。原始
的樹狀數(shù)組只有兩種操作,在某點插入一個數(shù) 和 求1到i的所有數(shù)的和。
這道題目一共有三種操作,但是實質(zhì)上其實只有兩種:插入和詢問。插入
操作和刪除操作可以視為一種,只不過一個是將標(biāo)記+1,另一個是-1,而
插入的數(shù)對應(yīng)于樹狀數(shù)組的下標(biāo),這樣就可以在log(n)的時間內(nèi)完成插入
和刪除。求大于a的k大元素,可以通過二分枚舉答案來完成,枚舉的是當(dāng)
前答案在樹狀數(shù)組中的位置,設(shè)為m,然后對v[a+1]  v[m]求和就是小
于等于m的數(shù)的個數(shù),這一步可以用樹狀數(shù)組的求和操作來完成,然后根據(jù)
和k的比較來調(diào)整m的位置。詢問的復(fù)雜度也是log(n)的。
*/


#include 
<iostream>

using namespace std;

#define maxn 100002
int C[maxn], n;

int lowbit(int x) {
    
return x & (-x);
}


void Add(int pos, int val) {
    
while(pos < maxn) {
        C[pos] 
+= val;
        pos 
+= lowbit(pos);
    }

}


int Sum(int pos) {
    
int S = 0;
    
while(pos >= 1{
        S 
+= C[pos];
        pos 
-= lowbit(pos);
    }

    
return S;
}


int find(int a, int k) {
    
int l = a + 1;
    
int r = maxn - 1;
    
int S = Sum(a);
    
int ans = maxn;

    
while(l <= r) {
        
int m = (l + r) >> 1;
        
int nS = Sum(m);
        
if(nS - S >= k) {
            r 
= m - 1;
            
if(m < ans)
                ans 
= m;
        }
else
            l 
= m + 1;
    }


    
return ans;
}



int main() {
    
int n;
    
int i;
    
while(scanf("%d"&n) != EOF) {
        
for(i = 1; i < maxn; i++)
            C[i] 
= 0;
        
while(n--{
            
int id, e, a, k;
            scanf(
"%d"&id);
            
if(id == 0{
                scanf(
"%d"&e);
                Add(e, 
1);
            }
else if(id == 1{
                scanf(
"%d"&e);
                
if(Sum(e) - Sum(e-1== 0)
                    printf(
"No Elment!\n");
                
else
                    Add(e, 
-1);
            }
else {
                scanf(
"%d %d"&a, &k);
                
int num = find(a, k);
                
if(num == maxn) {
                    printf(
"Not Find!\n");
                }
else
                    printf(
"%d\n", num);
            }

        }

    }

    
return 0;
}

posted @ 2011-03-31 13:10 英雄哪里出來 閱讀(1463) | 評論 (0)編輯 收藏

PKU 2104 K-th Number

     摘要: 題目鏈接:http://poj.org/problem?id=2104 /**//*題意:    給出一個長度為N(N <= 100000)的數(shù)列,然后是一連串詢問,詢問數(shù)<= 50000,詢問的格式是a, b, k,問[a, b]區(qū)間中的k小數(shù)。解法:二分+歸并樹+線段樹思路:&nb...  閱讀全文

posted @ 2011-03-31 11:33 英雄哪里出來 閱讀(1417) | 評論 (0)編輯 收藏

HDU 3333 Turing Tree

     摘要: 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 /**//*題意:    給出一個長度為N(N <= 30000)的數(shù)列,然后是一連串詢問,詢問數(shù)<= 100000,問給定區(qū)間內(nèi)不同數(shù)字的和。解法:離線算法+離散化+線段樹思路:  &nbs...  閱讀全文

posted @ 2011-03-30 22:52 英雄哪里出來 閱讀(2583) | 評論 (0)編輯 收藏

HDU 1255 覆蓋的面積

     摘要: 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 /**//*題意:    給出N(N <= 1000)個矩形,求被覆蓋2次以上的矩形面積并。解法:離散化+線段樹思路:    類似于覆蓋一次的矩形面積并問題,還是用線段樹求解,首先我們將每...  閱讀全文

posted @ 2011-03-30 19:58 英雄哪里出來 閱讀(2484) | 評論 (1)編輯 收藏

HDU 3458 Rectangles Too!

     摘要: 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3458 /**//*題意:    給定n(1<= n <= 100000)個矩形,問最長的遞增矩形序列。矩形A和BA = ((xA1 , yA1 ), (xA2...  閱讀全文

posted @ 2011-03-30 17:05 英雄哪里出來 閱讀(1195) | 評論 (0)編輯 收藏

ZJU 2859 Matrix Searching

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2859

/*
題意:
    給定一個n*n(n <= 300)的矩陣,然后是(T <= 10^6)次詢問,每次詢問某個子矩
陣中的最小值。

解法:
二維線段樹 或者 二維RMQ

思路:
    一維線段樹是一顆完全二叉樹,那么二維線段樹無疑就是一顆完全四叉樹,換言
之,每個結(jié)點有四個兒子,這里為了空間不浪費,將所有結(jié)點記錄在一個一維數(shù)組中
,每個結(jié)點的四個兒子采用編號的方式存儲,在建樹之前將每個結(jié)點的信息全部初始
化,初始化的時候需要注意的是每次將當(dāng)前結(jié)點的四個兒子清空,然后判斷它本身是
否是葉子結(jié)點,可以通過x和y區(qū)間端點是否重合來判斷,最后再來生成四個兒子編號
,然后往下遞歸,遞歸結(jié)束后根據(jù)四個兒子的最小值更新當(dāng)前的最小值。再來看詢問
,和一維的情況類似,一維是對區(qū)間交,而二維則是對矩形交,如果詢問的二維區(qū)間
和當(dāng)前結(jié)點管理的二維區(qū)間沒有交集,顯然不可能有最小值,直接返回inf,否則如果
詢問的二維區(qū)間完全包含了當(dāng)前結(jié)點管理的二維區(qū)間,那么返回結(jié)點最小值。否則遞
歸當(dāng)前結(jié)點的四個兒子,取最小值,回歸到根節(jié)點就得到了詢問區(qū)間的最值了。
    需要注意的是在建樹的時候不要在葉子結(jié)點生成多余的兒子結(jié)點,這樣內(nèi)存會多
一倍,如果開得不夠大有可能下標(biāo)越界,開得太大有可能超內(nèi)存。還有就是在二維線
段樹的結(jié)點上信息會多了不少,能節(jié)省空間盡量節(jié)省,比如每個結(jié)點管理的區(qū)間端點
不可能很大,所以不需要int,short就足夠了。
*/


#include 
<iostream>
#include 
<cstring>
#include 
<cstdio>

using namespace std;

#define maxn 310
#define inf  (1<<30)-1

struct Tree {
    
int Min;           // 當(dāng)前結(jié)點區(qū)間最小值
    int son[4];        // 四個兒子在數(shù)組中的編號
    short x[2], y[2];  // 當(dāng)前結(jié)點管理的二維區(qū)間
}
T[maxn*maxn*5];

int Tree_Id;

int n;
int mat[maxn][maxn];

void Build(int fat, int x0, int x1, int y0, int y1) {
    
int i;
    
for(i = 0; i < 4; i++{
        T[fat].son[i] 
= 0;
    }

    T[fat].x[
0= x0;  T[fat].x[1= x1;
    T[fat].y[
0= y0;  T[fat].y[1= y1;

    
if(x0 == x1 && y0 == y1) {
        T[fat].Min 
= mat[x0][y0];
        
return ;
    }

    
for(i = 0; i < 4; i++{
        T[fat].son[i] 
= Tree_Id++;
    }


    
int xmid = (x0 + x1) >> 1;
    
int ymid = (y0 + y1) >> 1;
    Build(T[fat].son[
0], x0, xmid,   y0, ymid);
    Build(T[fat].son[
1], x0, xmid,   (ymid<y1) ? ymid+1 : ymid, y1);
    Build(T[fat].son[
2], (xmid<x1) ? xmid+1 : xmid, x1, y0, ymid);
    Build(T[fat].son[
3], (xmid<x1) ? xmid+1 : xmid, x1, (ymid<y1) ? ymid+1 : ymid, y1);

    T[fat].Min 
= T[T[fat].son[0]].Min;
    
for(i = 1; i < 4; i++{
        
if(T[T[fat].son[i]].Min < T[fat].Min)
            T[fat].Min 
= T[T[fat].son[i]].Min;
    }

}


int Query(int fat, int x0, int x1, int y0, int y1) {
    
if(x0 > T[fat].x[1|| x1 < T[fat].x[0]
    
|| y0 > T[fat].y[1|| y1 < T[fat].y[0]) {
        
return inf;
    }


    
if(x0 <= T[fat].x[0&& T[fat].x[1<= x1
        
&& y0 <= T[fat].y[0&& T[fat].y[1<= y1) {
        
return T[fat].Min;
    }

    
int i;
    
int Min = inf;
    
for(i = 0; i < 4; i++{
        
int v = Query(T[fat].son[i], x0, x1, y0, y1);
        
if(v < Min)
            Min 
= v;
    }

    
return Min;
}


int main() {
    
int t;
    
int i, j;

    scanf(
"%d"&t);
    
while(t--{
        scanf(
"%d"&n);
        Tree_Id 
= 0;
        
for(i = 1; i <= n; i++{
            
for(j = 1; j <= n; j++{
                scanf(
"%d"&mat[i][j]);
            }

        }

        Tree_Id 
= 2;
        Build(
11, n, 1, n);

        
int m;
        scanf(
"%d"&m);

        
while(m--{
            
int r[2], c[2];
            scanf(
"%d %d %d %d"&r[0], &c[0], &r[1], &c[1]);
            printf(
"%d\n", Query(1, r[0], r[1], c[0], c[1]));
        }

    }

    
return 0;
}

posted @ 2011-03-30 13:07 英雄哪里出來 閱讀(1418) | 評論 (0)編輯 收藏

ZJU 2706 Thermal Death of the Universe

     摘要: 題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2706 /**//*題意:    給定一個長度為N(N <= 30000)的數(shù)列Si,緊接著Q條區(qū)間處理,每一條處理的要求是將給定的區(qū)間內(nèi)的數(shù)字替換成他們的平均值,替換時如果當(dāng)前數(shù)列的總和比原先數(shù)列...  閱讀全文

posted @ 2011-03-30 11:58 英雄哪里出來 閱讀(1234) | 評論 (2)編輯 收藏

PKU 3468 A Simple Problem with Integers

     摘要: 題目鏈接:http://poj.org/problem?id=3468 /**//*題意:    給定一個長度為N(N <= 100000)的數(shù)列Si,緊接著Q條詢問,詢問格式如下:"C a b c" 表示對 Aa, Aa+1,  , Ab&...  閱讀全文

posted @ 2011-03-30 11:16 英雄哪里出來 閱讀(1318) | 評論 (0)編輯 收藏

PKU 1151 Atlantis

     摘要: 題目鏈接:http://poj.org/problem?id=1151 /**//*題意:    給定n(n <= 100)個矩形,求它們的面積并。解法:離散化+線段樹 或者 離散化+FloodFill思路:    數(shù)據(jù)量很小,直接把浮點數(shù)離散成整點,然后暴力FloodF...  閱讀全文

posted @ 2011-03-30 00:44 英雄哪里出來 閱讀(1276) | 評論 (0)編輯 收藏

HDU 3265 Posters

     摘要: 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 /**//*題意:    給定N(N <= 50000)個中空的矩形紙片,求它們面積并。解法:離散化+線段樹思路:    2010年寧波區(qū)域賽的題,就是矩形面積并的一個變形,轉(zhuǎn)化很容易想到...  閱讀全文

posted @ 2011-03-29 21:09 英雄哪里出來 閱讀(1477) | 評論 (0)編輯 收藏

PKU 3368 Frequent values

     摘要:  題目鏈接:http://poj.org/problem?id=3368 /**//*題意:    給定一個長度為N(N <= 100000)的單調(diào)不降數(shù)列Si,然后是Q(Q <= 100000)條詢問,問給定區(qū)間出現(xiàn)最多的數(shù)的次數(shù)。解法:離散化+線段樹 或者 離散化+RMQ...  閱讀全文

posted @ 2011-03-29 18:30 英雄哪里出來 閱讀(1220) | 評論 (0)編輯 收藏

PKU 3264 Balanced Lineup

題目鏈接:http://poj.org/problem?id=3264
/*
題意:
    給定一個長度為N(N <= 50000)的數(shù)列Si,緊接著Q(1 <= Q <= 200000)條詢問,
每次詢問給出兩個數(shù)字表示數(shù)列的區(qū)間下標(biāo),問該區(qū)間中最大數(shù)和最小數(shù)的差。

解法:
線段樹 或者 RMQ

思路:
    線段樹區(qū)間最值,維護(hù)一顆完全二叉樹,每個結(jié)點保存兩個值,表示該結(jié)點管理
的區(qū)間的最大值和最小值,比如1號為根結(jié)點,管理區(qū)間[1, n],每個結(jié)點p有左兒子
2*p和右兒子2*p+1,當(dāng)區(qū)間兩端點相同時為葉子結(jié)點,如果p管理的是[a,b]那么2*p則
管理區(qū)間[a, (a+b)/2],2*p+1管理區(qū)間[(a+b)/2+1, b],如此一來就可以通過遞歸,
將兒子的信息傳遞給父親,直至根節(jié)點。
*/


#include 
<iostream>

using namespace std;

#define maxn 50010

struct Tree {
    
int Min, Max;
}
T[maxn*4];

int val[maxn];
typedef 
int Tree_Index;

void Build(int p, int l, int r) {
    
if(l == r) {
        T[p].Max 
= T[p].Min = val[l];
        
return ;
    }

    
int mid = (l + r) >> 1;
    Build(p
<<1, l, mid);
    Build(p
<<1|1, mid+1, r);
    T[p].Max 
= T[p<<1].Max > T[p<<1|1].Max ? T[p<<1].Max : T[p<<1|1].Max;
    T[p].Min 
= T[p<<1].Min < T[p<<1|1].Min ? T[p<<1].Min : T[p<<1|1].Min;
}


Tree_Index Query(
int p, int l, int r, int a, int b, bool bMin) {
    
if(l == a && b == r)
        
return p;
    
int mid = (l + r) >> 1;
    
if(b <= mid) {
        
return Query(p<<1, l, mid, a, b, bMin);
    }
else if(mid + 1 <= a) {
        
return Query(p<<1|1, mid+1, r, a, b, bMin);
    }
else {
        Tree_Index p1 
= Query(p<<1, l, mid, a, mid, bMin);
        Tree_Index p2 
= Query(p<<1|1, mid+1, r, mid+1, b, bMin);
        
if(bMin) {
            
return T[p1].Min < T[p2].Min ? p1 : p2;
        }
else {
            
return T[p1].Max > T[p2].Max ? p1 : p2;
        }

    }

}


int main() {
    
int n, m;
    
int i;
    
while(scanf("%d %d"&n, &m) != EOF) {
        
for(i = 1; i <= n; i++{
            scanf(
"%d"&val[i]);
        }

        Build(
11, n);
        
while(m--){
            
int x, y;
            scanf(
"%d %d"&x, &y);
            Tree_Index pMax 
= Query(11, n, x, y, false);
            Tree_Index pMin 
= Query(11, n, x, y, true);
            printf(
"%d\n", T[pMax].Max - T[pMin].Min);
        }

    }

    
return 0;
}

posted @ 2011-03-29 18:15 英雄哪里出來 閱讀(1215) | 評論 (0)編輯 收藏

PKU 2452 Sticks Problem

     摘要: 題目鏈接:http://poj.org/problem?id=2452 /**//*題意:    給定一個長度為N(N <= 50000)的數(shù)列Si,要求找到Si和Sj(1 <= i < j <= N)使得所有的Sk(i < k...  閱讀全文

posted @ 2011-03-29 18:05 英雄哪里出來 閱讀(1586) | 評論 (0)編輯 收藏

僅列出標(biāo)題
共3頁: 1 2 3 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美视频国产精品| 蜜臀av一级做a爰片久久| 欧美日韩综合在线| 欧美激情成人在线| 欧美男人的天堂| 欧美日韩精品在线| 国产精品九九久久久久久久| 国产精品美女久久福利网站| 欧美日韩一区自拍| 国产精品一区二区久久 | 亚洲欧美日本日韩| 亚洲夜间福利| 久久久亚洲成人| 亚洲国产精品久久人人爱蜜臀 | 国产日韩一级二级三级| 狠狠爱成人网| 午夜视频在线观看一区二区| 午夜一区二区三区在线观看| 欧美xart系列在线观看| 亚洲一级二级| 欧美另类亚洲| 亚洲人成绝费网站色www| 久久se精品一区精品二区| 亚洲黄色影院| 老牛嫩草一区二区三区日本| 久久久久88色偷偷免费| 亚洲国产综合在线| 久久久久欧美精品| 国产私拍一区| 欧美在线一级视频| 亚洲淫性视频| 国产精品露脸自拍| 欧美专区日韩视频| 亚洲欧美三级伦理| 国产美女精品免费电影| 久久国产精品一区二区| 午夜久久久久久| 国产精品一区二区三区久久| 小处雏高清一区二区三区| aa级大片欧美| 国产精品普通话对白| 欧美一区二区精品| 久久精彩视频| 亚洲看片一区| 亚洲一区中文字幕在线观看| 国产一区二区黄色| 亚洲精选在线观看| 国产婷婷色综合av蜜臀av | 亚洲第一中文字幕在线观看| 欧美不卡高清| 国产麻豆精品在线观看| 久久久www成人免费精品| 欧美高潮视频| 久久免费99精品久久久久久| 久久久成人精品| 午夜在线视频观看日韩17c| 久久蜜臀精品av| 久久精品久久综合| 欧美 日韩 国产在线| 香蕉亚洲视频| 亚洲国产精品久久久| 国产欧美精品日韩区二区麻豆天美 | 欧美刺激午夜性久久久久久久| 欧美福利视频一区| 久久激五月天综合精品| 欧美日韩精品免费观看视一区二区| 久久色在线播放| 国产亚洲成av人片在线观看桃| 一区电影在线观看| 亚洲午夜一区| 欧美一区在线直播| 久久嫩草精品久久久精品| 国产亚洲精品aa午夜观看| 午夜精品久久久久久久99水蜜桃| 午夜精品久久久久久久久| 国产精品久久久久久久久久免费看| 美女视频黄 久久| 日韩一级免费| 欧美视频中文在线看| 亚洲欧美日韩另类| 欧美成人一区二区三区在线观看| 亚洲福利在线看| 欧美系列亚洲系列| 久久亚洲国产精品一区二区 | 99国产精品久久| 亚洲欧美一区二区激情| 精品福利免费观看| 欧美精品v日韩精品v国产精品| 99re热精品| 久久亚洲影音av资源网| 亚洲无亚洲人成网站77777| 激情五月婷婷综合| 久久久国产视频91| 欧美啪啪一区| 亚洲欧美激情一区| 亚洲精品久久久蜜桃| 欧美综合二区| 先锋a资源在线看亚洲| 亚洲免费av网站| 黄色成人av| 国产在线不卡| 国产精品一区二区在线| 欧美午夜精品久久久久久浪潮| 麻豆亚洲精品| 免费日韩av片| 欧美电影美腿模特1979在线看| 久久精品天堂| 久久伊伊香蕉| 毛片一区二区三区| 久久精品国产91精品亚洲| 亚洲欧美成人网| 亚洲欧美另类在线| 亚洲一区自拍| 久久国产精品电影| 久久亚洲国产精品一区二区 | 欧美经典一区二区三区| 欧美1区2区视频| 欧美午夜不卡在线观看免费| 欧美精品在欧美一区二区少妇| 欧美国产激情二区三区| 欧美日韩精品一区二区三区四区| 欧美精品电影在线| 国产精品一区二区三区四区| 国产亚洲欧美一区二区| 亚洲电影下载| 午夜精品久久久久久久男人的天堂 | 在线视频精品一区| 亚洲天堂av在线免费观看| 国产精品第2页| 国产亚洲一区二区三区在线观看 | 久久国产精品一区二区| 久久人人爽人人爽| 国产精品视频不卡| 在线中文字幕日韩| 久久夜色精品国产欧美乱极品| 亚洲免费观看视频| 久久久在线视频| 国产精品久久久久毛片大屁完整版 | 亚洲精品免费在线| 欧美一区二区网站| 国产精品免费网站| 在线视频一区二区| 免费在线亚洲| 久久av资源网站| 国产精品推荐精品| 欧美亚洲在线观看| 午夜精彩国产免费不卡不顿大片| 免费的成人av| 亚洲激情另类| 美日韩精品免费| 久久综合色一综合色88| 韩国av一区二区三区| 久久成人综合网| 久久久av网站| 亚洲电影在线观看| 亚洲国产精品久久久久| 欧美日本在线视频| 午夜精品视频在线观看| 欧美在线三级| 亚洲精品一二区| 在线视频免费在线观看一区二区| 国产精品亚洲综合一区在线观看| 欧美一级成年大片在线观看| 一区二区三区四区五区视频| 日韩一级免费| 欧美va天堂在线| 国产精品白丝黑袜喷水久久久| 亚洲欧美激情精品一区二区| 欧美中文在线观看国产| 一本色道久久综合亚洲精品不| 亚洲一区欧美激情| 亚洲精品乱码久久久久| 欧美一区二区三区日韩视频| 亚洲精品日韩一| 久久艳片www.17c.com| 欧美中文字幕| 国产精品成人va在线观看| 亚洲精品欧美极品| 亚洲精品系列| 久久夜色精品国产欧美乱极品| 午夜久久影院| 欧美日韩在线一区二区三区| 欧美成人综合在线| 91久久精品一区| 欧美精品日韩一区| 亚洲精品婷婷| 亚洲在线1234| 国产精品一区二区在线观看网站| 夜色激情一区二区| 亚洲午夜久久久久久久久电影网| 久久综合福利| 亚洲人成人一区二区三区| 亚洲美女毛片| 国产精品视频一区二区高潮| 午夜国产一区| 日韩网站在线| 久久久亚洲午夜电影| 亚洲精品在线免费观看视频| 欧美日韩久久| 久久尤物视频|