社区讨论

求助珂朵莉树

P2787语文1(chin1)- 理理思维参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lobciett
此快照首次捕获于
2023/10/29 18:46
2 年前
此快照最后确认于
2023/11/04 00:30
2 年前
查看原帖
一直84分,TLE#13
C
#include<bits/stdc++.h>
#define db double
#define il inline
#define re register
#define ll long long
#define ui unsigned int
#define ull unsigned ll
#define fi first
#define se second
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define MP(x,y) make_pair(x,y)
#define lowbit(x) ((x)&(~(x)+1))
#define INF 0x3f3f3f3f
using namespace std;
#define MaxSize 20
char buf[1<<MaxSize],*p1,*p2;
#define GetChar() ((p1==p2)?(p2=buf+fread(p1=buf,1,1<<MaxSize,stdin),p1==p2?EOF:*p1++):*p1++)
template <class T>
inline void Read(T &x){
    x=0;re bool f=0;re char c=GetChar();
    while (c<47||c>58) f|=(c=='-'),c=GetChar();
    while (c>46&&c<59) x=(x<<3)+(x<<1)+(c&15),c=GetChar();
    x=f?(~x+1):x;
}
struct Node{
    mutable int l,r,v;
    Node(int lll,int rr=0,int vv=0):l(lll),r(rr),v(vv){}
    bool operator<(const Node &another) const{
        return l<another.l;
    }
};
#define STN set<Node>
STN s;
il STN::iterator split(int pos){
    STN::iterator it=s.lower_bound(Node(pos));
    if(it!=s.end()&&it->l==pos)return it;
    it--;
    int l=it->l,r=it->r;
    ll v=it->v;
    s.erase(it);
    s.insert(Node(l,pos-1,v));
    return s.insert(Node(pos,r,v)).first;
}
il void assign(int l,int r,int x){
    STN::iterator iterr=split(r+1),iterl=split(l);
    s.erase(iterl,iterr);
    s.insert(Node(l,r,x));
}
il void part_sort(int l,int r){
    STN::iterator iterr=split(r+1),iterl=split(l);
    int buk[30];memset(buk,0,sizeof buk);
    for(STN::iterator it=iterl;it!=iterr;it++){
        buk[it->v]+=(it->r)-(it->l)+1;
    }
    s.erase(iterl,iterr);
    int lst=l;
    for(int i=0;i<26;i++)
        if(buk[i]!=0) s.insert(Node(lst,lst+buk[i]-1,i)),lst=lst+buk[i];
}
il int getnum(int l,int r,int x){
    STN::iterator iterr=split(r+1),iterl=split(l);
    int res=0;
    for(STN::iterator it=iterl;it!=iterr;it++){
        if(it->v==x) res+=(it->r)-(it->l)+1;
    }
    return res;
}
int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++){
        char c;cin>>c;
        c=toupper(c);
        s.insert(Node(i,i,c-'A'));
    }
    for(int i=1;i<=m;i++){
        int op,x,y;
        char k;cin>>op>>x>>y;
        if(op==1){
            cin>>k;k=toupper(k);
            cout<<getnum(x,y,k-'A')<<endl;
        }
        if(op==2){
            cin>>k;k=toupper(k);
            assign(x,y,k-'A');
        }
        if(op==3){
            part_sort(x,y);
        }
        // printodt();
    }
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...