暑假集训PVZ提高模拟9
没关 exe 让这货挂了一天
UPD:又挂了一晚上,现在被我正义制裁了
A.大众点评
交互红题啊,交互会写,但是忘记判 \(n=1\) 了😥
这个题交互库函数实现起来还是挺简单的,我 Windows 不会编译,我寻思你可以直接搓一个交互库出来啊,所以我就搓了个交互库
#include "ramen.h"
//#include"test.h"
#include<bits/stdc++.h>
using namespace std;
void Ramen(int N){
if(N==1){
Answer(0,0);return;
}
int res=Compare(0,1),maxn,minn;
if(res==1){
maxn=0,minn=1;
}
else{
maxn=1,minn=0;
}
int i=2;
for(;i+1<=N-1;i+=2){
res=Compare(i,i+1);
int jmax,jmin;
if(res==1){
jmax=i,jmin=i+1;
}
else{
jmax=i+1,jmin=i;
}
if(Compare(maxn,jmax)==-1){
maxn=jmax;
}
if(Compare(minn,jmin)==1){
minn=jmin;
}
}
for(;i<=N-1;++i){
res=Compare(maxn,i);
if(res==-1){
maxn=i;
}
else{
res=Compare(minn,i);
if(res==1){
minn=i;
}
}
}
Answer(minn,maxn);
}
#include<bits/stdc++.h>
using namespace std;
int NN,TT,_A[401],Cntt;
void Ramen(int N);
int Compare(int X,int Y){
++Cntt;
if(_A[X]>_A[Y]) return 1;
return -1;
}
int mi=0,ma=0;
void Answer(int X,int Y){
cout<<"Received Answer "<<X<<"(min) "<<Y<<"(max)"<<endl;
if(X==mi and Y==ma){
cout<<"Answer Correct. Compare Time: "<<Cntt<<endl;
}
else{
cout<<"Incorrect"<<endl;
}
}
int main(){
//文件输出版本
// ifstream="file name";
// f>>NN>>TT;
// for(int i=0;i<=NN-1;++i){
// f>>_A[i];
// if(mi==0 or _A[i]<_A[mi]) mi=i;
// if(ma==0 or _A[i]>_A[ma]) ma=i;
// }
// Ramen(NN);
cin>>NN>>TT;
for(int i=0;i<=NN-1;++i){
cin>>_A[i];
if(mi==0 or _A[i]<_A[mi]) mi=i;
if(ma==0 or _A[i]>_A[ma]) ma=i;
}
Ramen(NN);
}
B.录取查询
赛时先打的特殊性质二,我寻思这东西不妥妥的能分块,块内维护单调性,再在接口判一下就行了,所以就打了这个特殊性质的分块,后来发现这个性质是能推广的,只需要再判一下当前中间的字母是否在该区间内全部出现即可(因为出现的不全说明你这几个字母在排完序后势必还会再插入一点东西,所以就是错的),但是没时间打了,赛后发现单调性和全部出现性质还可以用线段树维护.
学长:你这是常数问题
分块版本
#include<bits/stdc++.h>
using namespace std;
int n,q;string s;
namespace subtask1{
string t;
void main(){
t=s;sort(t.begin(),t.end());
for(int i=1;i<=q;++i){
int op;cin>>op;
if(op==1){
int pos;char ct;
cin>>pos>>ct;
s[pos-1]=ct;
t=s;sort(t.begin(),t.end());
}
else{
int l,r;
cin>>l>>r;
if(t.find(s.substr(l-1,r-l+1))<t.length()){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
}
}
namespace subtask2{
int len,up[1001];
inline int locate(int id){
return id/len+1;
}
inline int start(int id){
return (id-1)*len;
}
inline int end(int id){
return id*len-1;
}
void main(){
len=sqrt(n);
for(int i=1;i<=n/len+1;++i){
bool isup=true;
for(int j=start(i);j<=min(n-2,end(i)-1);++j){
if(s[j]>s[j+1]){
isup=false;
break;
}
}
up[i]=isup;
}
for(int i=1;i<=q;++i){
int op;cin>>op;
if(op==1){
int pos;char ct;
cin>>pos>>ct;
s[pos-1]=ct;
bool isup=true;
for(int j=start(locate(pos-1));j<=min(n-2,end(locate(pos-1))-1);++j){
if(s[j]>s[j+1]){
isup=false;
break;
}
}
up[locate(pos-1)]=isup;
}
else{
int l,r;
cin>>l>>r;
// cout<<s<<" "<<l<<" "<<r<<endl;
bool isup=true;l--,r--;
// cout<<locate(l)<<" "<<locate(r)<<endl;
if(locate(r)-locate(l)<=1){
for(int i=l;i<=r-1;++i){
if(s[i]>s[i+1]){
cout<<"No"<<endl;
isup=false;
break;
}
}
if(isup){
cout<<"Yes"<<endl;
}
}
else{
bool isup=true;
for(int i=locate(l)+1;i<=locate(r);++i){
// cout<<"findk "<<i<<" "<<up[i]<<endl;
if((i!=locate(r) and !up[i]) or s[end(i-1)]>s[start(i)]){
isup=false;
cout<<"No"<<endl;
break;
}
}
if(isup){
for(int i=l;i<=min(n-2,end(locate(l))-1);++i){
if(s[i]>s[i+1]){
isup=false;
cout<<"No"<<endl;
break;
}
}
if(isup){
for(int i=start(locate(r));i<=r-1;++i){
if(s[i]>s[i+1]){
isup=false;
cout<<"No"<<endl;
break;
}
}
if(isup){
cout<<"Yes"<<endl;
}
}
}
}
}
}
}
}
int main(){
// freopen("test.in","r",stdin);
// freopen("sb2.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>s>>q;
if(n<=300 and q<=300){
subtask1::main();
return 0;
}
bool issubtask2=true;
for(char i:s){
if(i!='a' and i!='b'){
issubtask2=false;
break;
}
}
if(issubtask2){
subtask2::main();
return 0;
}
// subtask1::main();
}
/*
33
aaaaabbbbbababaaaabbbabaaaaabbbbb
114
6
aabbba
1
2 1 5
8
bbbbbbbb
1
2 3 7
*/
线段树版本
#include <bits/stdc++.h>
using namespace std;
const int N=100001;
int n,q;
char s[N];
struct ST{
struct stree{
int l,r,is;
char lz,rz;
int cnt[30];
}a[N<<2];
void pushup(stree &res,stree a,stree b){
res.lz=a.lz;
res.rz=b.rz;
res.is=(a.is&&b.is)&&(a.rz<=b.lz);
for(int i=1;i<=26;i++){
res.cnt[i]=a.cnt[i]+b.cnt[i];
}
}
void build(int p,int l,int r){
a[p].l=l;
a[p].r=r;
if(a[p].l==a[p].r){
a[p].lz=a[p].rz=s[a[p].l];
a[p].is=1;
a[p].cnt[s[a[p].l]-'a'+1]=1;
return;
}
int mid=(a[p].l+a[p].r)/2;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(a[p],a[p<<1],a[p<<1|1]);
return ;
}
void change(int p,int x,char k){
if(a[p].l==a[p].r){
a[p].cnt[a[p].lz-'a'+1]=0;
a[p].lz=a[p].rz=k;a[p].cnt[k-'a'+1]=1;
return;
}
int mid=(a[p].l+a[p].r)/2;
if(x<=mid) change(p<<1,x,k);
else change(p<<1|1,x,k);
pushup(a[p],a[p<<1],a[p<<1|1]);
}
stree ask(int p,int l,int r){
if(l<=a[p].l&&a[p].r<=r) return a[p];
int mid=(a[p].l+a[p].r)>>1;
if(r<=mid) return ask(p<<1,l,r);
if(l>mid) return ask(p<<1|1,l,r);
stree res;
pushup(res,ask(p<<1,l,r),ask(p<<1|1,l,r));
return res;
}
}tree;
int main(){
cin>>n>>(s+1)>>q;
tree.build(1,1,n);
while(q--){
int op;cin>>op;
if(op==1){
int x;char in;
cin>>x>>in;
tree.change(1,x,in);
}
if(op==2){
int l,r;
cin>>l>>r;
ST::stree res=tree.ask(1,l,r);
if(res.is){
bool flag=true;
for(int i=res.lz+1;i<=res.rz-1;i++){
if(res.cnt[i-'a'+1]!=tree.a[1].cnt[i-'a'+1]){
flag=false;
break;
}
}
if(flag){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
else cout<<"No"<<endl;
}
}
return 0;
}
C.精准打击
明天填坑
后记
你说得对,但是我被僵王博士的复仇恶心到了,我一共五路植物,车砸没两条,放三只橄榄球加两只巨人吃我一路半,放火球欺负我没寒冰菇烧了一路,我还打个牛魔,遂将题目改为暑假集训PVZ提高模拟9
今天电影后半段挺好看的,前半段不评价的原因是我没看