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;
}