Codeforces 라운드 # 618 (사업부. 2) (카운트 비트 연산)

C. 아누는 기능을 가지고있다

아누는 자신의 기능을 만들었다 FF : F (X, Y) = (X | Y) -yf (X, Y) = (X | Y) -y || 나타낸다  비트 OR 동작 . (| 6-11) -6 = 15-6 = 9 층 (11,6) = 예, F (11,6) = 옵션 (11 | 6) -6 = 15-6 = 9. 어떤 비음 수가 XX 및 F (x, y)는 F의 증가한 값 (X, Y)는 또한 음이 아닌 것을 입증 할 수있다.

그녀는이 기능에 대한 자세한 정보 조회 싶습니다 자신에 대한 여러 문제를 만들었습니다. 그러나 그녀는 그들 모두를 해결할 수없는 당신의 도움이 필요합니다. 다음은 이러한 문제 중 하나입니다.

배열의 값 [A1, A2, ..., [A1, A2, ...,]는 F (F (... F (F (A1, A2), (A3)로서 정의된다), ... AN-1) F) (F (... F (F (A1, A2), (A3)), ... AN-1)가) () 정보를 참조. 당신은 반드시 구별하지 요소와 배열을 제공됩니다. 어떻게 요소는 배열의 값이 가능한 최대가되도록 순서를 변경해야합니까?

입력

첫 번째 줄은 하나의 정수 윈 (1≤n≤1051≤n≤105)가 포함되어 있습니다.

두번째 라인 NN 정수 (A1), (A2)를 포함 ... ana1, A2, ..., (0≤ai≤1090≤ai≤109). 배열의 요소는 다를 수 보장되지 않습니다.

산출

NN 정수 산출, 최대치와 배열의 재정렬. 복수 응답이있는 경우, 하나를 인쇄 할 수 있습니다.

입력

4
4 0 11 6

산출

11 6 4 0

입력

1
(13)

산출

(13) 

노트

첫 번째 테스트 케이스에있어서, 상기 어레이의 값 [11,6,4,0는 [11,6,4,0]가 F 인 (F가 (F (11,6), 4), 0) = F (F (9 4), 0) = F (9,0) = 9F (F (F (11,6), 4), 0) = F (F (9,4), 0) = F (9,0) = 9.

[11,4,0,6] 11,4,0,6는 또한 유효한 응답이다.

 

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <functional>
//#include <unordered_map>
#include <map>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <utility>
#include <cstring>
//#include <multimap>
//#include <multiset>
using namespace std;
#define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ls now<<1,l,mid
#define rs now<<1|1,mid+1,r
#define lc now<<1
#define rc now<<1|1
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
const ll mod = 1000000007 ;
const int mxn = 2e5+10 ;
ll prime[mxn], isprime[mxn],bit[mxn],a[mxn],dp[11][1000+10];
int ch[27];
ll n,m,t,u,v,w,l,r,k,x;
string str ;
int main()
{
    TLE;
    while(cin>>n)
    {
        vector < vector<int> > vc(32,vector<int>()) ;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
            int x = a[i], pos = 0 ;
            while(x)
            {
                if(x%2)
                    vc[pos].pb(i);
                x/=2;
                pos++;
            }
        }
        int ans = -1 ;
        for(int i=vc.size()-1; i>=0; i--)
            if(vc[i].size()==1)
            {
                ans = vc[i][0];
                break;
            }
        if(ans!=-1)
            swap(a[ans],a[1]);
        for(int i=1; i<=n; i++)
            cout<<a[i]<<" ";
        cout<<endl;

    }
    return 0 ;
}

 

게시 94 개 원래 기사 · 원 찬양 29 · 전망 8545

추천

출처blog.csdn.net/m0_43382549/article/details/104244234