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

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

PKU 3378 Crazy Thairs

題目鏈接:http://poj.org/problem?id=3378
/*
題意:
    給定N (1 <= N <= 50000) 個(gè)小于等于10^9的數(shù)Ai, 要求找出Crazy Thair的數(shù)量。
Crazy Thair是一個(gè)五元組{i, j, k, l, m}滿足: 
1. 1 <= i < j < k < l < m <= N
2. Ai < Aj < Ak < Al < Am 

解法:
    樹狀數(shù)組

思路:
    可以參考以下這題的解法:
http://m.shnenglu.com/menjitianya/archive/2011/04/06/143510.html
    那一題求得是非遞減數(shù)列的數(shù)量,沒有要求元素個(gè)數(shù),這題是要求元素個(gè)數(shù)一定要
是5個(gè),我們還是可以寫出狀態(tài)轉(zhuǎn)移方程:
dp[i][j] = sum{ dp[i-1][k], k<j, a[k] < a[j] } dp[i][j]表示長度為i以j結(jié)尾的
序列的數(shù)量,這題需要建立5個(gè)樹狀數(shù)組,sum這一步操作就可以通過樹狀數(shù)組的成段求
和來做。每次求i-1的滿足情況的解,完畢后就將答案插入到i的樹狀數(shù)組中。
    當(dāng)長度為5的時(shí)候就是最后的答案了,累加即可。
*/

#include 
<iostream>
#include 
<algorithm>
using namespace std;

typedef 
int hugeint;
const int Base = 10000
const int Capacity = 7;

struct xnum {
    
int Len;
    
int Data[Capacity];
    xnum() : Len(
0{}
    xnum(
const xnum& V) : Len(V.Len) {
        memcpy(Data, V.Data, Len 
* sizeof *Data);
    }

    xnum(
int V) : Len(0
        
for (; V > 0; V /= Base) Data[Len++= V % Base;
    }

    xnum(
char S[]);
    xnum
& operator=(const xnum& V) 
        Len 
= V.Len;
        memcpy(Data, V.Data, Len 
* sizeof *Data); 
        
return *this;
    }

    
int& operator[](int Index) return Data[Index]; }
    
int operator[](int Index) const return Data[Index]; }
    
void print(){
        printf(
"%d",Len==0?0:Data[Len-1]);
        
for(int i=Len-2;i>=0;i--)
            
for(int j=Base/10;j>0;j/=10)
                printf(
"%d",Data[i]/j%10);
    }

}
;

xnum::xnum(
char S[]) {
    
int I, J;
    Data[Len 
= 0= 0;
    J 
= 1;
    
for (I = strlen(S)-1; I>=0; I--{
        Data[Len] 
+= (S[I] - '0'* J;
        J 
*= 10;
        
if (J >= Base) J = 1, Data[++Len] = 0;
    }

    
if (Data[Len] > 0) Len++;
}


int compare(const xnum& A, const xnum& B) {
    
int I;
    
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;
    
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);
    
if (I < 0return 0;
    
return A[I] > B[I] ? 1 : -1;
}


xnum 
operator+(const xnum& A, const xnum& B) {
    xnum R;
    
int I;
    
int Carry = 0;
    
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
    
{
        
if (I < A.Len) Carry += A[I];
        
if (I < B.Len) Carry += B[I];
        R[I] 
= Carry % Base;
        Carry 
/= Base;
    }

    R.Len 
= I;
    
return R;
}


xnum 
operator-(const xnum& A, const xnum& B) {
    xnum R;
    
int Carry = 0;
    R.Len 
= A.Len;
    
int I;
    
for (I = 0; I < R.Len; I++{
        R[I] 
= A[I] - Carry;
        
if (I < B.Len) R[I] -= B[I];
        
if (R[I] < 0) Carry = 1, R[I] += Base;
        
else Carry = 0;
    }

    
while (R.Len > 0 && R[R.Len - 1== 0) R.Len--;
    
return R;
}


xnum 
operator*(const xnum& A, const int B) {
    
int I;
    
if (B == 0return 0;
    xnum R;
    hugeint Carry 
= 0;
    
for (I = 0; I < A.Len || Carry > 0; I++)
    
{
        
if (I < A.Len) Carry += hugeint(A[I]) * B;
        R[I] 
= Carry % Base;
        Carry 
/= Base;
    }

    R.Len 
= I;
    
return R;
}


xnum 
operator*(const xnum& A, const xnum& B) {
    
int I;
    
if (B.Len == 0return 0;
    xnum R;
    
for (I = 0; I < A.Len; I++{
        hugeint Carry 
= 0;
        
for (int J = 0; J < B.Len || Carry > 0; J++{
            
if (J < B.Len) Carry += hugeint(A[I]) * B[J];
            
if (I + J < R.Len) Carry += R[I + J];
            
if (I + J >= R.Len) R[R.Len++= Carry % Base;
            
else R[I + J] = Carry % Base;
            Carry 
/= Base;
        }
   
    }

    
return R;
}


xnum 
operator/(const xnum& A, const int B) {
    xnum R;
    
int I;
    hugeint C 
= 0;
    
for (I = A.Len - 1; I >= 0; I--)
    
{
        C 
= C * Base + A[I];
        R[I] 
= C / B;
        C 
%= B;
    }

    R.Len 
= A.Len;
    
while (R.Len > 0 && R[R.Len - 1== 0) R.Len--;
    
return R;
}


xnum 
operator/(const xnum& A, const xnum& B) {
    
int I;
    xnum R, Carry 
= 0;
    
int Left, Right, Mid;
    
for (I = A.Len - 1; I >= 0; I--{
        Carry 
= Carry * Base + A[I];
        Left 
= 0;
        Right 
= Base - 1;
        
while (Left < Right) {
            Mid 
= (Left + Right + 1/ 2;
            
if (compare(B * Mid, Carry) <= 0) Left = Mid;
            
else Right = Mid - 1;
        }

        R[I] 
= Left;
        Carry 
= Carry - B * Left;
    }

    R.Len 
= A.Len;
    
while (R.Len > 0 && R[R.Len - 1== 0) R.Len--;
    
return R;
}


xnum 
operator%(const xnum& A, const xnum& B) {
    
int I;
    xnum R, Carry 
= 0;
    
int Left, Right, Mid;
    
for (I = A.Len - 1; I >= 0; I--{
        Carry 
= Carry * Base + A[I];
        Left 
= 0;
        Right 
= Base - 1;
        
while (Left < Right) {
            Mid 
= (Left + Right + 1/ 2;
            
if (compare(B * Mid, Carry) <= 0) Left = Mid;
            
else Right = Mid - 1;
        }

        R[I] 
= Left;
        Carry 
= Carry - B * Left;
    }

    R.Len 
= A.Len;
    
while (R.Len > 0 && R[R.Len - 1== 0) R.Len--;
    
return Carry;
}


istream
& operator>>(istream& In, xnum& V) {
    
char Ch;
    
for (V = 0; In >> Ch;) {
        V 
= V * 10 + (Ch - '0');
        
if (cin.peek() <= ' 'break;
    }

    
return In;
}


ostream
& operator<<(ostream& Out, const xnum& V) {
    
int I;
    Out 
<< (V.Len == 0 ? 0 : V[V.Len - 1]);
    
for (I = V.Len - 2; I >= 0; I--
        
for (int J = Base / 10; J > 0; J /= 10
            Out 
<< V[I] / J % 10;
        
return Out;
}


xnum gcd(xnum a,xnum b) 
{
    
if(compare(b,0)==0return a;
    
else return gcd(b,a%b); 
}


int div(char *A,int B) {
    
int I;
    
int C = 0;
    
int Alen=strlen(A);
    
for (I = 0; I <Alen; I++)
    
{
        C 
= C * Base + A[I]-'0';
        C 
%= B;
    }

    
return C;
}


#define maxn 50010

int n;
xnum c[
6][maxn];
int val[maxn], bin[maxn], tot;

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


void add(int idx, int pos, xnum v) {
    
while(pos <= n) {
        c[idx][pos] 
= c[idx][pos] + v;
        pos 
+= lowbit(pos);
    }

}


xnum sum(
int idx, int pos) {
    xnum s 
= 0;
    
while(pos > 0{
        s 
= s + c[idx][pos];
        pos 
-= lowbit(pos);
    }

    
return s;
}


int Bin(int v) {
    
int l = 1;
    
int r = tot;
    
while(l <= r) {
        
int m = (l + r) >> 1;
        
if(bin[m] == v)
            
return m;
        
if(v > bin[m]) {
            l 
= m + 1;
        }
else
            r 
= m - 1;
    }

}



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

        sort(bin
+1, bin+1+n);
        
for(i = 1; i <= n; i++{
            
if(i==1 || bin[i] != bin[i-1])
                bin[ 
++tot ] = bin[i];
        }

        
for(i = 0; i <= 5; i++{
            
for(j = 1; j <= n; j++)
                c[i][j] 
= 0;
        }


        
for(i = 1; i <= n; i++{
            val[i] 
= Bin(val[i]);
        }

        xnum ans 
= 0;
        
for(i = 1; i <= n; i++{
            add(
1, val[i], 1);
            
for(j = 2; j <= 5; j++{
                xnum p 
= sum(j-1, val[i]-1);
                
if(p.Len)
                    add(j, val[i], p);

                
if(j == 5{
                    ans 
= ans + p;
                }

            }

        }

        ans.print();
        puts(
"");
    }

    
return 0;
}

posted on 2011-04-07 13:16 英雄哪里出來 閱讀(1528) 評論(0)  編輯 收藏 引用 所屬分類: 樹狀數(shù)組

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精一区二区三区| 亚洲黄色一区二区三区| 久久激情网站| 亚洲自拍三区| 欧美一级理论性理论a| 欧美一区二区网站| 久久精品一区四区| 蜜臀99久久精品久久久久久软件| 久久综合狠狠综合久久激情| 欧美精品观看| 欧美日韩视频第一区| 欧美日韩亚洲综合在线| 欧美日韩中文另类| 国产欧美va欧美不卡在线| 国产亚洲欧美一区| 亚洲高清二区| 亚洲视频在线观看网站| 欧美在线免费一级片| 久久伊人精品天天| 91久久精品网| 91久久黄色| 亚洲免费人成在线视频观看| 性欧美1819sex性高清| 久久国产视频网| 欧美**人妖| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产视频直播| 欧美一区二区三区在线看 | 欧美三区不卡| 国产午夜精品一区二区三区欧美| 在线观看精品视频| 欧美在线视频免费| 亚洲三级免费| 久久久久久精| 国产精品一区二区三区久久久 | 亚洲特级毛片| 老鸭窝毛片一区二区三区| 欧美午夜理伦三级在线观看| 在线欧美亚洲| 久久免费的精品国产v∧| 亚洲乱码精品一二三四区日韩在线 | 日韩亚洲欧美成人| 久久综合狠狠综合久久综青草| 欧美日韩一区在线观看视频| 亚洲国产成人久久综合一区| 欧美主播一区二区三区| 亚洲欧洲日夜超级视频| 久久综合中文色婷婷| 国产日本欧美视频| 亚洲一区欧美二区| 日韩一区二区免费看| 欧美激情精品久久久六区热门 | 亚洲精品精选| 先锋影音网一区二区| 久久久免费观看视频| 亚洲国产成人91精品| 久久精品国产久精国产爱| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久 | 亚洲综合第一| 国产精品美女视频网站| 亚洲视频免费观看| 日韩视频在线免费| 欧美四级在线观看| 亚洲免费人成在线视频观看| 亚洲欧洲一区| 欧美区二区三区| 亚洲视频中文字幕| 日韩一级在线| 国产精品人人爽人人做我的可爱| 午夜精品久久久久久| 亚洲一区视频在线观看视频| 国产精品人成在线观看免费| 久久成人在线| 久久爱www久久做| 国外成人在线视频网站| 欧美成人久久| 欧美日韩一区综合| 亚洲综合精品一区二区| 欧美一区二区三区日韩| 在线精品国精品国产尤物884a| 免播放器亚洲一区| 欧美精品在线免费观看| 亚洲欧美日韩精品久久| 亚洲中无吗在线| 狠狠色2019综合网| 91久久在线观看| 国产精品普通话对白| 久久亚洲一区二区| 欧美激情一区二区三区蜜桃视频| 在线亚洲精品| 欧美一区二区三区婷婷月色| 亚洲精品国产精品乱码不99| 亚洲图片在区色| 影音先锋日韩资源| 日韩亚洲欧美综合| 国产在线高清精品| 亚洲精品一区二| 国产日韩欧美电影在线观看| 欧美成人综合网站| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 亚洲欧美日韩系列| 最新国产成人在线观看| 正在播放欧美一区| 亚洲国产cao| 亚洲一区欧美一区| 亚洲韩国一区二区三区| 一本色道88久久加勒比精品| 黄色亚洲在线| 一区二区成人精品| 亚洲激情在线激情| 久久夜色精品国产亚洲aⅴ| 亚洲天堂网在线观看| 亚洲国产综合在线看不卡| 亚洲一区二区黄| 亚洲欧洲免费视频| 欧美亚洲一级片| 亚洲综合丁香| 欧美激情一区二区| 欧美成人精品在线| 国产乱码精品一区二区三| 亚洲精品孕妇| 亚洲欧洲在线免费| 久久久国产一区二区| 久久成人精品| 国产精品一区二区三区免费观看 | 欧美一区二区三区在| 99一区二区| 蜜臀久久99精品久久久画质超高清 | 欧美激情亚洲综合一区| 国产一区二区精品丝袜| 亚洲一区二三| 亚洲网站在线观看| 欧美日韩国产精品一区二区亚洲| 免费在线观看精品| 国产一区二区三区高清| 亚洲一区欧美一区| 欧美在线综合| 国产欧美日韩专区发布| 亚洲综合色激情五月| 午夜亚洲一区| 国产欧美日韩精品在线| 亚洲一级高清| 性欧美激情精品| 国产精品专区一| 午夜精品久久久久久久久久久久久 | 亚洲国产精品成人va在线观看| 欧美一区二区三区视频在线| 午夜免费日韩视频| 国产精品亚洲综合| 亚洲影院在线| 欧美有码在线视频| 国产亚洲欧美一级| 久久国产精品电影| 亚洲承认在线| 欧美黄色小视频| 在线观看日韩欧美| 麻豆精品精品国产自在97香蕉| 亚洲电影免费观看高清| 亚洲成人资源| 欧美久久影院| 中文日韩在线视频| 久久久成人精品| 亚洲电影免费观看高清完整版| 免费在线观看一区二区| 亚洲精品日日夜夜| 亚洲欧美网站| 理论片一区二区在线| 在线成人av| 欧美成人a∨高清免费观看| 亚洲黄色高清| 欧美一级网站| 极品中文字幕一区| 欧美韩国一区| 亚洲午夜免费视频| 久久一区二区精品| 一区二区三区黄色| 国产精品看片你懂得| 欧美一区二视频| 亚洲激情视频在线播放| 亚洲欧美精品suv| 伊人久久久大香线蕉综合直播| 免费影视亚洲| 午夜精品久久久久久99热| 亚洲电影免费观看高清完整版在线 | 夜夜精品视频| 久久一区二区视频| 亚洲视频一区二区在线观看| 国产婷婷色综合av蜜臀av| 欧美激情免费观看| 先锋影音国产精品| 夜夜嗨av一区二区三区网页| 裸体女人亚洲精品一区| 亚洲欧美另类中文字幕| 伊人久久综合97精品| 国产精品每日更新在线播放网址| 久久久国产一区二区| 欧美亚洲一区二区在线| 一本一本大道香蕉久在线精品| 免播放器亚洲一区| 久久成人综合视频|