[선분 수] 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 std;
const int N=1e5+10,mod=998244353;
int pw,ans,delta;
namespace IO
{
int read()
{
int ret=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) ret=ret*10+(c^48),c=getchar();
return ret;
}
void write(int x){if(x>9)write(x/10);putchar(x%10^48);}
void writeln(int x){write(x);putchar('
');}
}
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에 따라 라이센스가 부여됩니다.