文章目录
题目
A - Dawid and Bags of Candies
#include<bits/stdc++.h>
#define de(x) cout<<#x <<" = "<<x<<endl;
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
ll vis[1000];
int main(){
ll a[4];
ll sum=0;
scanf("%lld%lld%lld%lld",&a[0],&a[1],&a[2],&a[3]);
for(ll i=0;i<4;i++){
sum+=a[i];
}
bool flag=false;
for(ll i=0;i<4;i++)
if(a[i]*2==sum)
flag=true;
for(ll i=0;i<4;i++){
for(ll j=i+1;j<4;j++)
if((a[i]+a[j])*2==sum)
flag=true;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
B - Ania and Minimizing
#include<bits/stdc++.h>
#define de(x) cout<<#x <<" = "<<x<<endl;
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
char s[1000005];
ll n,k;
int main(){
scanf("%lld%lld",&n,&k);
getchar();
scanf("%s",s);
if(n==1&&k>0){
printf("0\n");
return 0;
}
if(s[0]!='1'&&k>0){
s[0]='1';
k--;
}
for(ll i=1;i<n;i++){
if(s[i]!='0'&&k>0){
s[i]='0';
k--;
}
if(k==0)
break;
}
printf("%s\n",s);
return 0;
}
C - Anadi and Domino
#include<bits/stdc++.h>
using namespace std;
int link[10][10];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
link[u][v]=link[v][u]=1;
}
int ans=0;
if(n<=6)cout<<m<<endl;
else{
for(int i=1;i<=7;i++){
for(int j=i+1;j<=7;j++){
int cur=m;
for(int k=1;k<=7;k++){
if(link[i][k]&&link[k][j])cur--;
}
ans=max(cur,ans);
}
}
cout<<ans<<endl;
}
}
D - Marcin and Training Camp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=7e3+10;
unordered_map<ll,ll>mp;
ll a[maxn];
ll b[maxn];
bool vis[maxn];
int main(){
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
mp[a[i]]++;
}
for(ll i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
ll ans=0;
for(auto it:mp){
if(it.second>1){
for(ll i=1;i<=n;i++){
if(!vis[i]&&(a[i]|it.first)==it.first){
vis[i]=true;
ans+=b[i];
}
}
}
}
cout<<ans<<endl;
}
E - Kamil and Making a Stream
用map从上向下合并
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
const ll mod=1e9+7;
ll head[maxn];
struct Edge{
ll v,next;
}e[maxn<<1];
ll cnt=0;
void add(ll u,ll v){
e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt++;
}
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
ll a[maxn];
unordered_map<ll,ll>mp[maxn];
ll ans=0;
void dfs(ll u,ll f){
if(~f){
for(auto it:mp[f]){
mp[u][gcd(it.first,a[u])]+=it.second;
}
}
mp[u][a[u]]++;
for(auto it:mp[u]){
ans=(ans+it.first*it.second%mod)%mod;
}
for(ll i=head[u];~i;i=e[i].next){
if(e[i].v==f)continue;
dfs(e[i].v,u);
}
}
int main(){
memset(head,-1,sizeof(head));
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<n;i++){
ll u,v;
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
}
dfs(1,-1);
cout<<ans<<endl;
}
F - Konrad and Company Evaluation
维护入度和出度乘积的和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll out[maxn];
ll in[maxn];
vector<ll>g[maxn];
ll cnt;
void add(ll u,ll v){
g[u].push_back(v);
in[u]++;
out[v]++;
}
int main(){
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++){
ll u,v;
scanf("%lld%lld",&u,&v);
if(v<u)swap(u,v);
add(u,v);
}
ll ans=0;
ll q;
scanf("%lld",&q);
for(ll i=1;i<=n;i++){
ans+=in[i]*out[i];
}
printf("%lld\n",ans);
while(q--){
ll u;
scanf("%lld",&u);
ans-=in[u]*out[u];
for(ll i=0;i<g[u].size();i++){
ll v=g[u][i];
ans-=in[v]*out[v];
in[u]--;
out[v]--;
add(v,u);
ans+=in[v]*out[v];
}
g[u].clear();
printf("%lld\n",ans);
}
}