zoukankan      html  css  js  c++  java
  • codeforces 959E

    Mahmoud and Ehab and the xor-MST

    题意:给一个n个点的完全图,每条边的边权为2点的编号异或值(编号0~n-1),求最小生成树

    思路:打表找规律

    AC代码:

    #include "iostream"
    #include "iomanip"
    #include "string.h"
    #include "stack"
    #include "queue"
    #include "string"
    #include "vector"
    #include "set"
    #include "map"
    #include "algorithm"
    #include "stdio.h"
    #include "math.h"
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
    #define mem(a,x) memset(a,x,sizeof(a))
    #define step(x) fixed<< setprecision(x)<<
    #define mp(x,y) make_pair(x,y)
    #define pb(x) push_back(x)
    #define ll long long
    #define endl ("
    ")
    #define ft first
    #define sd second
    #define lrt (rt<<1)
    #define rrt (rt<<1|1)
    using namespace std;
    const ll mod=1e9+7;
    const ll INF = 1e18+1LL;
    const int inf = 1e9+1e8;
    const double PI=acos(-1.0);
    const int N=1e5+100;
    
    ll b[10] = {0,1,3,4,8,9,11,12};
    ll f(ll x){
        if(x < 6) return b[x];
        if(x&1) return 2*f(x/2)+x/2+1;
        else return 2*f(x/2)+x/2;
    }
    int main() {
        ll n; scanf("%lld", &n);
        printf("%lld", f(n-1));
        return 0;
    }

    打表代码:

    #include "iostream"
    #include "iomanip"
    #include "string.h"
    #include "stack"
    #include "queue"
    #include "string"
    #include "vector"
    #include "set"
    #include "map"
    #include "algorithm"
    #include "stdio.h"
    #include "math.h"
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
    #define mem(a,x) memset(a,x,sizeof(a))
    #define step(x) fixed<< setprecision(x)<<
    #define mp(x,y) make_pair(x,y)
    #define pb(x) push_back(x)
    #define ll long long
    #define endl ("
    ")
    #define ft first
    #define sd second
    #define lrt (rt<<1)
    #define rrt (rt<<1|1)
    using namespace std;
    const ll mod=1e9+7;
    const ll INF = 1e18+1LL;
    const int inf = 1e9+1e8;
    const double PI=acos(-1.0);
    const int N=1e5+100;
    
    struct Edge {
        int u, v;
        int w;
        bool friend operator< (Edge a, Edge b) {
            return a.w<b.w;
        }
    };
    Edge e[1000005];
    int n, cnt, fa[1000005];
    
    int finds(int x) {
        return fa[x]=(fa[x]==x?x:finds(fa[x]));
    }
    
    void unions(int x, int y) {
        int fx = finds(x), fy = finds(y);
        fa[fx] = fy;
    }
    
    int kruscal() {
        sort(e+1, e+1+cnt);
        int k = 0, ret = 0;
        for(int t=1; t<=cnt; ++t) {
             int fu = finds(e[t].u), fv = finds(e[t].v);
             if(fu != fv) { //cout<<e[t].u<<" uu "<<e[t].v<<endl;
                unions(fu, fv);
                ret += e[t].w;
             }
        }
        return ret;
    }
    
    int main() {
    
        for(n=1; n<100; ++n) {//if(n!=4) continue;
            cnt = 0;
            mem(e, 0);
            for(int i=0; i<n; ++i) {
                for(int j=i+1; j<n; ++j) {
                    e[++cnt].u = i;
                    e[cnt].v = j;
                    e[cnt].w = i^j;
                }
            }
            for(int i=0; i<=n; ++i) fa[i] = i;
            printf("%d %d
    ", n, kruscal());
        }
        return 0;
    }
  • 相关阅读:
    JS中的钩子(hook)机制与实现
    Java 之 注解的定义
    Java 网络编程案例:使用 MulticastSocket 实现多点广播
    Java 基于 UDP 协议的网络编程
    Java 网络编程案例四:多个客户端群聊
    Java 网络编程案例三:多个客户端上传文件
    Java 网络编程案例二:多台客户端与服务器之间的多次通信
    Java 网络编程案例一:一台客户端与服务器单次通信
    Java 之 网络常用API
    Java 之 网络编程基础知识
  • 原文地址:https://www.cnblogs.com/max88888888/p/8868020.html
Copyright © 2011-2022 走看看