秋蟬鳴泣之時

2021-09-25 08:08:35 字數 1828 閱讀 9458

奇怪的題目背景

所誤入的 是回憶的教室

所響起的 是通向絕望的計時器

所到達的 是開始的結束

你 能相信嗎?

題目背景

最近禮奈醬學會了線段樹和樹狀陣列兩種資料結構

由於禮奈醬上課聽的很認真,所以她知道

樹狀陣列常見的操作是 單點加區間求和

線段樹常見的操作是 區間加區間求和

但她認為自己已經不是小學生了,覺得只能維護加法標記這件事簡直太蠢了~

所以她將題目加強了一下,但她發現自己不會寫這題的標程了

因為 rina

rina

醬非常可愛,所以你要幫她寫這題的標程

題意描述

禮奈給了你一列數(nn個)

要求支援以下兩類操作共mm次

1.區間求和 [l,r]

[l,r]

即∑ r i=l a i

∑i=lrai

2.區間開平方[l,r]

[l,r]

即將區間內每乙個數a i

ai修改為 a i − − √

ai向下取整

輸入輸出格式

第一行 n

n第二行 m

m第三行n

n個數 表示 a i

ai接下來mm行

每行三個數 op,l,r

op,l,r

op=1

op=1

為1操作

op=2

op=2

為2操作

對於每次1操作,請輸出一行答案

樣例輸入

41 100 5 5

51 1 2

2 1 2

1 1 2

2 2 3

1 1 4

樣例輸出

10111

11資料範圍

所有資料點保證

n,m≤2∗10 6 ,a i ≤10 9

n,m≤2∗106,ai≤109

#include using namespace std;

#define int long long

int n,m;

int l[10005],r[10005];

int a[100005];

int f[10005];

int w[100005];

signed main()

r[cnt]=n;

for(int i=1;i<=cnt;++i)

}if(flag==0)

}for(int i=1;i<=n;++i)

scanf("%lld",&m);

int x,y,z;

for(int i=1;i<=m;++i)

continue;

}for(int j=y;j<=r[w[y]];++j)

for(int j=l[w[z]];j<=z;++j)

for(int j=w[y]+1;j<=w[z]-1;++j)

else

int sum=0;

for(int k=l[j];k<=r[j];++k)

}if(sum==r[j]-l[j]+1)}}

}else

printf("%lld\n",ans);

continue;

} if(f[w[y]]==1)

else

}if(f[w[z]]==1)

else

}for(int j=w[y]+1;j<=w[z]-1;++j)

else}}

printf("%lld\n",ans);}}

return 0;

}

UOJ 511 秋蟬鳴泣之時 禮

上次出的題被巨佬們看出原題,而且一開始n和m的順序出鍋了我感到很抱歉 其實還有很多運算都有這種神奇的性質!區間取尤拉函式,區間取約數個數 這也是一道經典題吧不知道有沒有原題 最近詩音也開始學線段樹了 她對這種區間修改的題很感興趣 於是她又自己出了一道 由於詩音很可愛,所以你要幫她寫這題的標程 詩音給...