# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
713420 |
2023-03-22T01:41:46 Z |
lam |
ICC (CEOI16_icc) |
C++14 |
|
474 ms |
508 KB |
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
typedef pair<int,int> ii;
#define ff first
#define ss second
const int maxn = 110;
vector<vector<int>> chan[maxn],le[maxn];
int n,m;
int p[maxn],s[maxn];
int get(int x)
{
return p[x]=(p[x]==x)?x:get(p[x]);
}
void hop(int x, int y)
{
x=get(x); y=get(y); if (x==y) return;
if (s[x]>s[y]) swap(x,y);
s[y]+=s[x];
p[x]=y;
}
bool query2(int sz1, int sz2, vector <int> tmp1, vector <int> tmp2)
{
int a[110], b[110];
for (int i=0; i<sz1; i++) a[i] = tmp1[i];
for (int i=0; i<sz2; i++) b[i] = tmp2[i];
return query(sz1,sz2,a,b);
}
void dnc(int lx, int rx, vector <int> tmp, int level)
{
if (lx==rx) return;
random_shuffle(tmp.begin(),tmp.end());
int mid=(lx+rx)/2;
vector <int> tmp_chan, tmp_le;
for (int i=lx; i<=rx; i++) if (i<=mid) tmp_le.push_back(tmp[i-lx]);
else tmp_chan.push_back(tmp[i-lx]);
le[level].push_back(tmp_le); chan[level].push_back(tmp_chan);
dnc(lx,mid,tmp_le,level+1);
dnc(mid+1,rx,tmp_chan,level+1);
}
ii trace(vector <int> tmp_le, vector <int> tmp_chan)
{
if (tmp_chan.size() > tmp_le.size()) swap(tmp_le, tmp_chan);
if (tmp_le.size()==tmp_chan.size()&&tmp_le.size()==1)
{
return {tmp_le[0], tmp_chan[0]};
}
int mid = (tmp_le.size() - 1)/2;
random_shuffle(tmp_le.begin(),tmp_le.end());
vector <int> tmp_le1, tmp_le2;
for (int i=0; i<tmp_le.size(); i++) if (i<=mid) tmp_le1.push_back(tmp_le[i]);
else tmp_le2.push_back(tmp_le[i]);
bool has = query2(tmp_le1.size(),tmp_chan.size(),tmp_le1,tmp_chan);
if (has) return trace(tmp_le1,tmp_chan);
else return trace(tmp_le2,tmp_chan);
}
void run(int N)
{
n=N;
for (int i=1; i<=n; i++) p[i]=i, s[i]=1;
for (int it=1; it<=n-1; it++)
{
vector <int> tmp;
for (int i=1; i<=n; i++) if (p[i]==i) tmp.push_back(i), chan[i].clear(), le[i].clear();
m=tmp.size();
dnc(1,m,tmp,1);
int level = 1;
while (true)
{
vector <int> tmp_le, tmp_chan;
for (vector <int> i:le[level]) for (int j:i) tmp_le.push_back(j);
for (vector <int> i:chan[level]) for (int j:i) tmp_chan.push_back(j);
bool has = query2(tmp_le.size(),tmp_chan.size(),tmp_le,tmp_chan);
if (has==1) break;
}
int l=0; int r=le[level].size()-1;
int ans=-1;
while (l<=r)
{
int mid=(l+r)/2;
vector <int> tmp_le, tmp_chan;
for (int i=mid; i<le[level].size(); i++)
for (int j:le[level][i]) tmp_le.push_back(j);
for (int i=mid; i<chan[level].size(); i++)
for (int j:chan[level][i]) tmp_chan.push_back(j);
bool has = query2(tmp_le.size(),tmp_chan.size(),tmp_le,tmp_chan);
if (has)
{
ans = mid;
l=mid+1;
}
else r=mid-1;
}
ii canh = trace(le[level][ans],chan[level][ans]);
setRoad(canh.ff, canh.ss);
hop(canh.ff,canh.ss);
}
}
Compilation message
icc.cpp: In function 'ii trace(std::vector<int>, std::vector<int>)':
icc.cpp:52:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
52 | for (int i=0; i<tmp_le.size(); i++) if (i<=mid) tmp_le1.push_back(tmp_le[i]);
| ~^~~~~~~~~~~~~~
icc.cpp: In function 'void run(int)':
icc.cpp:84:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
84 | for (int i=mid; i<le[level].size(); i++)
| ~^~~~~~~~~~~~~~~~~
icc.cpp:86:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
86 | for (int i=mid; i<chan[level].size(); i++)
| ~^~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
120 ms |
468 KB |
Number of queries more than 3000 out of 1500 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
312 ms |
500 KB |
Number of queries more than 5000 out of 2500 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
474 ms |
504 KB |
Number of queries more than 4500 out of 2250 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
431 ms |
504 KB |
Number of queries more than 4000 out of 2000 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
375 ms |
500 KB |
Number of queries more than 3550 out of 1775 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
343 ms |
508 KB |
Number of queries more than 3250 out of 1625 |
2 |
Halted |
0 ms |
0 KB |
- |