线段树求调~
  • 板块题目总版
  • 楼主Elaina_0
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/24 21:06
  • 上次更新2024/9/24 23:53:50
查看原帖
线段树求调~
1249322
Elaina_0楼主2024/9/24 21:06

RT,写的线段树动态开点+永久化标记

感谢dalao

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define rd read()
#define mkp make_pair
#define fi first
#define se second
#define psb push_back
#define Elaina 0
#define mst(a,b) memset((a),(b),sizeof(a))
#define random(a,b) (1ll*rand()*rand()*rand()%((b)-(a)+1)+(a))
inline ll read(){
	ll f=1,x=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f=(ch=='-'?-1:1);
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
	return f*x;
}
const int mod=998244353;
const int N=2e5+100;
const int inf=0x7fffffff7fffffff;
const int M=1e9;

int n,d,ans,mx=0,mn=inf;
int rt,sum,il,ir,mxx;
int a[N],b[N];

namespace SEG{
	int ncnt=0;
	int ls[N],rs[N];
	struct TR{
		int sum,lz;
	}tr[N<<8];
	
	void update(int &rt,int l,int r,int ql,int qr,int k){
		if(!rt) rt=++ncnt;
		tr[rt].sum+=(qr-ql+1)*k;
		if(l==ql&&r==qr){
			tr[rt].lz+=k;
			return ;
		}
		int mid=(l+r)>>1;
		if(qr<=mid) update(ls[rt],l,mid,ql,qr,k);
		else{
			if(ql>mid) update(rs[rt],mid+1,r,ql,qr,k);
			else{
				update(ls[rt],l,mid,ql,mid,k);
				update(rs[rt],mid+1,r,mid+1,qr,k);
			}
		}
		return ;
	}
	
	int query(int rt,int l,int r,int ql,int qr,int tag){
		if(!rt) return 0;
		if(l==ql && r==qr){
			return tr[rt].sum+(qr-ql+1)*tag;
		}
		int mid=(l+r)>>1,res=0;
		tag+=tr[rt].lz;
		if(qr<=mid) res+=query(ls[rt],l,mid,ql,qr,tag);
		else{
			if(ql>mid) res+=query(rs[rt],mid+1,r,ql,qr,tag);
			else{
				res+=query(ls[rt],l,mid,ql,mid,tag);
				res+=query(rs[rt],mid+1,r,mid+1,qr,tag);
			}
		}
		return res;
	}
}

using namespace SEG;

signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);

	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

	update(rt,1,M,1,10,1);
	
	for(int i=1;i<=10;i++){
		cout<<query(1,1,M,i,i,0)<<'\n';
	}
   
	return Elaina;
}
2024/9/24 21:06
加载中...