답안 #231089

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
231089 2020-05-12T16:25:58 Z nicolaalexandra CEOI16_icc (CEOI16_icc) C++14
90 / 100
177 ms 636 KB
/// sincer nu inteleg dc sunt asa proasta
#include <bits/stdc++.h>
#include "icc.h"
#define DIM 200
using namespace std;

int n;
int v[DIM],t[DIM],aux[DIM],a[DIM],b[DIM];

/*int query (int n, int m, int a[], int b[]){
    int ans;
    cout<<n<<" ";
    for (int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    cout<<m<<" ";
    for (int i=0;i<m;i++)
        cout<<b[i]<<" ";
    cout<<endl;
    cin>>ans;
    return ans;
}
void setRoad (int x, int y){
    cout<<x<<" "<<y<<endl;
}*/

int get_rad (int x){
    while (t[x] > 0)
        x = t[x];
    return x;
}
void _union (int x, int y){
    int radx = get_rad (x), rady = get_rad (y);

    if (t[radx] < t[rady]){
        t[radx] += t[rady];
        t[rady] = radx;
    } else {
        t[rady] += t[radx];
        t[radx] = rady;
    }

}

void run (int n){
    int k,k2,el,i,x,y;
    for (i=1;i<=n;i++)
        t[i] = -1;
    for (int pas=1;pas<n;pas++){
        /// impart componentele conexe in doua multimi

        for (int bit=6;bit>=0;bit--){
            k = 0, k2 = 0;

            for (i=1;i<=n;i++){
                int val = get_rad(i);
                if (val&(1<<bit))
                    a[k++] = i;
                else b[k2++] = i;
            }

            if (!k || !k2)
                continue;

            if (bit == 0 || query(k,k2,a,b)){ /// am gasit cele doua multimi

                while (k > 1){
                    int mid = k/2;

                    if (query(mid,k2,a,b))
                        k = mid;
                    else {
                        for (int i=mid;i<k;i++)
                            a[i-mid] = a[i];
                        k -= mid;
                    }
                }
                x = a[0];


                while (k2 > 1){
                    int mid = k2/2;

                    if (query(k,mid,a,b))
                        k2 = mid;
                    else {
                        for (int i=mid;i<k2;i++)
                            b[i-mid] = b[i];
                        k2 -= mid;
                    }
                }
                y = b[0];

                setRoad(x,y);

                _union (x,y);

                break;
            }
        }
    }
}


Compilation message

icc.cpp: In function 'void run(int)':
icc.cpp:46:14: warning: unused variable 'el' [-Wunused-variable]
     int k,k2,el,i,x,y;
              ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 512 KB Ok! 104 queries used.
2 Correct 12 ms 512 KB Ok! 102 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 512 KB Ok! 550 queries used.
2 Correct 57 ms 512 KB Ok! 665 queries used.
3 Correct 58 ms 512 KB Ok! 666 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 136 ms 512 KB Ok! 1395 queries used.
2 Correct 168 ms 512 KB Ok! 1651 queries used.
3 Correct 126 ms 560 KB Ok! 1325 queries used.
4 Correct 164 ms 636 KB Ok! 1592 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 142 ms 512 KB Ok! 1381 queries used.
2 Correct 147 ms 632 KB Ok! 1426 queries used.
3 Correct 165 ms 560 KB Ok! 1635 queries used.
4 Correct 143 ms 564 KB Ok! 1448 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 512 KB Ok! 1637 queries used.
2 Correct 166 ms 560 KB Ok! 1650 queries used.
3 Correct 168 ms 632 KB Ok! 1651 queries used.
4 Correct 167 ms 512 KB Ok! 1652 queries used.
5 Correct 143 ms 512 KB Ok! 1499 queries used.
6 Correct 176 ms 512 KB Ok! 1639 queries used.
# 결과 실행 시간 메모리 Grader output
1 Incorrect 177 ms 512 KB Too many queries! 1670 out of 1625
2 Halted 0 ms 0 KB -