ZOJ 2962 Stack By Stack(遞歸)

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

題意:給你n個棧,每個棧給定大小爲Ci,現在進行這樣的操作:

情況1,當沒有棧是滿的情況,將第一個棧裝入1~C1的數,也就是裝滿;

情況2,有一個棧i已經裝滿,那麼將棧i的內容逐個彈出,裝到下一個棧i+1中,直到棧i+1滿了,或者棧i空了,注意如果棧i+1先滿,且棧i不爲空,則清空棧i

所有操作進行到棧n滿爲止

最後詢問棧n中第x到第y個數的和


分析:仔細模擬一遍,發現每個棧i的內容,只和它前一個棧i-1內容有關,即爲零個到多個的前一個棧倒置+前一個棧末尾的幾個數倒置,也就是要知道棧i的內容,可以去棧i-1找,這樣很容易想到用遞歸來做,具體看代碼吧,很短。。。。除了頭文件

ps:好久沒更新了,一直在刷專題,做訓練賽,過一陣子再做些專題總結吧T_T

代碼:

/** head files*/
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

/** some operate*/
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define DWN(i,h,l) for(int i=(h);i>=(l);--i)
#define CLR(arr) memset(arr,0,sizeof(arr))
#define MAX3(a,b,c) max(a,max(b,c))
#define MAX4(a,b,c,d) max(max(a,b),max(c,d))
#define MIN3(a,b,c) min(a,min(b,c))
#define MIN4(a,b,c,d) min(min(a,b),min(c,d))

/** some const*/
#define N 200010
#define PI acos(-1.0)
#define oo 1000000000
#define loo 1000000000000000000LL
#define eps 1e-8
/** some alias*/
typedef long long LL;

int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
/** Global variables*/

/** some template names, just push ctrl+j to get it in*/
//getint 讀入優化
//manacher 求最長迴文子串
//pqueue 優先隊列
//combk n元素序列的第m小的組合和
//pmatrix n個點的最大子矩陣
//suffixarray 後綴數組
//sbtree 平衡樹
LL sum[N];
int c[N];
LL Query(int n, int x)
{
    if(!n)return (LL)x*(x+1)/2;
    return (LL)sum[n-1]*(x/c[n-1])+sum[n-1]-Query(n-1,c[n-1]-(x%c[n-1]));
}
int main()
{
    int n,x,y;
    while(~scanf("%d",&n))
    {
        REP(i,n)
        {
            scanf("%d",&c[i]);
            sum[i]=Query(i,c[i]);
        }
        scanf("%d%d",&x,&y);
        printf("%lld\n",Query(n-1,y)-Query(n-1,x-1));
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章