线段树 60pts 求调,很急
查看原帖
线段树 60pts 求调,很急
592380
David_Mercury楼主2023/4/9 09:55

rt

思路同部分题解,每次仅用线段树维护最大值,离散化来统计每个值对应的奶牛数量,以来分类讨论 rk1 是否变化。

在线等,很急。

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e5+5, MAXT = 1e9;
int n, n2, g, ans, k, a[MAXN], ori[MAXN], ori2[MAXN], bjt[MAXN];

struct SegmentTree{
	int l, r, maxn;
	#define l(x)	tree[x].l
	#define r(x)	tree[x].r
	#define maxn(x)	tree[x].maxn
} tree[MAXN*4];

struct query_node{
	int date, num, dlt;
	bool operator < (const query_node &tmp) const{
		return date < tmp.date;
	}
} Q[MAXN];

inline void read_discrete(){
	scanf("%d%d", &n, &g);
	for(int i = 1; i <= n; i++)	scanf("%d%d%d", &Q[i].date, &Q[i].num, &Q[i].dlt);
	
	for(int i = 1; i <= n; i++)	ori[i] = Q[i].num;
	sort(ori+1, ori+1+n);
	n2 = unique(ori+1, ori+1+n)-ori-1;
	for(int i = 1; i <= n; i++)	Q[i].num = lower_bound(ori+1, ori+1+n2, Q[i].num)-ori;
	
	for(int i = 1; i <= n2; i++)	a[i] = g;
	ori2[++k] = g;
	for(int i = 1; i <= n; i++)		a[Q[i].num] += Q[i].dlt, ori2[++k] = a[Q[i].num];
	sort(ori2+1, ori2+1+k);
	k = unique(ori2+1, ori2+1+k)-ori2-1;
	
	sort(Q+1, Q+1+n);
	return;
}

inline void build_tree(int pt, int l, int r){
	l(pt) = l, r(pt) = r, maxn(pt) = g;
	if(l == r)	return;
	int mid = (l+r)/2;
	build_tree(pt*2, l, mid);
	build_tree(pt*2+1, mid+1, r);
	return;
}

inline void change(int pt, int x, int dlt){
	if(l(pt) == r(pt))	{maxn(pt) += dlt; return;}
	int mid = (l(pt)+r(pt))/2;
	if(x <= mid)	change(pt*2, x, dlt);
	else			change(pt*2+1, x, dlt);
	maxn(pt) = max(maxn(pt*2), maxn(pt*2+1));
	return;
}

inline int get_pos(int x){
	return lower_bound(ori2+1, ori2+1+k, x)-ori2;
}

int main(){
	read_discrete();
	build_tree(1, 1, n2+1);
	for(int i = 1; i <= n2; i++)	a[i] = g;
	bjt[get_pos(g)] = MAXT;
	for(int i = 1; i <= n; i++){
		int tmp = maxn(1);
		change(1, Q[i].num, Q[i].dlt);
		if(Q[i].dlt == 0)	continue;
		int pos1 = get_pos(a[Q[i].num]), pos2 = get_pos(a[Q[i].num]+Q[i].dlt);
		if(a[Q[i].num] != tmp){
			if(a[Q[i].num]+Q[i].dlt == maxn(1))		ans++;
		}
		else if(a[Q[i].num]+Q[i].dlt != maxn(1))	ans++;
		else{
			if(bjt[pos2] != 0)		ans++;
			else if(bjt[pos1] > 1)	ans++;
		}
		a[Q[i].num] += Q[i].dlt;
		bjt[pos1]--, bjt[pos2]++;
	}
	printf("%d", ans);
	
	return 0;
}
2023/4/9 09:55
加载中...