AtCoder Beginner Contest 353
很有趣的一场题,值得写一下题解:
A
模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int x; cin>>x; for(int i=1;i<=n-1;i++) { int y; cin>>y; if(y>x) { cout<<i+1; return 0; } } cout<<-1; }
|
B
很简单的分组,大于变0就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include<bits/stdc++.h> using namespace std; const int N=1e6+100; int a[N]; int main() { int n,m; cin>>n>>m; int ans=0; int sum=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(sum+a[i]>m) { sum=a[i]; ans++; if(i==n) { ans++; } } else { sum+=a[i]; if(i==n) { ans++; } } }
cout<<ans; }
|
C
本题重要是范围不然还不好做
只需要找到每个数第一个加他大于1e8的数字的位置,然后就可以开始求前缀和了
因为在这之前的数字都是满足题意得相加,不用取模,因此并入答案
后面部分大于1e8就-1e8然后正常并入即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define int long long const int N=1e6+100; ll a[N]; ll sum[N]; const int mod=100000000; signed main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } ll ans=0; sort(a+1,a+1+n); for(int i=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n-1;i++) { int x=lower_bound(a+i+1,a+n+1,100000000-a[i])-a;
if(x==n+1) { ans+=(n-i)*a[i]+sum[n]-sum[i]; } else { ans+=(x-n-1)*100000000+sum[n]-sum[x-1]+(n-x+1)*a[i]; ans+=(x-i-1)*a[i]+sum[x-1]-sum[i]; }
} cout<<ans<<'\n';
}
|
D
本题也是前缀和加上一个*10操作,和获取位数即可
感觉<c啊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <bits/stdc++.h> using namespace std; #define int long long const int p=998244353; int len(int num){ int ans=0; while(num){ ans++; num/=10; } return ans; } int qmi(int a,int b,int p){ int res=1; while(b){ if(b&1==1){ res=(res*a)%p; } a=(a*a)%p; b>>=1; } return res; } signed main(){ int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } int ans=0; int sum=a[0]; for(int i=1;i<n;i++) { ans=(ans+a[i]*i%p)%p; ans=(ans+sum*qmi(10,len(a[i]),p))%p; sum=(sum+a[i])%p; } cout<<ans<<'\n'; }
|
E
双哈希!
非常帅气的双哈希写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; ull n,ans,len,hs,Hs; string s; map<pair<ull,ull>,ull> mp; int main(){ cin >> n; for(ull i=1;i<=n;i++){ cin >> s; len=s.length(),hs=Hs=1; for(ull j=0;j<len;j++) { hs=(hs*131+s[j]-'a'),Hs=(Hs*1331+s[j]-'a'); ans+=mp[{hs,Hs}]; mp[{hs,Hs}]++; } } cout << ans; return 0; }
|
队友吐槽->
image-20240511220911868