90分蒟蒻求助
查看原帖
90分蒟蒻求助
234224
青鸟_Blue_Bird楼主2020/8/16 20:45

第10个点WA,向大佬们求助

解释一下,lmax,rmax为维护区间最大字段和的,sum为区间总和,ans为最终合法答案。

#include <bits/stdc++.h>
using namespace std;
#define N 1000010
typedef long long ll;
const ll inf = (ll)1e18;

template <class T>
inline void read(T& a){
	T x = 0, s = 1;
	char c = getchar();
	while(!isdigit(c)){
		if(c == '-') s = -1;
		c = getchar();
	} 
	while(isdigit(c)){
		x = x * 10 + (c ^ '0');
		c = getchar();
	}
	a = x * s;
	return ;
} 

int n, m, K, d;

struct tree{
	ll lmax, rmax, sum, ans;
} e[N << 2];

inline void pushup(int o){
	e[o].sum = e[o << 1].sum + e[o << 1 | 1].sum;
	e[o].lmax = max(e[o << 1].lmax,e[o << 1].sum + e[o << 1 | 1].lmax);
	e[o].rmax = max(e[o << 1 | 1].rmax, e[o << 1 | 1].sum + e[o << 1].rmax);
	e[o].ans = max(e[o << 1].ans, max(e[o << 1 | 1].ans, e[o << 1].rmax + e[o << 1 | 1].lmax));
	return ;
}

void build(int o, int l,int r){
	if(l == r){
		e[o] = (tree){-K, -K, -K, -K};
		return ;
	}
	int mid = l + r >> 1;
	build(o << 1, l, mid);
	build(o << 1 | 1, mid + 1, r);
	pushup(o);
	return ;
}

void update(int o, int l, int r, int x, ll k){
	if(l > x || r < x) return ;
	if(l == r && l == x){
		e[o].ans += k, e[o].sum += k;
		e[o].lmax += k, e[o].rmax += k;
		return ;
	}
	int mid = l + r >> 1;
	update(o << 1, l, mid, x, k);
	update(o << 1 | 1,mid + 1, r, x, k);
	pushup(o);
	return ;
}

int main(){
	read(n), read(m), read(K), read(d);
	build(1, 1, n);
	while(m--){
		int x, y;
		read(x), read(y);
		update(1, 1, n, x, y);
		puts(e[1].ans <= K * d ? "TAK" : "NIE");
	}
	return 0;
}
2020/8/16 20:45
加载中...