Codeforces Round #383 (Div. 2) B, C, D

Codeforces 742B Arpa’s obvious problem and Mehrdad’s terrible solution(map水题)
一直打算每一个位来考虑。。
结果居然一个map,什么的遍历就可以了。。

题意: 给出含有n个数的数组a[]。 问在数组中有多少对 ai^aj == x ?

自己写的又不知道为什么挂了,贴别人的。

    #include <cstdio>  
    #include <cstring>
    #include <map>
    #include <algorithm>
    using namespace std;
    const int maxn = 1e5+10;
    typedef long long LL;
    LL a[maxn];
    int main()
    {
        LL n,x;
        while(scanf("%lld%lld",&n,&x)!=EOF)
        {
            map<LL,LL> mp;
            for(int i=0;i<n;++i)
            {
                scanf("%lld",&a[i]);
                mp[a[i]]++;
            }
            LL ans=0;
            for(int i=0;i<n;++i)
            {
                LL cnt=x^a[i];
                if(cnt!=a[i])
                    ans+=mp[cnt];
                else
                    ans+=mp[cnt]-1;
            }
            printf("%lld\n",ans/2);
        }
        return 0;
    }

——————————————————————————————————————————————
参考http://www.cnblogs.com/huangzhihao/p/6141729.html

C. Arpa’s loud Owf and Mehrdad’s evil plan

题意:
有n(1<=n<=100)个人,编号1到n,每个人有一个数字crush_i(1<=crush_i<=n),有一个游戏规则如下,假设从编号为x的人开始一轮游戏,他对着编号为crush_x的人喊:“Owww…wwf。”(w重复t次),如果t大于1的话,编号为crush_x的人对着编号为crush_crush_x的人喊:“Owwww…wwwf。”(w重复t-1次)。这样一直持续下去,直到有个人收到“Owf”(w只重复1次),那么这个人就是这一轮游戏的Joon-Joon。要求解最小的t(t大于等于1),使得对于每个人x,他的Joon-Joon为y的话,那么y的Joon-Joon也为x。如果找不到这样的t,就输出-1。注意:可以自己朝自己喊话。

没有分析到长度》2的时候的t可以减半。。。

int in[N];
int cnt;
int vis[N];
int n;
int len[N];

int a[N];

LL gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
LL lcm(int a,int b){
    return a/gcd(a,b)*b;
}
void dfs(int x,int l){
    vis[x]=1;
    len[cnt]=l;
    if(!vis[a[x]])dfs(a[x],l+1);
}
int main(){
    sf("%d",&n);
    rep(i,1,n)sf("%d",&a[i]),in[a[i]]++;
    rep(i,1,n){
        if(in[i]!=1){puts("-1");return 0;}
    }
    cnt=0;
    rep(i,1,n){
        if(!vis[i])++cnt,dfs(i,1);
    }
    int ans=1;
    for(int i=1;i<=cnt;++i){
        //pf("%d\n",len[i]);
        if(len[i]<=2)continue;
        else{
            if(len[i]%2==0){ ans=lcm(ans,len[i]/2); }
            else{ ans=lcm(ans,len[i]); }
        }
        //pf("%d\n",ans);
    }
    pf("%d\n",ans);
}

————————————————————————————————————————
Codeforces724D. Arpa’s weak amphitheater and Mehrdad’s valuable Hoses(分组背包)

题意:
一共有n(1<=n<=1000)个hos,每个hos有对应的重量(1<=wi<=1000)和颜值(1<=bi<=10^6),其中有m(0<=m<=min(n*(n-1)/2, 10^5))对朋友,朋友关系具有传递性,现打算邀请其中的一些hos来参加party,对于同一只友谊的小船上的hos,如果打算邀请他们的话,要么只邀请一个hos,要么这艘船上所有的hos都要邀请,但是party上的重量总和w(1<=w<=1000)有限,保证邀请的hos的重量之和不超过w的前提下,使得他们的颜值的总和尽量大。求这个最优的颜值总和的数值。jk

int n,m,w;

int vis[N];
int we[N],b[N];
int fst[N],nxt[N<<1],vv[N<<1],e;

void add(int u,int v){
    nxt[e]=fst[u];vv[e]=v;fst[u]=e++;
}
int tol[N],bea[N];
vector<int>has[N];
int dp[N];
int cnt;
void dfs(int u){
    vis[u]=1;
    tol[cnt]+=we[u];
    bea[cnt]+=b[u];
    has[cnt].push_back(u);
    for(int i=fst[u];~i;i=nxt[i]){
        int v=vv[i];
        if(vis[v])continue;
        dfs(v);
    }
}
int main(){
    //ree
    mem(fst,-1);e=0;
    sf("%d%d%d",&n,&m,&w);
    rep(i,1,n)sf("%d",&we[i]);
    rep(i,1,n)sf("%d",&b[i]);
    rep(i,1,m){
        int u,v;sf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    cnt=0;
    rep(i,1,n){ if(!vis[i])++cnt,dfs(i); }
    for(int i=1;i<=cnt;++i){
        int len=has[i].size();
        for(int k=w;k>=0;--k){
            for(int j=0;j<len;++j){
                int v=has[i][j];
                if(k>=we[v]){
                    dp[k]=max(dp[k],dp[k-we[v]]+b[v]);
                }
            }
            if(k>=tol[i])dp[k]=max(dp[k],dp[k-tol[i]]+bea[i]);//这个要放在这里。。
        }
    }
    int ans=0;
    for(int i=1;i<=w;++i){
        ans=max(ans,dp[i]);
    }
    pf("%d\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值