題目: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;
}