2018-04-04Codeforces Round #473 (Div. 2)

A
水题
B

这里我用了并查集,因为我以为 分组 1个单词可以在不同组,但是这个题目好像不用考虑在不同组。

#include<bits/stdc++.h>
using namespace std;
#define N 100005
typedef long long ll;
int n,k,m;
map<string,int>ma;
ll mh[N];
int pre[N];
int fun(int x){

if(x!=pre[x])
{

    pre[x]=fun(pre[x]);
}
return  pre[x];
}
int main()
{
    int m;
   scanf("%d%d%d",&n,&k,&m);
   string s;

   for(int i=1;i<=n;i++){
    cin>>s;
    ma[s]=i;
    pre[i]=i;
   }

    for(int i=1;i<=n;i++){
        scanf("%lld",&mh[i]);
    }
    int t;int a,b;
    for(int i=0;i<k;i++){

        scanf("%d",&t);
        scanf("%d",&a);
        for(int j=1;j<t;j++){
          scanf("%d",&b);
          int fa,fb;
          fa=fun(a);
          fb=fun(b);
          if(mh[fa]>mh[fb]){
            pre[fa]=fb;
          }else pre[fb]=fa;
          a=b;
        }
    }
    ll ans=0;
    for(int i=0;i<m;i++){
        cin>>s;
        int p=ma[s];
      //  cout<<p<<endl;
        p=fun(p);
        ans+=mh[p];
    }
    printf("%lld\n",ans);
    return 0;
}

C
找规律吧,我还是找复杂了,正确的情况可以全部跟1相连,不正确两层的情况,可以第二层直接跟2相连

#include<bits/stdc++.h>
using namespace std;
#define N 100005
typedef long long ll;

map<string,int>ma;
ll mh[N];
int pre[N];
int n;
void fun2(){
for(int i=2;i<=n;i++){
    printf("%d  %d\n",i-1,i);
}

}

void fun1(){
    int i;
for(i=1;i<=n/2;i++){
    printf("%d  %d\n",1,i+1);
}
for(i;i<n;i++){
    printf("%d  %d\n",n/2+1,i+1);
}
}
int main()
{

   scanf("%d",&n);
    if(n<6){
        printf("-1\n");
        fun2();
    }else{
    fun1();fun2();

    }
    return 0;
}

D
参考的别人的代码,当时 是从 总体出发,就不知道怎么做了T - T,还是要逐个击破

好坑啊, ai 小于10万 但是 产生的序列可能超过 100万,数组开小了

#include<bits/stdc++.h>
using namespace std;
#define N 500005

int n;
bool vis[N];
int main(){
    scanf("%d",&n);
    int a;
    int ans=0;
    int l=2;
    int flag=0;
    for(int i=0;i<n;i++){
        scanf("%d",&a);
        while(vis[l]==true)l++;
        ans=l;
        if(!flag)
            ans=max(l,a);
        while(vis[ans])ans++;
        printf("%d%c",ans,i==n-1?'\n':' ');
        if(ans>a)
            flag=1;
        if(ans>a)
            flag=1;
        for(int d=l;d*d<=ans;d++){

            if(ans%d==0)
            {

               while(ans%d==0&&ans)
                ans/=d;
                for(int x=d;x<=N;x+=d){
                    vis[x]=1;
                }
            }
        }
        if(ans>1){
            for(int x=ans;x<=N;x+=ans){
                    vis[x]=1;
                }
        }
    }
return 0;}

E
规律其实找出来了,就是 (i&-i)求和,看了别人的代码,长知识了,以后会求和了 开心
注意 1LL 不然会出错 !!!!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll n=0,k=0,ans=0;
    cin>>n;
    while(n>1){
        ans+=(n>>1)*(1ll<<k);
        n-=(n>>1);
        k++;
    }
    cout<<ans<<endl;
  
return 0;}

F

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 先从一个事件说起: 苹果要求收取微信对网络打赏(赞赏)抽取约三成提成,互联网引起了轩然大波,经过磋商苹果又取消了。...
    丁昆朋阅读 3,207评论 0 0
  • 咩思阅读 3,003评论 1 1
  • “嘟嘟嘟…” 我睁开了双眼,映入眼帘的是一片绿油油的菜花地,满是金黄色的。 我爬了起来,双手托着下巴,睁大眼睛看...
    四只猫的天下阅读 3,502评论 0 1
  • “反思是根据感受来分析问题,通过问题来找寻原因,通过原因来找到解决方案,本文本身就是我反思的一个实例。你最需要反思...
    venicate阅读 548评论 0 0

友情链接更多精彩内容