社区讨论
求助珂朵莉树
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 条回复,欢迎继续交流。
正在加载回复...