2014 网选 5014 Number Sequence(异或)

/*
    题意:a, b两个序列,规定由[0, n]区间的数!
    求 a[i] ^ b[i] 的和最大! 

    思路:如果数字 n的二进制有x位, 那么一定存在一个数字m,使得n^m的所有二进制位
    都是1,也就是由x位1!这样下去的到的值就是最大值! 

*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;

int b[N], vis[N];

int pos[N];

int main(){
    int n;
    while(scanf("%d", &n)!=EOF){
        int x, y;
        for(int i=0; i<=n; ++i){
            scanf("%d", &x);
            pos[x]=i;
        }
        memset(vis, 0, sizeof(vis));
        long long sum=0;
        for(int i=n; i>=0; --i){
             y=x=i;
             if(vis[x]) continue;
             int tmp=1;
             while(y){
                 x^=tmp;
                 tmp<<=1;
                 y>>=1;
            }
            vis[x]=vis[i]=1;
            sum+=2*(x^i);
            b[pos[i]]=x;
            b[pos[x]]=i;
        }
        //printf("%lld\n", sum);
        cout<<sum<<endl;
        printf("%d", b[0]);
        for(int i=1; i<=n; ++i)
            printf(" %d", b[i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-09-25 02:12:34

2014 网选 5014 Number Sequence(异或)的相关文章

2014 网选 5011 Game(Nim游戏,数学题)

/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace std; int main(){ int n, x, s; while(cin>>n){ s=0; while(n--){ cin>>x; s^=x; } if(s) cout<<"Win";//不是偶数 else cout<<"

2014 网选 5024 Wang Xifeng&#039;s Little Plot

题意:从任意一个任意一个可走的点开始找一个最长的路,这条路如果有转弯的话,那么必须是 90度,或者没有转弯! 思路: 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 !step[i][j][k] 表示的是(i,j)沿着k方向一直走到头或者转弯时的最长步数!最后枚举每一个可走点转弯为90度的路径,找到最长的长度! step[i][j][k1] + step[i][j][k2] 就是 (i, j)这个点 k1 和 k2方向构成90度! #include<iostream> #i

2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k 种, 每一种有多个! 只要求找到每一种的其中一个就可以! 找钥匙的顺序按照 第1种, 第2种, 第3种 ....第k种! 找钥匙的时间是一步, 走到相邻空地的时间是一步, 打蛇的时间就是两步! 求找到师傅的最少步数! 这里说一下 state[N][N][10][35]表示的含义: ->state[

2014 网选 上海赛区 hdu 5047 Sawtooth

题意:求n个'M'型的折线将一个平面分成的最多的面数!思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1也就是f(n) = (n*n + n +2)/2对于一个'M'型的折线呢?它有四条线,但是由于三个顶点的关系导致划分的平面的数目减少了9个!所以有递推公式 f(n) = (m*m + m + 2)/2 - 9*n; m = 4*n 最后 f(n) = (8*n+1)*(n-1)+2) 由于 n<=1e12 , 所以回报 long long!那么对于大于1e9的

2014 网选 广州赛区 hdu 5023 A Corrupt Mayor&#039;s Performance Art

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define N 1000005 using namespace std; int c[35]; int tree[N*4];//正值表示该节点所管理的区间的颜色是纯色,-1表示的是非纯色 int n, m; void buildT(int ld, int rd, int p){ if(ld <= rd)

2014 网选 5012 Dice(bfs模板)

/* 题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同! 问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同! 思路:很直白的bfs,将每一种状态对应一个数字,保证这种状态不会重新加入队列中! */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using

UVa 10706:Number Sequence

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=1647 原题: A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of n

UVa 10706 / POJ 1019 Number Sequence:打表及O(1)算法

10706 - Number Sequence Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=19&page=show_problem&problem=1647 http://poj.org/problem?id=1019 Description A single positive integer i is giv

acm-杭电ACM OJ 1005 Number Sequence

问题描述 杭电ACM OJ 1005 Number Sequence A number sequence is defined as follows: f(1) = 1 f(2) = 1 f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A B and n you are to calculate the value of f(n). 超过49个数之后一定会出现和之前的数组合相同的情况,这个我可以了解,但是 为什么最多经过49个数之后一定会出现周