[ZJ][BIT+DP] a596. 祖要段考了!!!!!!!!@Morris' Blog|PChome Online 人新台
2013-01-21 07:07:42| 人1,099| 回1 | 上一篇 | 下一篇
<-- start of blogbody2 -->

[ZJ][BIT+DP] a596. 祖要段考了!!!!!!!!

0 收藏 0 0 站台

容 :

快要段考了!!!!!!!!!!!!

平常在上的小小高中生 " 祖 " 感到非常的惶!!!! OAO~~

而了他的情造了多的JIZZZ

他把JIZZ成一碗一碗的,然後把一碗一碗的JIZZZ堆成一一的 

而他了一件神奇的事~~ 

面看起高低相且度大於二,就可以"祖的祝福" 技能XD

他感到欣喜若狂!!!!!!

告祖他可以技能次!! 

又因可以太多次了~~只要告她 (方法 mod 12345) 就好了!! 

入明 :

共有1000料。 

始出N ( 0<N<=1500 )。

再有N字,分代表各堆的高度,祖已把他堆成一一的~而你不能把它拆!!!! ( 0<=每高度<=30000 )

出明 :

出符合技能件的方法%12345

例入 :help

5 1 0 2 3 0

例出 :

9

提示 :

背景知: Dynamic Programming

共有下列9:

1 0 2

1 0 3

2 3 0

0 3 0

1 3 0

1 0 3 0

0 2 0

1 0 2 0

1 2 0

 

出 :

祖的 JIZZZZZZZZZZZZZZ (管理:eop112358130)


目我研究了一下,不是很懂目要求什。

後他要求的子列的件是,高低高低高低 ... 或 低哥低高低高。
其中度要大於等於三。

先看一很容易懂的 TLE O(N^2)

由於度限制要大於二,那先建立一表分前一次是上升,前一次是下降

/**********************************************************************************/
/*  Problem: a596 "祖要段考了!!!!!!!!" from 祖的 JIZZZZZZZZZZZZZZ */
/*  Language: CPP (1134 Bytes)                                                    */
/*  Result: WA(line:52) judge by this@ZeroJudge                                   */
/*  Author: morris1028 at 2013-01-20 10:48:48                                     */
/**********************************************************************************/


#include <stdio.h>

int main() {
    int n, i, j, A[1505];
    int dp[1505][2]; // [0] up, [1] down
    int test = 0;
    while(scanf("%d", &n) == 1) {
        if(test++ > 50)  break;
        for(i = 0; i < n; i++) {
            scanf("%d", &A[i]);
            dp[i][0] = dp[i][1] = 0;
        }
        for(i = 0; i < n; i++) {
            for(j = 0; j < i; j++) {
                if(A[i] > A[j])
                    dp[i][0]++;
                if(A[i] < A[j])
                    dp[i][1]++;
            }  
        }
        int ans = 0;
        for(i = 0; i < n; i++) {
            ans -= dp[i][0] + dp[i][1];
            for(j = 0; j < i; j++) {
                if(A[i] > A[j])
                    dp[i][0] += dp[j][1];
                if(A[i] < A[j])
                    dp[i][1] += dp[j][0];
                if(dp[i][0] >= 12345)
                    dp[i][0] -= 12345;
                if(dp[i][1] >= 12345)
                    dp[i][1] -= 12345;
            }
            ans += dp[i][0] + dp[i][1];
            ans %= 12345;
        }
        printf("%d\n", ans);
    }
    return 0;
}

拉成 BIT 去完成。

/**********************************************************************************/
/*  Problem: a596 "祖要段考了!!!!!!!!" from 祖的 JIZZZZZZZZZZZZZZ */
/*  Language: C (1506 Bytes)                                                      */
/*  Result: AC(388ms, 568KB) judge by this@ZeroJudge                              */
/*  Author: morris1028 at 2013-01-20 11:04:31                                     */
/**********************************************************************************/


#include <stdio.h>
#define lowbit(x) (x&(-x))
void modify(int idx, int N, int k, int C[]) {
    while(idx <= N) {
        C[idx] += k, idx += lowbit(idx);
        if(C[idx] >= 12345)
            C[idx] %= 12345;
    }
}
int query(int idx, int C[]) {
    static int sum;
    sum = 0;
    while(idx > 0) {
        sum += C[idx];
        idx -= lowbit(idx);
    }
    return sum%12345;
}
int main() {
    int n, i, j, A[1505];
    int dp[1505][2];
    while(scanf("%d", &n) == 1) {
        int B1[32768] = {}, B2[32768] = {};
        for(i = 0; i < n; i++) {
            scanf("%d", &A[i]);
            A[i]++;
            dp[i][0] = dp[i][1] = 0;
        }
        for(i = 0; i < n; i++) {
            int a1, a2;
            a1 = query(A[i]-1, B1);
            a2 = query(A[i], B1);
            modify(A[i], 32767, 1, B1);
            dp[i][0] = a1;
            dp[i][1] = i-a2;
        }
        for(i = 0; i < 32768; i++)
            B1[i] = B2[i] = 0;
        int ans = 0;
        for(i = 0; i < n; i++) {
            ans -= dp[i][0] + dp[i][1];
            int a1, a2;
            a1 = query(A[i]-1, B2);
            dp[i][0] += a1;
            a2 = query(32767, B1) - query(A[i], B1);
            dp[i][1] += a2;
            modify(A[i], 32767, dp[i][0], B1);
            modify(A[i], 32767, dp[i][1], B2);
            ans += dp[i][0] + dp[i][1];
            ans %= 12345;
        }
        printf("%d\n", (ans+12345)%12345);
    }
    return 0;
}

台: Morris
人(1,099) | 回(1)| 推 (0)| 收藏 (0)|
全站分: 不分 | 人分: ZeroJudge |
此分下一篇:[ZJ][DFS剪枝] b153. NOIP2004 4.虫食算
此分上一篇:[ZJ][DFS/BFS] a597. 祖被榨乾了!!!!!!!!

的客
一下,甚最大一定要用到32767不是到30001?
2013-12-08 21:02:06
版主回
打那字於 30001
2013-12-09 07:36:32
是 (若未登入"人新台"看不到回覆唷!)
* 入:
入片中算式的果(可能0) 
(有*必填)
TOP
全文
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86