SCOI2010 序列操作 分塊or線段樹

2022-05-03 08:12:08 字數 3653 閱讀 3358

#include#include

#define lc k<<1

#define rc k<<1|1

using

namespace

std;

const

int n=1e5+5

;int

n,m,a[n];

struct

sgts,tr[n

<<2

];inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}sgt merge(sgt left,sgt right)

void updata(int

k)void pushdown(int

k)

else

tr[lc].tag=tr[rc].tag=tr[k].tag;tr[k].tag=-1;//

return ;

}

if(tr[k].rev)

}void deal(int k,int

v)

else

}void vpt(int

k)void build(int k,int l,int

r)

int mid=l+r>>1

; build(lc,l,mid);

build(rc,mid+1

,r);

updata(k);

}void cover(int k,int x,int y,int

v) pushdown(k);

int mid=l+r>>1

;

if(y<=mid) cover(lc,x,y,v);

else

if(x>mid) cover(rc,x,y,v);

else cover(lc,x,mid,v),cover(rc,mid+1

,y,v);

updata(k);

}void rever(int k,int x,int

y) pushdown(k);

int mid=l+r>>1

;

if(y<=mid) rever(lc,x,y);

else

if(x>mid) rever(rc,x,y);

else rever(lc,x,mid),rever(rc,mid+1

,y);

updata(k);

}int query_sum(int k,int x,int

y)sgt query_max(

int k,int x,inty)}

intmain()

}return0;

}

50分sgttle

#include#include

using

namespace

std;

inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}const

int n=1000100

;int

n,m,a[n];

int sum(int l,int

r)int conti(int l,int

r) res=max(res,j-i);

i=j+1

; }

else i++;

}return

res;

}void

out()

intmain()

if(opt==1

)

if(opt==2

)

if(opt==3

)

if(opt==4

) }

return0;

}

90分暴力

/*

本題的難度在於標記的下放。

下面說一下我的做法:

1.覆蓋標記:直接打上就好了

2.取反標記:

<1>如果有tag標記,將tag標記取反,退出.

<2>如果有rev標記,直接退出

<3>無標記,打上rev標記,退出

維護:sum(當前區間和),lss1(區間從左端點連續1的長度),rss1(區間從右端點連續1的長度),sc1(區間連續1的長度)

lss0,rss0,sc0同理。tag(覆蓋標記和取反標記整一起了)

*/#include

#include

#include

#include

using

namespace

std;

const

int n=1e5+5

;const

int m=505

;int

a[n],bl[n],n,m,size;

inttag[m],lss0[m],rss0[m],sc0[m],lss1[m],rss1[m],sc1[m],sum[m];

void init(int

i) fl=0

;

for(int j=min(n,i*size);j>(i-1)*size;j--)

fl=0,p=0

;

for(int j=(i-1)*size+1;j<=min(n,i*size);j++)

fl=0

;

for(int j=min(n,i*size);j>(i-1)*size;j--)

}void pushdown(int

i)void cover(int x,int y,int

v)

if(bl[x]==bl[y]) return

; pushdown(bl[y]);

for(int i=(bl[y]-1)*size+1;i<=y;i++) a[i]=v;

init(bl[y]);

}void rever(int x,int

y)

if(bl[x]==bl[y]) return

; pushdown(bl[y]);

for(int i=(bl[y]-1)*size+1;i<=y;i++) a[i]^=1

; init(bl[y]);

}int query_sum(int x,int

y)int query_num(int x,int

y)

for(int i=bl[x]+1;i)

if(bl[x]==bl[y]) return

max(ans,l);

pushdown(bl[y]);

for(int i=(bl[y]-1)*size+1;i<=y;i++)

return

ans;

}int

main()

for(int i=1;i<=bl[n];i++) init(i);

for(int i=1,op,x,y;i<=m;i++)

return0;

}

SCOI2010 序列操作

我可以銘記一生的蛇皮線段樹 左左右右上上下下中間兩頭 咳咳,沒什麼好說的了,開始寫吧。我,可真是,寫了zz三天。include include includeusing namespace std struct ans int n,q,a 4000101 int sum 4000101 l1 400...

SCOI2010 序列操作 線段樹

題面 題解 在考場上打的這道題,出人意料的很快就打完了?直接用線段樹,維護幾個東西 1,lazy標記 表示區間賦值 2,mark標記 表示區間翻轉 3,l1 字首最長連續的1的子段長度 4,l0 字首最長連續的0的子段長度 5,m0 區間內最長的全為0的子段的長度 6,r0 字尾最長連續的0的子段長...

1858 Scoi2010 序列操作

1858 scoi2010 序列操作 time limit 10 sec memory limit 64 mb submit 3397 solved 1624 submit status discuss description lxhgww最近收到了乙個01序列,序列裡面包含了n個數,這些數要麼是0...