不会用 LONG LONG
查看原帖
不会用 LONG LONG
282080
NewJeanss楼主2021/7/15 23:22

如题。此题应该要开long long 。可是如果我写了 long long sum 就全部错误。不开时91分,没有错误。

#include <bits/stdc++.h>
#define N 50005
using namespace std;
int n,m,tot,len;
struct seg{
	int lazy,lson,rson;
	int sum;//写成long long就错
}seg[20000005];
int SEG[N<<2];
int init(){
	int rt=++tot;
	seg[rt].sum=seg[rt].lazy=0;
	seg[rt].lson=seg[rt].rson=-1;
	return rt;
}
void pushdown(int rt,int ln,int rn){
	if(seg[rt].lazy){
		if(seg[rt].lson!=-1){
			int l=seg[rt].lson;
			seg[l].lazy+=seg[rt].lazy; seg[l].sum+=(long long)seg[rt].lazy*ln;
		}
		else{
			seg[rt].lson=init();
			int l=seg[rt].lson;
			seg[l].lazy+=seg[rt].lazy; seg[l].sum+=(long long)seg[rt].lazy*ln;
		}
		if(seg[rt].rson!=-1){
			int r=seg[rt].rson;
			seg[r].lazy+=seg[rt].lazy; seg[r].sum+=(long long)seg[rt].lazy*rn;
		}
		else{
			seg[rt].rson=init();
			int r=seg[rt].rson;
			seg[r].lazy+=seg[rt].lazy; seg[r].sum+=(long long)seg[rt].lazy*rn;
		}
		seg[rt].lazy=0;
	}
}
void update(int L,int R,int l,int r,int rt){
	if(L<=l&&r<=R){
		seg[rt].lazy+=1;
		seg[rt].sum+=r-l+1;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(rt,mid-l+1,r-mid);
	if(L<=mid){
		if(seg[rt].lson==-1) seg[rt].lson=init();
		update(L,R,l,mid,seg[rt].lson);
	}
	if(mid+1<=R){
		if(seg[rt].rson==-1) seg[rt].rson=init();
		update(L,R,mid+1,r,seg[rt].rson);
	}
	seg[rt].sum=0;
	if(seg[rt].lson!=-1) seg[rt].sum+=seg[seg[rt].lson].sum;
	if(seg[rt].rson!=-1) seg[rt].sum+=seg[seg[rt].rson].sum;
}
void UPDATE(int L,int R,int p,int l,int r,int rt){
	if(SEG[rt]==-1) SEG[rt]=init();
	update(L,R,1,n,SEG[rt]);
	int mid=(l+r)>>1;
	if(l==r) return;
	if(p<=mid) UPDATE(L,R,p,l,mid,rt<<1);
	if(p>mid) UPDATE(L,R,p,mid+1,r,rt<<1|1);
}
long long query(int L,int R,int l,int r,int rt){
	if(L<=l&&r<=R) return seg[rt].sum;
	int mid=(l+r)>>1;
	long long ans=0;
	pushdown(rt,mid-l+1,r-mid);
	if(L<=mid) ans+=query(L,R,l,mid,seg[rt].lson);
	if(mid+1<=R) ans+=query(L,R,mid+1,r,seg[rt].rson);
	return ans;
}
int QUERY(int L,int R,long long K,int l,int r,int rt){
	if(l==r) return l;
	int mid=(l+r)>>1;
	long long num=query(L,R,1,n,SEG[rt<<1|1]);
	if(num>=K) return QUERY(L,R,K,mid+1,r,rt<<1|1);
	else return QUERY(L,R,K-num,l,mid,rt<<1);
}
int OP[N],L[N],R[N];
long long C[N],D[N];
signed main(){
	int op,l,r;
	long long c;
	while(cin>>n>>m){
		memset(SEG,-1,sizeof(SEG)); tot=0; len=0;
		for(int i=1;i<=m;i++){
			cin>>OP[i]>>L[i]>>R[i]>>C[i];
			if(OP[i]==1) D[++len]=C[i];
		}
		sort(D+1,D+len+1); len=unique(D+1,D+len+1)-D-1;
		for(int i=1;i<=m;i++){
			op=OP[i]; l=L[i]; r=R[i]; 
			if(op==1) c=lower_bound(D+1,D+len+1,C[i])-D,UPDATE(l,r,c,1,n,1);
			if(op==2) c=C[i],cout<<D[QUERY(l,r,c,1,n,1)]<<endl;
		}
	}
	return 0;
}
2021/7/15 23:22
加载中...