A .
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const int N=1e6+10,M=1e6+10;
int a[N],mp[M]={0};
int s[N],pos[N];
int go[N];
void solve(){
int n;cin>>n;
if((n/2)==((n-1)/2))cout<<n/2+1<<'\n';
else cout<<n/2<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
B . 因为最多就有10 所以直接暴力
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
int a[N],mp[M]={0};
int cnt[N];
void solve(){
int n;string s;cin>>n>>s;
int ans=0;s='?'+s;
for(int i=1;i<=n;i++){
for(int k=0;k<=9;k++)cnt[k]=0;
int cnt1=0,maxx=0;
for(int j=i;j<=min(n,i+105);j++){
cnt[s[j]-'0']++;
if(cnt[s[j]-'0']==1)cnt1++;
maxx=max(maxx,cnt[s[j]-'0']);
if(maxx<=cnt1)ans++;
}
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
C. 题意是前缀和数组里面0最多 我们只需要从后往前遍历 每次遇到a[i]==0就把a[i]更新为a[i]后面的前缀和数组中出现次数最多的数即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
int a[N];
int cnt[N];
void solve(){
int n;cin>>n;int a[n+1],pre[n+1];pre[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];pre[i]=pre[i-1]+a[i];
}
map<int,int>mp;int maxx=0,ans=0;
for(int i=n;i>=1;i--){
mp[pre[i]]++;
maxx=max(maxx,mp[pre[i]]);
if(a[i]==0){
ans+=maxx;
maxx=0;
mp.clear();
}
}
for(int i=1;i<=n;i++){
if(a[i]==0)break;
if(pre[i]==0)ans++;
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
D. 补数论去了 QAQ