50pts求助!
查看原帖
50pts求助!
550074
cloudemakers楼主2023/8/31 14:06

rt Code:

#include<bits/stdc++.h>
#define db double 
#define ll long long
#define lc(x) (x<<1)
#define rc(x) ((x<<1)|1)
#define mid ((l+r)>>1)
#define maxn 100050
using namespace std;
ll n,m,len[maxn<<2];
bool flag[maxn<<2],flag2[maxn<<2];
db a[maxn<<2],mx[maxn<<2],x,y;
db max(db A,db B){return A>B?A:B;}
void pushup1(ll u){mx[u]=max(mx[lc(u)],mx[rc(u)]);}
ll pushup2(ll u,db cmp){
	if (!flag2[u]) return 0;
	if (flag[u]) return len[u]=(a[u]>cmp?1:0);
	if(!cmp){pushup2(rc(u),mx[lc(u)]);}//特判 对于最左边没有pre的区间 要把右子树和左子树比较一下 更新好右子树先 
	if (mx[lc(u)]<=cmp){
	//	printf("Case 1:node=%lld mx=%lf cmp=%lf pushup2=%lld\n",u,mx[u],cmp,pushup2(rc(u),max(cmp,mx[lc(u)])));
		return len[u]=pushup2(rc(u),cmp);
	}
	if (mx[lc(u)]>cmp){
	//	printf("Case 2:node=%lld mx=%lf cmp=%lf len[rc]=%lld pushup2=%lld\n",u,mx[u],cmp,len[rc(u)],pushup2(lc(u),cmp));
		return len[u]=len[rc(u)]+pushup2(lc(u),cmp);
	}
}
void upd(ll u,ll l,ll r,db pos,db add,db cmp){
	if (r<pos||l>pos) return ;		
	flag2[u]=1;
	if (l==r){
		a[u]=(db)add/pos;
		len[u]=a[u]>cmp?1:0;
		mx[u]=a[u];
		flag[u]=1;
		return ;
	}
	if (l<=pos&&pos<=mid) upd(lc(u),l,mid,pos,add,cmp);
	if (r>=pos&&pos>mid) upd(rc(u),mid+1,r,pos,add,max(cmp,mx[lc(u)]));
	pushup1(u);pushup2(u,cmp);
}
int main(){
	scanf("%lld%lld",&n,&m);
	while (m--){
		scanf("%llf%llf",&x,&y);
		upd(1,1,n,x,y,0);
		printf("%lld\n",len[1]);
	}
	return 0;
}
2023/8/31 14:06
加载中...