洛谷 2787 語文1(chin1) 理理思維

2021-09-30 18:31:49 字數 3677 閱讀 6033

傳送門

題目背景:

蒟蒻 hansbug 在語文考場上,撓了無數次的頭,可腦子裡還是一片空白。

題目描述:

考試開始了,可是蒟蒻 hansbug 腦中還是一片空白。哦不!準確的說是亂七八糟的。現在首要任務就是幫蒟蒻 hansbug 理理思維。假設 hansbug 的思維是一長串字串(字串中包含且僅包含 26

2626

個字母),現在的你,有一張神奇的藥方,上面依次包含了三種操作:

獲取第 x

xx 到第 y

yy 個字元中字母 k

kk 出現了多少次

將第 x

xx 到第 y

yy 個字元全部賦值為字母 k

kk將第 x

xx 到第 y

yy 個字元按照 a-z 的順序排序

你欣喜若狂之時,可是他腦細胞和 rp 已經因為之前過度緊張消耗殆盡,眼看試卷最後還有一篇 800

80080

0 字的作文呢,所以這個關鍵的任務就交給你啦!

輸入格式:

第一行包含兩個整數 n

nn、m

mm,分別表示 hansbug 的思維所包含的字母個數和藥方上操作個數。

第二行包含乙個長度為 n

nn 的字串,表示 hansbug 的思維。

第 3 −m

+23-m+2

3−m+

2 行每行包含一條操作,三種操作格式如下:

操作 1

11:1xi

yiki

1\; x_i\; y_i\; k_i

1xi​yi

​ki​

表示將第 x

ix_i

xi​ 到第 y

iy_i

yi​ 個字元中 k

ik_i

ki​ 出現的次數輸出

操作 2

22:2xi

yiki

2\; x_i\; y_i\; k_i

2xi​yi

​ki​

表示將第 x

ix_i

xi​ 到第 y

iy_i

yi​ 個字元全部替換為 k

ik_i

ki​操作 3

33:3xi

yi3\; x_i\; y_i

3xi​yi

​ 表示將第 x

ix_i

xi​ 到第 y

iy_i

yi​ 個字元按照 a-z 的順序排序

輸出格式:

輸出為若干行,每行包含乙個整數,依次為所有操作 1

11 所得的結果。

樣例資料:輸入

10 5

abcdabcdcd

1 1 3 a

3 1 5

1 1 3 a

2 1 2 b

1 2 3 b 輸出

122

說明:

樣例說明:

資料規模:

此題目中大小寫不敏感。

這道題看題解大佬都用的是 odt,然而我不會啊,就默默地用線段樹

建立 26

2626

顆線段樹,每顆線段樹代表對應的字母,對於每個節點都記錄乙個 sum

sumsu

m,代表當前區間對應字母的數量

那麼操作 1,2

1,21,

2 就是線段樹基本操作了,這裡就不贅述了

對於操作 3

33,統計每個字母在 [ xxx,

,,yyy ] 中的數量,然後直接列舉用區間覆蓋就可以了

時間複雜度 o(s

⋅n⋅log⁡2

n)o(s\cdot n\cdot \log_2n)

o(s⋅n⋅

log2​n

),但是常數有點大啊,要吸氧才能過

#include

#include

#include

#define c 30

#define n 100005

using

namespace std;

int n,m;

char s[n]

,k[5];

int num[c]

,sum[c]

[n<<2]

,mark[c]

[n<<2]

;int

idx(

char x)

void

insert

(int root,

int l,

int r,

int pos,

int id)

int mid=

(l+r)

>>1;

if(pos<=mid)

insert

(root<<

1,l,mid,pos,id)

;else

insert

(root<<1|

1,mid+

1,r,pos,id)

; sum[id]

[root]

=sum[id]

[root<<1]

+sum[id]

[root<<1|

1];}

void

pushnow

(int root,

int id,

int l,

int r,

int val)

void

pushdown

(int root,

int l,

int r,

int mid,

int id)

intquery

(int root,

int l,

int r,

int x,

int y,

int id)

void

modify

(int root,

int l,

int r,

int x,

int y,

int id,

int val)

int mid=

(l+r)

>>1;

pushdown

(root,l,r,mid,id);if

(x<=mid)

modify

(root<<

1,l,mid,x,y,id,val);if

(y>mid)

modify

(root<<1|

1,mid+

1,r,x,y,id,val)

; sum[id]

[root]

=sum[id]

[root<<1]

+sum[id]

[root<<1|

1];}

intmain()

else}}

return0;

}

洛谷P2787 語文1(chin1) 理理思維

洛谷題目鏈結 珂朵莉樹吼啊!對於操作 1 直接普通查詢即可 對於操作 2 直接區間賦值即可 對於操作 3 其實也並不難,來一次計數排序後,依次插入即可,注意初始化計數器陣列 具體實現看 include include include include include defineset set ite...

洛谷入門1(順序結構)

p5704 深基2.例6 字母轉換 p5705 深基2.例7 數字反轉 p5706 深基2.例8 再分肥宅水 p1425 小魚的游泳時間 p5708 深基2.習2 三角形面積 p2181 對角線 題解 多行字串寫法 includeint main include int main void prin...

洛谷 3372 線段樹 1

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下 操作1 ...