# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
50942 | 2018-06-15T06:57:54 Z | spencercompton | CEOI16_icc (CEOI16_icc) | C++17 | 0 ms | 0 KB |
// #include "icc.h" #include <bits/stdc++.h> using namespace std; // int query(int a, int b, int c[], int d[]){ // cout << "A " << endl; // for(int i = 0; i<a; i++){ // cout << c[i] << " "; // } // cout << endl; // for(int i = 0; i<b; i++){ // cout << d[i] << " "; // } // cout << endl; // int x; // cin >> x; // return x; // } // void setRoad(int a, int b){ // cout << "! " << a << " " << b << endl; // } int n; void findRoad(){ int a[n/2]; int b[n-n/2]; int ar[n]; for(int i = 0; i<n; i++){ ar[i] = i+1; } while(true){ for(int i = 0; i+1<n; i++){ int rem = n-i-1; int ra = i + (rand()%rem) + 1; swap(ar[i],ar[ra]); } for(int i = 0; i<n; i++){ if(i<n/2){ a[i] = ar[i]; } else{ b[i-n/2] = ar[i]; } } if(query(n/2,n-n/2,a,b)){ int low1 = 0; int high1 = n/2-1; while(low1<high1){ int mid = (low1+high1)/2; int ta[mid+1]; for(int i = 0; i<=mid; i++){ ta[i] = a[i]; } if(query(mid+1,n-n/2,ta,b)){ high1 = mid; } else{ low1 = mid+1; } } int low2 = 0; int high2 = n-n/2-1; while(low2<high2){ int mid = (low2+high2)/2; int tb[mid+1]; for(int i = 0; i<=mid; i++){ tb[i] = b[i]; } if(query(n/2,mid+1,a,tb)){ high2 = mid; } else{ low2 = mid+1; } } int ans1 = a[low1]; int ans2 = b[low2]; if(ans1>ans2){ swap(ans1,ans2); } setRoad(ans1,ans2); break; } } } void run(int N){ n = N; for(int n=1; n<N; n++) findRoad(); } int main(){ run(4); }