日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P2787 语文1(chin1)- 理理思维

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2787 语文1(chin1)- 理理思维 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目背景

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

題目描述

考試開始了,可是蒟蒻HansBug腦中還是一片空白。哦不!準確的說是亂七八糟的。現在首要任務就是幫蒟蒻HansBug理理思維。假設HansBug的思維是一長串字符串(字符串中包含且僅包含26個字母),現在的你,有一張神奇的藥方,上面依次包含了三種操作:

  • 獲取第x到第y個字符中字母k出現了多少次

  • 將第x到第y個字符全部賦值為字母k

  • 將第x到第y個字符按照A-Z的順序排序

  • 你欣喜若狂之時,可是他腦細胞和RP已經因為之前過度緊張消耗殆盡,眼看試卷最后還有一篇800字的作文呢,所以這個關鍵的任務就交給你啦!

    輸入輸出格式

    輸入格式:

    第一行包含兩個整數N、M,分別表示HansBug的思維所包含的字母個數和藥方上操作個數。

    第二行包含一個長度為N的字符串,表示HansBug的思維。

    第3-M+2行每行包含一條操作,三種操作格式如下:

  • 操作1: 1 xi yi ki 表示將第xi到第yi個字符中ki出現的次數輸出

  • 操作2: 2 xi yi ki 表示將第xi到第yi個字符全部替換為ki

  • 操作3: 3 xi yi 表示將第xi到第yi個字符按照A-Z的順序排序

  • 輸出格式:

    輸出為若干行,每行包含一個整數,依次為所有操作1所得的結果。

    輸入輸出樣例

    輸入樣例#1:? 10 5 ABCDABCDCD 1 1 3 A 3 1 5 1 1 3 A 2 1 2 B 1 2 3 B 輸出樣例#1:? 1 2 2

    說明

    樣例說明:

    數據規模:

    此題目中大小寫不敏感。

    ?

    Solution:

      本題線段樹的做法實在是巧妙~~。

      理理思維,因為只有$26$個字母(忽略大小寫后),于是我們將每個字母映射為$0$到$25$的數字,可以建$26$棵線段樹來維護每個數字出現的個數(注意,千萬不要寫數組般的線段樹,不好進行第三個操作,所以最好用結構體來存。記得對結構體中成員清$0$!由于這個我調了很久~

      講下向上維護時的$pushup$,我們這里騷操作重載運算符$+$,將其定義為將兩個結構體變量的成員$p[]$(即維護的$26$棵線段樹)累加,返回一個結構體變量,這波操作能方便后面的$query$。那么$pushup$就是將當前左右兒子的信息累加到當前節點就好了。

      然后我們考慮區間修改$update$操作,正常的判斷區間包含然后直接修改,這里設置懶惰標記(初值為$-1$),每次修改后就標記,然后下放時就將左右兒子維護的數組清$0$,賦值為當前的數字所對應的長度。

      重點的查詢,我們直接返回維護當前查詢區間的結構體變量,這樣對于操作$1$,直接輸出某個$p[i]$的值即可,而對于操作$3$直接從前往后掃模擬一遍,暴力成段修改,最多也就$26$次$update$。

      那么本題就$OK$了。

    代碼:

    ?

    #include<bits/stdc++.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define il inline #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int N=50005; int n,m,ss[N],lazy[N<<2]; char s[N]; struct node{int p[28];void cler(){memset(p,0,sizeof(p));} }t[N<<2],emp; node operator + (node a,node b){node c;For(i,0,25)c.p[i]=a.p[i]+b.p[i];return c; } il int gi(){int a=0;char x=getchar();while(x<'0'||x>'9')x=getchar();while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();return a; } il int change(char x){return (x>='a'&&x<='z')?x-'a':x-'A';} il void pushup(int rt){For(i,0,25)t[rt].p[i]=t[rt<<1].p[i]+t[rt<<1|1].p[i];} il void pushdown(int rt,int len){if(lazy[rt]!=-1){lazy[rt<<1]=lazy[rt],lazy[rt<<1|1]=lazy[rt];t[rt<<1].cler();t[rt<<1|1].cler();t[rt<<1].p[lazy[rt<<1]]=(len-(len>>1)),t[rt<<1|1].p[lazy[rt<<1|1]]=(len>>1);lazy[rt]=-1;} } il void build(int l,int r,int rt){if(l==r){t[rt].cler();t[rt].p[change(s[l])]=1;return;}int m=l+r>>1;build(lson),build(rson);pushup(rt); } il void update(int L,int R,int c,int l,int r,int rt){if(L<=l&&R>=r){t[rt].cler(),lazy[rt]=c;t[rt].p[c]=r-l+1;return;}int m=l+r>>1;pushdown(rt,r-l+1);if(L<=m)update(L,R,c,lson);if(R>m)update(L,R,c,rson);pushup(rt); } il node query(int L,int R,int l,int r,int rt){if(L<=l&&R>=r)return t[rt];node ret;ret.cler();int m=l+r>>1;pushdown(rt,r-l+1);if(L<=m)ret=ret+query(L,R,lson);if(R>m)ret=ret+query(L,R,rson);return ret; } int main(){n=gi(),m=gi();scanf("%s",s+1);memset(lazy,-1,sizeof(lazy));build(1,n,1);int f,x,y;char z[2];while(m--){f=gi();x=gi();y=gi();if(f!=3)scanf("%s",z);if(f==1) printf("%d\n",query(x,y,1,n,1).p[change(z[0])]);else if(f==2) update(x,y,change(z[0]),1,n,1);else {node tmp=query(x,y,1,n,1);int l,r=x-1;For(i,0,25){if(!tmp.p[i])continue;l=r+1,r=l+tmp.p[i]-1;update(l,r,i,1,n,1);}}}return 0; }

    ?

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/five20/p/9082396.html

    總結

    以上是生活随笔為你收集整理的P2787 语文1(chin1)- 理理思维的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。