需要注意的是,每次操作询问之后都不会对原序列进行修改,即每次操作都是在原序列上直接进行的。
就是说把到l到r之间的所有数用cnt每次加p就行了
根据解析写代码1:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=1e5;
LL a[N],n,ans,l,r,p,k,T;
LL pre[N],suf[N];
int main(){
cin>>n>>T;
for(int i=1;i<=n;i++){
cin>>a[i],pre[i]=pre[i-1]+a[i];
}
for(int i=n;i>0;i--)
suf[i]=suf[i+1]+a[i];
while(T--){
cin>>l>>r>>p>>k;
LL tot=pre[l-1]+(r-l+1)*p+suf[r+1];
if(tot%k==0)
cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
就是求2^n,3^m相乘后大于r小于L,cnt++
根据解析写代码2:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=5e5+5;
LL l,r,ans;
LL a[100];
int main(){
cin>>l>>r;
a[0]=1;
for(int i=1;i<=60;i++){
a[i]=a[i-1]*2;
}
for(int i=0;i<=60;i++){
LL base=1;
while(a[i]*base<=r){
if(a[i]*base>=l){
ans++;
}
base*=3;
}
}
cout<<ans;
return 0;
}
此题为水题,不讲解
无解析写代码3:
#include <bits/stdc++.h>
using namespace std;
string s;
bool ans(string s){
int len=s.length();
string a;
for(int i=len-1;i>=0;i--){
a+=s[i];
}
if(a==s){
return true;
}else{
return false;
}
}
int main(){
int n;
cin>>n;
while(n--){
cin>>s;
int len=s.length();
for(int i=0;i<=len;i++){
if(s[i]>='A' && s[i]<='Z'){
s[i]+=32;
}
}
if(ans(s)){
cout<<"Yes\n";
}else{
cout<<"No\n";
}
}
return 0;
}
此题为水题,不讲解
无解析写代码4:
#include <bits/stdc++.h>
using namespace std;
string s;
int main(){
int n;
cin>>n;
int cnt=0;
while(n--){
cin>>s;
int len=s.length();
if(len==5){
if(s[2]==s[4]){
if(s[0]!=s[1] && s[0]!=s[2] && s[0]!=s[3] && s[1]!=s[2] && s[1]!=s[3] && s[2]!=s[3]){
cnt++;
}
}
}
}
cout<<cnt;
return 0;
}
那就是计算n个摊位的总钱(ans)
然后,判断s是否大于ans
·大于则s/ans,s%=ans,遍历每个摊位,看剩下的钱(t)能买多少个?s/ans+t
·小于则遍历每个摊位,看能买多少个
根据解析写代码5:
#include <bits/stdc++.h>
using namespace std;
long long a[101010];
int main(){
long long ans=0;
long long n,s;
cin>>n>>s;
for(int i=1;i<=n;i++){
cin>>a[i];
}
long long x=0;
while(1){
long long num=0,cnt=0;
for(int i=1;i<=n;i++){
if(num+a[i]<=s){
num+=a[i];
cnt++;
}
}
if(cnt==0){
break;
}
long long round=s/num;
ans+=round*cnt;
s%=num;
}
cout<<ans;
return 0;
}