F wa一半ac一半求调
  • 板块学术版
  • 楼主xu_zhihao
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/11/30 21:44
  • 上次更新2024/12/1 08:04:53
查看原帖
F wa一半ac一半求调
1063855
xu_zhihao楼主2024/11/30 21:44
#include<bits/stdc++.h>
using namespace std;
#define l(x) t[x].l
#define r(x) t[x].r
#define dat(x) t[x].dat
#define sum(x) t[x].sum
#define add(x) t[x].add 
#define clean(x, y) memset(x, y, sizeof(x))
typedef long long LL;
#degine int long long
int dis[200010];
int a[200010];
const int maxn = 2e5 + 100;
int h,w,n;
struct tree {
	int l, r;
	LL dat, sum, add;
} t[maxn << 2];

void build(int p, int l, int r) {
	l(p) = l, r(p) = r;
	if (l == r) { sum(p) = a[l]; return ; }
	int mid = (l + r) >> 1;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
	dat(p) = dat(p << 1) + dat(p << 1 | 1);
//	sum(p) = sum(p << 1) + sum(p << 1 | 1); 
}

void spread(int p) {
	if (add(p)) {
//		sum(p << 1) = add(p) * (r(p << 1) - l(p << 1) + 1);
//		sum(p << 1 | 1) = add(p) * (r(p << 1 | 1) - l(p << 1 | 1) + 1);
		add(p << 1) += add(p);
		add(p << 1 | 1) += add(p);
		dat(p << 1) += add(p);
		dat(p << 1 | 1) += add(p);
		add(p) = 0;
	}
}

void change(int p, int l, int r, int d) {
	if (l <= l(p) && r >= r(p)) {
		sum(p) += (LL) d * (r(p) - l(p) + 1);
		add(p) += d;
		dat(p) += d;
		return ;
	}
	spread(p);
	int mid = (l(p) + r(p)) >> 1;
	if (l <= mid) change(p << 1, l, r, d);
	if (r > mid) change(p << 1 | 1, l, r, d);
	sum(p) = sum(p << 1) + sum(p << 1 | 1);
	dat(p) = max(dat(p << 1), dat(p << 1 | 1));
}

LL ask(int p, int l, int r) {
	//cout<<l<<" "<<r<<endl;
	if (l <= l(p) && r >= r(p)) return dat(p);
	spread(p);
	int mid = (l(p) + r(p)) >> 1;
	LL val = 0;
	if (l <= mid) val = max(val, ask(p << 1, l, r));
	if (r > mid)  val = max(val, ask(p << 1 | 1, l, r));
	return val;
}
int rr[200010],c[200010],ll[200010];
int op[200010];
bool cmp(int id1,int id2){
	return rr[id1]>rr[id2]; 
}
int main(){
	cin>>h>>w>>n;
	build(1,1,200010);
	for(int i=1;i<=n;i++){
		cin>>rr[i]>>c[i]>>ll[i];
		dis[i]=i;
	}
	sort(dis+1,dis+n+1,cmp);
	for(int i=1;i<=n;i++){
		int id=dis[i];
		//cout<<1<<endl;
		int ans=ask(1,c[id],c[id]+ll[id]-1);
		//cout<<1;
		change(1,c[id],c[id]+ll[id]-1,1);
		op[id]=ans;
	}
	for(int i=1;i<=n;i++){
		cout<<h-op[i]<<endl;
	}
}
2024/11/30 21:44
加载中...