求卡空间
查看原帖
求卡空间
173660
zhoukangyang楼主2020/7/5 15:49

rt qaq

#include<bits/stdc++.h>
#define M 16300005
using namespace std;
int n,m,ls[M],rs[M],sum[M],lazy[M],tot;
int lef(int now) {
	if(ls[now] != 0) return ls[now];
	++tot;
	return ls[now] = tot;
}
int rig(int now) {
	if(rs[now] != 0) return rs[now];
	++tot;
	return rs[now] = tot;
}
void pushdown(int now,int L,int R) {
	int mid = (L+R) / 2;
	if(lazy[now] == 1) {
		lazy[lef(now)] = 1 , sum[ls[now]] = 0;
		lazy[rig(now)] = 1 , sum[rs[now]] = 0;
	}
	else if(lazy[now] == 2) {
		lazy[lef(now)] = 2 , sum[ls[now]] = mid-L+1;
		lazy[rig(now)] = 2 , sum[rs[now]] = R-mid;
	}
	lazy[now] = 0;
}
void upd(int now) {
	sum[now] = sum[ls[now]]+sum[rs[now]];
}
void adda(int L,int R,int l,int r,int id) {
	int mid = (L+R) / 2;
	pushdown(id,L,R);
	if(L == l&& R == r) sum[id] = 0 , lazy[id] = 1;
	else if(r <= mid) adda(L,mid,l,r,lef(id)),upd(id);
	else if(l > mid) adda(mid+1,R,l,r,rig(id)),upd(id);
	else adda(L,mid,l,mid,lef(id)),adda(mid+1,R,mid+1,r,rig(id)),upd(id); 
}
void addb(int L,int R,int l,int r,int id) {
	int mid = (L+R) / 2;
	pushdown(id,L,R);
	if(L == l&& R == r) sum[id] = R-L+1 , lazy[id] = 2;
	else if(r <= mid) addb(L,mid,l,r,lef(id)),upd(id);
	else if(l > mid) addb(mid+1,R,l,r,rig(id)),upd(id);
	else addb(L,mid,l,mid,lef(id)),addb(mid+1,R,mid+1,r,rig(id)),upd(id);
}
int opt,l,r;
int main() {
	scanf("%d%d",&n,&m);
	tot = 1;
	while(m--) {
		scanf("%d%d%d",&l,&r,&opt);
		if(opt-1) adda(1,n,l,r,1);
		else addb(1,n,l,r,1);
		printf("%d\n",n-sum[1]);
	}
	return 0;
}

再开大就MLE了,现在 #18 RE

2020/7/5 15:49
加载中...