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

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

PKU 3378 Crazy Thairs

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

解法:
    樹狀數組

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

#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 英雄哪里出來 閱讀(1521) 評論(0)  編輯 收藏 引用 所屬分類: 樹狀數組

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 国产精品亚洲аv天堂网| 欧美在线国产| 蜜臀av性久久久久蜜臀aⅴ| 亚洲免费av片| 亚洲综合导航| 在线看片日韩| 日韩视频亚洲视频| 国产一区二区三区在线观看免费视频| 久久综合伊人77777| 欧美欧美天天天天操| 亚洲欧美偷拍卡通变态| 久久精品一区二区三区中文字幕| 亚洲黄网站黄| 亚洲午夜久久久久久尤物| 国产主播精品在线| 亚洲人成在线播放| 国产精品久久久久久av下载红粉| 久久婷婷国产综合精品青草| 欧美精品1区2区3区| 欧美影院一区| 欧美精品在线观看91| 久久久久免费视频| 国产精品v欧美精品v日韩| 欧美成人午夜激情在线| 国产精品亚洲第一区在线暖暖韩国| 欧美777四色影视在线| 国产精品久久久久毛片软件| 欧美成人一区二区三区在线观看 | 亚洲神马久久| 一本色道精品久久一区二区三区| 久久久久久999| 午夜久久影院| 欧美韩日精品| 美女啪啪无遮挡免费久久网站| 欧美日本一区二区高清播放视频| 久久在线免费观看| 国产精品一区久久久| 亚洲精品综合精品自拍| 亚洲国产91| 欧美在线观看一区| 亚洲欧美国产毛片在线| 欧美久久久久久久久| 免费欧美日韩| 国产一区二区三区直播精品电影 | 欧美影院午夜播放| 亚洲欧美日韩国产综合在线| 欧美日韩不卡合集视频| 亚洲高清激情| 亚洲国产va精品久久久不卡综合| 欧美亚洲日本网站| 欧美一区二视频| 国产精品高潮呻吟视频| 99re6这里只有精品| 99精品国产热久久91蜜凸| 美女主播视频一区| 欧美成人精品在线| 伊甸园精品99久久久久久| 欧美一区二区在线免费播放| 久久av老司机精品网站导航| 国产精品你懂的在线欣赏| 中日韩美女免费视频网站在线观看| 99精品欧美| 欧美日韩综合视频| 亚洲一区久久久| 欧美伊人久久久久久午夜久久久久 | 欧美一级欧美一级在线播放| 欧美国产成人精品| 午夜精彩国产免费不卡不顿大片| 欧美国内亚洲| 欧美aⅴ一区二区三区视频| 禁断一区二区三区在线| 久久久人成影片一区二区三区观看 | 亚洲第一成人在线| 欧美成人激情视频| 亚洲精品在线观看免费| 亚洲影院色在线观看免费| 国产精品久久久久久久7电影| 亚洲免费婷婷| 久久这里只有| 99国产精品99久久久久久粉嫩| 欧美日韩视频在线一区二区观看视频 | 亚洲人成网站在线观看播放| 欧美精品尤物在线| 亚洲欧美乱综合| 欧美插天视频在线播放| 一本色道久久综合精品竹菊| 国产乱肥老妇国产一区二| 久久久九九九九| 亚洲区中文字幕| 欧美尤物一区| 亚洲毛片在线看| 国产亚洲激情视频在线| 欧美福利一区| 午夜欧美理论片| 亚洲国产日韩欧美在线动漫| 亚洲欧美激情视频| 亚洲国产你懂的| 国产日韩欧美一二三区| 欧美国产欧美综合| 欧美一区亚洲二区| 999在线观看精品免费不卡网站| 久久久91精品国产一区二区精品| 日韩一级不卡| 伊人色综合久久天天| 国产精品人人爽人人做我的可爱| 久久夜精品va视频免费观看| 亚洲一区二区三区四区五区午夜 | 午夜日韩福利| 99国产精品自拍| 亚洲国产精品t66y| 国产一区二区无遮挡| 欧美日韩综合在线| 欧美国产精品| 久久中文久久字幕| 亚洲欧美制服中文字幕| 日韩亚洲一区二区| 欧美激情视频一区二区三区在线播放 | 久久综合99re88久久爱| 亚洲制服丝袜在线| 日韩一级精品视频在线观看| 一区在线播放视频| 国产一本一道久久香蕉| 国产精品家教| 欧美日韩人人澡狠狠躁视频| 蜜桃精品久久久久久久免费影院| 欧美在线地址| 欧美一区二区三区在| 午夜精品久久久久久久99水蜜桃 | 老司机aⅴ在线精品导航| 久久国产加勒比精品无码| 亚洲欧美在线另类| 亚洲欧美日韩另类| 亚洲男人第一av网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 最新国产成人av网站网址麻豆| 影音先锋亚洲视频| 在线观看av一区| 亚洲国产你懂的| 日韩小视频在线观看| 亚洲精品视频啊美女在线直播| 亚洲黄色影片| 亚洲精品日韩综合观看成人91| 亚洲免费高清视频| 夜夜嗨网站十八久久 | 国产精品午夜av在线| 国产精品亚洲欧美| 老色批av在线精品| 欧美成人精品一区二区三区| 欧美黑人一区二区三区| 欧美日韩国产三级| 国产精品男gay被猛男狂揉视频| 国产精品成人观看视频国产奇米| 国产欧美一区二区在线观看| 国产欧美日韩高清| 狠狠爱www人成狠狠爱综合网| 在线观看91精品国产麻豆| 亚洲日产国产精品| 亚洲男同1069视频| 久久久久欧美精品| 亚洲日本中文字幕区 | 久久久国产精品一区| 免费亚洲视频| 亚洲人永久免费| 亚洲综合首页| 久久综合九色综合久99| 欧美三区在线视频| 尤物yw午夜国产精品视频明星| 日韩视频在线一区二区| 欧美在线视屏| 欧美激情片在线观看| 亚洲欧美日韩直播| 欧美成人午夜剧场免费观看| 国产精品久久久久av免费| 亚洲国产成人精品女人久久久| 亚洲一区二区在线播放| 美女精品自拍一二三四| 中文在线资源观看网站视频免费不卡 | 亚洲一区高清| 免费在线国产精品| 中日韩美女免费视频网址在线观看 | 亚洲美洲欧洲综合国产一区| 午夜精品久久| 欧美老女人xx| 在线观看欧美精品| 午夜精品在线看| 日韩一级视频免费观看在线| 久久久99免费视频| 国产精品永久| 亚洲图片欧洲图片日韩av| 欧美大尺度在线观看| 欧美亚洲视频在线观看|