답안 #39558

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
39558 2018-01-16T13:50:50 Z igzi CEOI16_icc (CEOI16_icc) C++14
0 / 100
0 ms 2044 KB
#include <bits/stdc++.h>
#include "icc.h"
#define maxN 101

using namespace std;
vector <int> v[maxN];
vector <int> x;
int N;

void zameni(int m,int d){
    int i;
    for(i=0;i<m;i++){
        int r=i/d;
        if(r%2) swap(x[i],x[i+m]);
    }
}
pair <int,int> resi(int A,int B,int a[],int b[]){
    pair <int,int> ans;
    ans=make_pair(-1,-1);
    int i;
    int s[maxN];
    int l=0,d=A-1,m;
    while(d!=l){
        m=(l+d)/2;
        for(i=l;i<m;i++){
            s[i-l]=a[i];
        }
        if(query(B,m-l+1,b,s)) d=m;
        else l=m+1;
    }
    ans.first=l;
    l=0,d=B-1;
    while(d!=l){
        m=(l+d)/2;
        for(i=l;i<m;i++){
            s[i-l]=b[i];
        }
        if(query(A,m-l+1,a,s)) d=m;
        else l=m+1;
    }
    ans.second=l;
    return ans;
}
void spoj(int a,int b){
    int i;
    if(a>b) swap(a,b);
    for(i=0;i<v[b].size();i++){
        v[a].push_back(v[b][i]);
    }
    v[b].clear();
}
bool proveri(int A,int B,int a[],int b[]){
    for(int i=0;i<A;i++){
        if(a[i]<1 && a[i]>N) return false;
    }
    for(int i=0;i<B;i++){
        if(b[i]<1 && b[i]>N) return false;
    }
    return true;
}

void run(int n){
    N=n;
    int i,A=0,B=0,a[maxN],b[maxN],s;
    for(i=1;i<=N;i++){
        v[i].push_back(i);
    }
    while(n>1){
        s=n & -n;
        if(s=n) s/=2;
        for(i=1;i<=N;i++){
            if(!v[i].empty()) x.push_back(i);
        }
        for(i=x.size();i<2*s;i++){
            x.push_back(-1);
        }
        for(i=0;i<s;i++){
            if(x[i]>=1 && x[i]<=N) a[i]=x[i], A++;
        }
        for(i=s;i<x.size();i++){
            if(x[i]>=1 && x[i]<=N) b[i]=x[i], B++;
        }
        int m=s,d=m/2;
        while(d>0 && !proveri(A,B,a,b)){
            if(query(A,B,a,b)) break;
            zameni(m,d);
            A=0; B=0;
            for(i=0;i<s;i++){
            if(x[i]>=1 && x[i]<=N) a[i]=x[i], A++;
        }
        for(i=s;i<x.size();i++){
            if(x[i]>=1 && x[i]<=N) b[i]=x[i], B++;
        }
        d/=2;
        }
        x.clear();
        for(i=0;i<A;i++){
            if(a[i]>=1) x.push_back(a[i]);
        }
        A=x.size();
        for(i=0;i<A;i++){
            a[i]=x[i];
        }
        x.clear();
        for(i=0;i<B;i++){
            if(b[i]>=1) x.push_back(b[i]);
        }
        B=x.size();
        for(i=0;i<B;i++){
            b[i]=x[i];
        }
        x.clear();
        pair <int,int> r;
        r=make_pair(1,1);
        if(proveri(A,B,a,b)) r=resi(A,B,a,b);
        setRoad(r.first,r.second);
        spoj(r.first,r.second);
        n--;
    }
}

Compilation message

icc.cpp: In function 'void spoj(int, int)':
icc.cpp:47:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0;i<v[b].size();i++){
              ^
icc.cpp: In function 'void run(int)':
icc.cpp:70:15: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
         if(s=n) s/=2;
               ^
icc.cpp:80:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i=s;i<x.size();i++){
                  ^
icc.cpp:91:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i=s;i<x.size();i++){
                  ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 2044 KB Query cities not in range [1, n]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 2044 KB Query cities not in range [1, n]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 2044 KB Query cities not in range [1, n]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 2044 KB Query cities not in range [1, n]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 2044 KB Query cities not in range [1, n]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 2044 KB Query cities not in range [1, n]
2 Halted 0 ms 0 KB -