萌新求助线段树
查看原帖
萌新求助线段树
124781
Walking_Dead楼主2020/9/15 16:25

我™不知道为什么我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; 
}
2020/9/15 16:25
加载中...