c 处理出每个点的后有多少子弹比当前子弹打,然后从前往后遍历即可

ll n,m;
void solve(){ 
  cin>>n;
  vector<int> a(n+1);
  rep(i,1,n)cin>>a[i];
  vector<int> suf(n+1),cnt(200,0),pre(n+1);
  per(i,n,1){
    int x = a[i],sum = 0;
    rep(j,x+1,100)sum+=cnt[j];
    suf[i]=sum;cnt[x]++;
  }
  int x;cin>>x>>x;
  rep(i,1,n)pre[i]=pre[i-1]+(a[i]>x?1:0);
  int tot = pre[n],mi = inf;
  rep(i,1,n){
    int cur = pre[i]+suf[i];
    mi=min(cur,mi);
  }
  cout<<min(mi,tot);
  return;
}

d
注意到所有字符串gcd不唯一时,必须将所有字符调整为一致
否则,设t为所有长度的gcd,将每个字符串切割为n个t,统计每个数位上字符出现次数,将字符变为出现次数最大的即可

ll n,m;
void solve(){ 
  cin>>n;
  vector<string> a(n+1);
  vector<int> l(n+1);
  rep(i,1,n)cin>>a[i];
  rep(i,1,n)l[i]=(int)a[i].length();
  int x = l[1];
  rep(i,2,n)x=__gcd(x,l[i]);
  if(x==1){
    vector<int> c(27);
    rep(i,1,n){
      for(auto s:a[i])c[s-'a'+1]++;
    }
    int mx = 0;
    rep(i,1,26)mx=max(mx,c[i]);
    ll tot = 0;
    rep(i,1,n)tot+=l[i];
    cout<<tot-mx<<"\n";return ;
  }
  vector<vector<int>> cnt(x+1,vector<int>(27,0));
  vector<int>tot(x+1,0);
  rep(i,1,n){
    rep(j,0,l[i]-1){
      cnt[j%x][a[i][j]-'a'+1]++;
      tot[j%x]++;
    }
  }
  ll ans = 0;
  rep(i,0,x){
    int mx = 0;
    rep(j,1,26)mx=max(mx,cnt[i][j]);
    ans+=tot[i]-mx;
  }
  cout<<ans;
  return;
}

e
问题等价为:将数组中全部元素+1或-1,问是否所有元素不相同,同时每个元素的值大于等于2*其下标
考虑贪心,从后往前,优先变大,其次变小,只要出现重复即输出no
赛时代码有点丑

ll n,m;
void solve(){ 
  cin>>n;
  vector<int> a(n+1),b(n+1);
  rep(i,1,n)cin>>a[i];
  sort(a.begin()+1,a.end());
  rep(i,1,n)b[i]=a[i];
  map<int,int> mp;
  rep(i,1,n)mp[a[i]]++;
  for(auto[u,v]:mp){
    if(v>2){
      cout<<"NO\n";return;
    }
  }
  map<int,int> vis;
  per(i,n,1){
    int cur = b[i];
    if(cur==1){
      if(vis[2]){
        cout<<"NO\n";return ;
      }else{
        vis[2]=1;b[i]=2;
      }
    }else{
      if(!vis[cur+1]){
        vis[cur+1]=1;b[i]++;
      }else if(!vis[cur-1]){
        vis[cur-1]=1;b[i]--;
      }else{
        cout<<"NO\n";return ;
      }
    } 
  }
  sort(b.begin()+1,b.end());
  // rep(i,1,n)cout<<b[i]<<" ";cout<<"\n";
  int now = 0,pre = 0;
  rep(i,1,n){
    now+=b[i]-pre;now-=2;pre=b[i];
    if(now<0){
      cout<<"NO\n";return ;
    }
  }
  cout<<"YES\n";return ;
  return;
}