[선분 수] LOJ 3043 [ZJOI 2019] 선분 수.
                                            
 33261 단어  데이터 구조-선분 트 리
                    
[제목] LOJ 는 처음에 선분 트 리 가 있 었 습 니 다. 표시 되 지 않 았 습 니 다. 한 번 의 조작 [l, r] [l, r] [l, r] 에 대해 모든 선분 트 리 를 복사 하고 홀수 레이 블 의 모든 선분 트 리 에 대해 우 리 는 일반 선분 트 리 처럼 구간 에 표 시 를 합 니 다. pushdown \ text {pushdown} pushdown 함 수 는 표 시 를 아래 에 놓 고 이 노드 의 표시 상황 을 표시 합 니 다.모든 라인 트 리 에 몇 개의 노드 가 표시 되 어 있 는 지 물 어 볼 때마다.
n , Q ≤ 1 0 5 n,Q\leq 10^5 n,Q≤105
[문제 풀이 사고] 모든 조작 에 있어 노드 의 상황 분류 통계 에 기여 하 는 것 을 고려 해 야 한다.아래 에서 "포 지 셔 닝 됨" 을 q l ≤ l ≤ r ≤ q r ql \ \ leq l \ \ leq r \ \ \ leq qr ql ≤ l ≤ r ≤ qr 의 노드 라 고 부 르 며, 우 리 는 대략 조작 구간 에 따라 노드 를 다음 과 같은 몇 가지 유형 으로 나 눌 수 있다.
유지 보수 고려 fi fi:
복잡 도 O (n log  n) O (n \ \ log n) O (nlogn)
[참조 코드]
#include
');}
}
using namespace IO;
namespace Math
{
	int upm(int x){return x>=mod?x-mod:(x<0?x+mod:x);}
	void up(int &x,int y){x=upm(x+y);}
	int mul(int x,int y){return 1ll*x*y%mod;}
}
using namespace Math;
namespace Data_Structure
{
	struct Segment
	{
		#define ls (x<<1)
		#define rs (x<<1|1)
		struct node
		{
			int v,mulv,f,addf,mulf;
		}t[N<<2];
		void build(int x,int l,int r)
		{
			t[x].mulv=t[x].mulf=1;
			if(l==r) return;
			int mid=(l+r)>>1;
			build(ls,l,mid);build(rs,mid+1,r);
		}
		void multv(int x,int v){t[x].v=mul(t[x].v,v);t[x].mulv=mul(t[x].mulv,v);}
		void multf(int x,int v){t[x].f=mul(t[x].f,v);t[x].mulf=mul(t[x].mulf,v);t[x].addf=mul(t[x].addf,v);}
		void addtf(int x,int v){up(t[x].f,v);up(t[x].addf,v);}
		void pushdown(int x)
		{
			if(t[x].mulv>1) multv(ls,t[x].mulv),multv(rs,t[x].mulv),t[x].mulv=1;
			if(t[x].mulf>1) multf(ls,t[x].mulf),multf(rs,t[x].mulf),t[x].mulf=1;
			if(t[x].addf>0) addtf(ls,t[x].addf),addtf(rs,t[x].addf),t[x].addf=0;
		}
		void update(int x,int l,int r,int L,int R)
		{
			if(L<=l && r<=R)
			{
				up(ans,-t[x].v);up(t[x].v,pw);up(t[x].mulv,t[x].mulv);
				addtf(x,pw);up(delta,t[x].v);
				return;
			}
			if(L>r || R<l) 
			{
				up(ans,-t[x].v);up(t[x].v,t[x].f);up(t[x].mulv,t[x].mulv);
				multf(x,2);up(delta,t[x].v);
				return;
			}
			pushdown(x);up(ans,-t[x].v);up(delta,t[x].v);
			int mid=(l+r)>>1;
			update(ls,l,mid,L,R);update(rs,mid+1,r,L,R);
		}
		#undef ls
		#undef rs
	}T;
}
using namespace Data_Structure;
namespace DreamLolita
{
	int n,Q;
	void solution()
	{
		n=read();Q=read();pw=1;
		T.build(1,1,n);
		while(Q--)
		{
			int op=read(),l,r;
			if(op&1) 
			{
				l=read();r=read();delta=0;
				T.update(1,1,n,l,r);//printf("%d %d %d
",ans,delta,pw);
				up(ans,ans);up(ans,delta);up(pw,pw);
			}
			else writeln(ans);
		}
	}
}
int main()
{
#ifdef Durant_Lee
	freopen("LOJ3043.in","r",stdin);
	freopen("LOJ3043.out","w",stdout);
#endif
	DreamLolita::solution();
	return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Query on a string (선분 수) (2017 - icpc - 우루무치 온라인 경기)The operation C i chC~i~chC i ch with given integer iii and capital letter chchch, changes the iii-th character of SSS i...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.