线段树套珂朵莉树求助
查看原帖
线段树套珂朵莉树求助
285617
黑影洞人楼主2022/4/10 14:36

rt样例全过了,0分

#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
#define N 1919810
#define int long long
#define lc p<<1
#define rc p<<1|1
#define clear(a,b,c) for(int i=0;i<=c;i++)a[i]=b
#define ct Chtholly_tree
#define Chtholly set<Chtholly_tree>::iterator
using namespace std;
inline int read(){
	int ans=0,sym=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')sym=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){ans=ans*10+ch-'0';ch=getchar();}
	return ans*sym;
}
int n,m;
struct Chtholly_tree{
	int l,r;
	mutable int val;
	Chtholly_tree(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
	bool operator<(const Chtholly_tree &C)const{return l<C.l;}
};
set<Chtholly_tree>st;
Chtholly split(int p){
	Chtholly it=st.lower_bound(p);
	if(it!=st.end()&&it->l==p)return it;
	it--;ct tmp=*it;st.erase(it);
	st.insert(ct(tmp.l,p-1,tmp.val));
	return st.insert(ct(p,tmp.r,tmp.val)).first;
}
struct Segement_tree{
	int l,r,val,tag;
}s[N];
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r)return;
	build(lc,l,(l+r)/2);
	build(rc,(l+r)/2+1,r);
}
void pushup(int p){s[p].val=s[lc].val+s[rc].val;}
void pushdown(int p){
	if(!s[p].tag)return;
	s[lc].tag+=s[p].tag;
	s[rc].tag+=s[p].tag;
	s[lc].val+=s[p].tag*(s[lc].r-s[lc].l+1);
	s[rc].val+=s[p].tag*(s[rc].r-s[rc].l+1);
	s[p].tag=0;
}
void add(int p,int l,int r,int k){
	pushdown(p);
	if(s[p].l>r||s[p].r<l)return;
	if(s[p].l>=l&&s[p].r<=r){
		s[p].val+=k*(s[p].r-s[p].l+1);
		s[p].tag+=k;
		return;
	}
	pushdown(p);
	add(lc,l,r,k);add(rc,l,r,k);
	pushup(p);
}
int query(int p,int l,int r){
	pushdown(p);
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r)return s[p].val;
	return query(lc,l,r)+query(rc,l,r);
}
void assign(int l,int r,int val){
	Chtholly right=split(r+1),left=split(l),it=left;
	for(;left!=right;left++){
		int L=left->l,R=left->r,v=left->val;
		add(1,L,R,abs(val-v));
	}
	st.erase(it,right);
	st.insert(ct(l,r,val));
}
signed main(){
	n=read(),m=read();
	build(1,1,n);
	for(int i=1;i<=n;i++)st.insert(ct(i,i,i));
	for(int i=1;i<=m;i++){
		int op=read(),l=read(),r=read(),x;
		if(op==1)x=read(),assign(l,r,x);
		else printf("%lld\n",query(1,l,r));
	}
	return 0;
}


2022/4/10 14:36
加载中...