我™不知道为什么我st表用线段树实现就WA了?有哪位巨佬可以帮我看一下啊?A的代码是用单调队列做的。
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define MAXN 2005
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int T,maxp,W,AS[MAXN],BS[MAXN],AP[MAXN],BP[MAXN],dp[MAXN][MAXN];
struct Segment{
int maxn[MAXN << 2];
Segment(){memset (maxn,0xcf,sizeof (maxn));}
void Pushup (int i){maxn[i] = max (maxn[i << 1],maxn[i << 1 | 1]);}
void build (int kase,int k,int i,int l,int r){
if (l == r){
if (kase == 0) maxn[i] = BP[k + W + 1] * l + dp[k][l];
else maxn[i] = AP[k + W + 1] * l + dp[k][l];
return ;
}
int mid = (l + r) >> 1;
build (kase,k,i << 1,l,mid);
build (kase,k,i << 1 | 1,mid + 1,r);
Pushup (i);
}
int query (int i,int l,int r,int ql,int qr){
if (l >= ql && r <= qr) return maxn[i];
int mid = (l + r) >> 1,res = 0;
if (ql <= mid) res = max (res,query (i << 1,l,mid,ql,qr));
if (qr > mid) res = max (res,query (i << 1 | 1,mid + 1,r,ql,qr));
return res;
}
}Tree[2][MAXN];
signed main(){
// freopen ("test1.in","r",stdin)
read (T,maxp,W);
for (Int i = 1;i <= T;++ i) read (AP[i],BP[i],AS[i],BS[i]);
memset (dp,0xcf,sizeof (dp)),dp[0][0] = 0;
for (Int i = 1;i <= T;++ i)
for (Int j = 0;j <= AS[i];++ j)
dp[i][j] = -AP[i] * j;
for (Int i = 0;i <= T;++ i){
if (i) for (Int j = 0;j <= maxp;++ j) dp[i][j] = max (dp[i][j],dp[i - 1][j]);
if (i - W - 1 >= 0){
for (Int j = 0;j <= maxp;++ j){
dp[i][j] = max (dp[i][j],Tree[1][i - W - 1].query (1,0,maxp,max (0,j - AS[i]),j) - AP[i] * j),
dp[i][j] = max (dp[i][j],Tree[0][i - W - 1].query (1,0,maxp,j,min (j + BS[i],maxp)) - BP[i] * j);
}
}
if (i + W + 1 > T) continue;
Tree[0][i].build (0,i,1,0,maxp),Tree[1][i].build (1,i,1,0,maxp);
}
int ans = 0;for (Int i = 0;i <= maxp;++ i) ans = max (ans,dp[T][i]);
write (ans),putchar ('\n');
return 0;
}