部分分求调
查看原帖
部分分求调
425912
罗非鱼Requiem楼主2024/10/21 21:20

O(mklogm)做法,方法参考题解第1篇,全wa带t,求调

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>

using namespace std;

typedef long long int64;

const int MAXM = 1e6 + 7;
const int64 INF = (1ll << 62ll) - 1ll + (1ll << 62ll);

struct task {
	int l, r;
	int64 val;
} b[MAXM];

int n, m, k;
int64 d;
int64 dp[MAXM];
vector<int> LSH_V;
vector<pair<int, int64> > a[MAXM];
unordered_map<int, int> LSH_M;

struct bitTree {
	int64 tree[MAXM]{};
	
	int lowbit(int x) {return x & (-x);}
	
	void add(int idx, int64 val) {
		idx = n - idx + 1;
		for(int i=idx; i<=n; i+=lowbit(i)) tree[i] += val;
	}
	
	int64 sum(int idx) {
		int64 res = 0;
		idx = n - idx + 1;
		for(int i=idx; i>=1; i-=lowbit(i)) res += tree[i];
		return res;
	}
} t;

template<typename T_int>
void input(T_int &x) {
	char ch = getchar();
	T_int fu = 1;
	x = 0;
	while(!('0' <= ch && ch <= '9')) fu = (fu == -1) ? fu : (ch == '-' ? -1 : 1), ch = getchar();
	while('0' <= ch && ch <= '9') x = x * 10 + (ch - '0'), ch = getchar();
	x *= fu;
}

void solve() {
	input(n), input(m), input(k), input(d);
	LSH_V.push_back(-1);
	for(int i=1; i<=m; i++) {
		input(b[i].r), input(b[i].l), input(b[i].val);
		b[i].l = b[i].r - b[i].l + 1;
		LSH_V.push_back(b[i].l);
		LSH_V.push_back(b[i].r);
	}
	sort(LSH_V.begin(), LSH_V.end());
	LSH_V.erase(unique(LSH_V.begin(), LSH_V.end()), LSH_V.end());
	for(int i=0; i<(int)LSH_V.size(); i++) LSH_M[LSH_V[i]] = i + 1, LSH_V[i] = i;
	LSH_V[0] = -1;
	for(int i=1; i<=m; i++) a[LSH_M[b[i].r]].push_back(make_pair(LSH_M[b[i].l], b[i].val));
	for(int i=1; i<(int)LSH_V.size(); i++) {
		for(auto tmp : a[i]) t.add(tmp.first, tmp.second);
		dp[i] = max(dp[i], dp[i-1]);
		for(int j=i; j>=1&&LSH_V[i]-LSH_V[j]+1<=k; j--) dp[i] = max(dp[i], dp[max(0, LSH_V[j-1] != LSH_V[j]-1 ? j-1 : j-2)] + t.sum(j) - d * (LSH_V[i] - LSH_V[j] + 1));
	}
	
	printf("%lld\n", dp[(int)LSH_V.size()-1]);
	for(int i=0; i<(int)LSH_V.size(); i++) a[i].clear(), dp[i] = 0, t.tree[i] = 0;
	memset(b, 0, sizeof b);
	LSH_V.clear();
	LSH_M.clear();
}

int main() {
//	freopen("a.in", "r", stdin);
	
	int c, T;
	input(c), input(T);
	while(T--) solve();
	
	return 0;
}
2024/10/21 21:20
加载中...