多標記處理(2)UVA 11402

2021-07-16 09:43:44 字數 1655 閱讀 6037

題面下不出來 如果有想做的vj查「

uva 11402

」吧。

給出題意:對乙個01區間進行4種操作。1:區間值都置為1.    2:區間值都置為0.   3:區間值01互換。4求出區間和。

題解:第乙個操作可以等效成區間值*0+1.

第二個操作可以等效成區間值*0.

第三個操作可以等效成區間值(+1)&1。

第四個操作就是線段樹基本操作。

此時這題轉化成了上次blog寫的內題型別。但是注意,由於第三個操作沒有後效行,在下傳標記時注意,如果傳下來的是add,此時sum等區間長度-sum(01互換,區間和是互補的)。

**:#include #include #include #include #include #include using namespace std;

int mul[5024005],add[5024005],sum[5024005],s[1024005];

char str[1024005];

int t,q,qq,x,y,i,cnt,tt,n,m;

char opt;

void pushup(int rt)

void pushdown(int rt,int m)

mul[rt]=1;

add[rt]=0;

}}void build(int l,int r,int rt)

int mid=(l+r)>>1;

build(l,mid,rt<<1);

build(mid+1,r,rt<<1|1);

pushup(rt);

}void ch(int l,int r,int l,int r,int rt,int c)

pushdown(rt,r-l+1);

int mid=(r+l)>>1;

if(l<=mid)

if(r>mid)

ch(l,r,mid+1,r,rt<<1|1,c);

pushup(rt);

}void ji(int l,int r,int l,int r,int rt,int c)

pushdown(rt,r-l+1);

int mid=(r+l)>>1;

if(l<=mid)

ji(l,r,l,mid,rt<<1,c);

if(r>mid)

ji(l,r,mid+1,r,rt<<1|1,c);

pushup(rt);

}int query(int l,int r,int l,int r,int rt)

int main()

{ scanf("%d",&t);

for(tt=1; tt<=t; tt++)

{printf("case %d:\n",tt);

memset(sum,0,sizeof(sum));

memset(add,0,sizeof(add));

memset(mul,0,sizeof(mul));

qq=0;

scanf("%d",&n);

cnt=0;

while(n--){

scanf("%d",&m);

scanf("%s",str);

int len=strlen(str);

while(m--){for( i=0; i



多標記處理

description 老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為n的數列,不妨設為a1,a2,an 有如下三種操作形式 1 把數列中的一段數全部乘乙個值 2 把數列中的一段數全部加乙個值 3 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模p的值。input ...

超高密度賦能大資料 傑和2U六節點機架式伺服器

前言 資訊資料時代,隨著網際網路金融 金融科技的發展,程式設計客棧我們在生活中的某個不經意小舉措就有可能對自身產生超乎想象的大影響,如近期即將上線執行的新版個人徵信報告,它將更細化 全面 精準的採集我們個人資訊,以程式設計客棧建立更完善的個人徵信管pcfbbmnaoa理系統。這一操作能實現都是源於大...