A. Acacius and String
爆零!太菜了,下来终于把A题代码调AC
了
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int n;
string res="abacaba";
int main()
{IO;int T;cin>>T;while(T--){cin>>n;string s;cin>>s;int flag=0;for(int i=0;i+6<n;i++)if(s.substr(i,7)==res) flag++;if(flag>1) cout<<"No"<<endl;else if(flag==1){cout<<"Yes"<<endl;for(auto t:s){if(t=='?') cout<<'e';else cout<<t;}cout<<endl;}else{for(int i=0,j=0;i<n;i++){if(s[i]=='?'||s[i]==res[j]){j++;if(j==7){if((i+4<n&&"aba"+s.substr(i+1,4)==res)||(i>=10&&s.substr(i-10,4)+"aba"==res)){j=0;i=i-6;}else {for(int x=i-6,y=0;y<7;x++,y++) s[x]=res[y];break;}}}else{i=i-j;j=0;}}for(int i=0;i+6<n;i++)if(s.substr(i,7)==res) flag++;if(flag>1) cout<<"No"<<endl;else if(flag==1){cout<<"Yes"<<endl;for(auto t:s){if(t=='?') cout<<'e';else cout<<t;}cout<<endl;}else cout<<"No"<<endl;}}return 0;
}
B. Dubious Cyrpto
赛后补题瞎搞,直接AC
了自己都很迷
na+b−c=mna+b-c=mna+b−c=m稍微化简一下na=m+c−bna=m+c-bna=m+c−b,然后对于右边一项的范围是[m+l−r,m−l+r][m+l-r,m-l+r][m+l−r,m−l+r],即代码中的[lmin,lmax]
,然后枚举a
,考虑lmina\frac{lmin}{a}almin和lmaxa\frac{lmax}{a}almax,如果lmina<lmaxa\frac{lmin}{a} < \frac{lmax}{a}almin<almax,那么由于下取整,lmaxa\frac{lmax}{a}almax肯定能够整除aaa,如果lmina=lmaxa\frac{lmin}{a}=\frac{lmax}{a}almin=almax,考虑他俩之间是否有能够整除aaa的即可,其他情况均不能整除aaa,然后就可以知道c−bc-bc−b的差na−mna-mna−m,然后枚举bbb,求个在范围中的ccc输出即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll l,r,m;
int main()
{IO;int T;cin>>T;while(T--){cin>>l>>r>>m;ll lmin=m+l-r,lmax=m+r-l;ll n=-1,b=-1,c=-1,x=r;int a;for(a=l;a<=r;a++){if(lmin/a<lmax/a){n=lmax/a;x=a*n-m;break;}else{if(lmin%a==0){n=lmin/a;x=a*n-m;break;}else if(lmax%a==0){n=lmax/a;x=a*n-m;break;}}}for(int b=l;b<=r;b++){if(x+b>=l&&x+b<=r){cout<<a<<" "<<b<<" "<<x+b<<endl;break;}}}return 0;
}
C. Choosing flowers
贪心+枚举+二分
首先容易证明最优解肯定只选择一种花多次(贪心),然后先对flower[i].a
降序排列,枚举最终选择哪一种花多次,不妨假设最后选flower[i]
多次,对于其他花的a
如果大于flower[i].b
肯定是需要选上,因此可以二分边界,然后分类一下就可以了。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
#define a first
#define b second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=100010;
pii flower[N];
int n,m;
ll s[N];
int main()
{IO;int T;cin>>T;while(T--){cin>>m>>n;for(int i=1;i<=n;i++) cin>>flower[i].a>>flower[i].b;sort(flower+1,flower+1+n);reverse(flower+1,flower+1+n);for(int i=1;i<=n;i++) s[i]=s[i-1]+1ll*flower[i].a;ll res=0;for(int i=1;i<=n;i++){int l=0,r=n;//注意边界l=0,如果所有flower的a值都小于枚举的b值最终应该是0while(l<r){int mid=l+r+1>>1;if(flower[mid].a>flower[i].b) l=mid;else r=mid-1;}if(m<=l) res=max(res,s[m]);else{if(i<=l) res=max(res,s[l]+1ll*flower[i].b*(m-l));else res=max(res,s[l]+1ll*flower[i].a+1ll*flower[i].b*(m-l-1));}}cout<<res<<endl;}return 0;
}
希望今天的div2不爆零,要加油哦!