A. Divide and Multiply
#include<bits/stdc++.h>
using namespace std;
long long w[20];
int main(){
int t;
cin>>t;
while (t--)
{
int n;
cin>>n;
for( int i=1;i<=n;i++){
cin>>w[i];
}
int pow=0;
for( int i=1;i<=n;i++){
while(w[i]!=1&&w[i]%2==0){
w[i]/=2;
pow++;
}
}
sort(w+1,w+1+n);
long long ans=0;
for( int i=1;i<=pow;i++){
w[n]*=2;
}
for( int i=1;i<=n;i++){
ans+=w[i];
}
cout<<ans<<endl;
}
}
B. William the Vigilant
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int N=500100;
int main(){
int n,q;
cin>>n>>q;
string s;
cin>>s;
int ans=0;
for( int i=0;i<n-2;i++){
if(s[i]=='a'&&s[i+1]=='b'&&s[i+2]=='c') ans++;
}
for( int i=1;i<=q;i++){
string ss;
int x;
cin>>x>>ss;
x--;
if(s[x]==ss[0]) {
printf("%d\n",ans);
continue;
}
else {
int be=max(0,x-2);
int y=0;
for( int j=be;j<=x;j++){
if(s[j]=='a'&&s[j+1]=='b'&&s[j+2]=='c') y++;
}
ans-=y;
s[x]=ss[0];
y=0;
for( int j=be;j<=x;j++){
if(s[j]=='a'&&s[j+1]=='b'&&s[j+2]=='c') y++;
}
ans+=y;
printf("%d\n",ans);
}
}
return 0;
}
C. Complex Market Analysis
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1000100;
vector<int>h[N];
int cnt=0;
int primes[N];
bool st[N];
void get_prime(){
st[1]=1;
for( int i=2;i<=1000001;i++){
if(st[i]==0) primes[cnt++]=i;
else continue;
for( int j=i+i;j<=1000001;j+=i){
st[j]=1;
}
}
return ;
}
int main(){
int t;
cin>>t;
get_prime();
while(t--){
int n,e;
cin>>n>>e;
for( int i=0;i<e;i++) h[i].clear();
for( int i=0;i<n;i++){
int x;
scanf("%d",&x);
h[i%e].push_back(x);
}
long long ans=0;
for( int i=0;i<e;i++){
for( int j=0;j<h[i].size();j++){
if(st[h[i][j]]==0){
int l=j,r=j;
while(l-1>=0&&h[i][l-1]==1) l--;
while(r+1<h[i].size()&&h[i][r+1]==1) r++;
ans+=(j-l+1ll)*(r-j+1ll)-1ll;
}
}
}
cout<<ans<<endl;
}
return 0;
}
D. Social Network
阅读题+并查集
对于每个给定的边,
如果边的两个端点不连通,那么将两个端点连通,并输出最大的集合。
如果边的两个端点不连通,那么将这次连通的机会存起来,并且使用所有联通机会将图进行连通,最后输出最大值。
#include <bits/stdc++.h>
using namespace std;
const int N=2010;
int fa[N];
int siz[N];
int find(int x){
// cout<<x<<fa[x]<<endl;
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
void merge( int x,int y){
if(find(x)!=find(y)){
siz[find(y)]+=siz[find(x)];
fa[find(x)]=find(y);
}
}
int cmp(int a,int b){
return a>b;
}
int main(){
int n,d;
cin>>n>>d;
for( int i=1;i<=n;i++){
fa[i]=i;
siz[i]=1;
}
int ans=1;
int remain=0;
for( int i=1;i<=d;i++){
int x,y;
cin>>x>>y;
if(find(x)!=find(y)){
merge(x,y);
}
else {
remain++;
}
vector<int>v;
for( int i=1;i<=n;i++){
if(fa[i]==i){
v.push_back(siz[i]);
}
}
sort(v.begin(),v.end(),cmp);
int res=0;
for( int i=0;i<=remain;i++){
res+=v[i];
}
cout<<res-1<<endl;
// cout<<ans-1<<endl;
}
return 0;
}