QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#669267 | #7719. Drawing Lines | ucup-team173 | TL | 0ms | 0kb | C++20 | 6.2kb | 2024-10-23 17:55:08 | 2024-10-23 17:55:13 |
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int lim = 1e4;
mt19937_64 rng(time(0));
ll get(ll l, ll r) {
return uniform_int_distribution<ll>(l, r)(rng);
}
int valid(int x) {
return -lim <= x && x <= lim;
}
// #define local114514
double dst(int a1, int b1, int a2, int b2) {
return sqrt((a1 - a2) * (a1 - a2) + (b1 - b2) * (b1 - b2));
}
int A=get(-lim,lim);
int B=get(-lim,lim);
int C=get(-lim,lim);
int D=get(-lim,lim);
double ask(int x1, int y1, int x2, int y2) {
#ifdef local114514
int X1 = A, Y1 = B;
int X2 = C, Y2 = D;
double d1 = dst(x1, y1, X1, Y1) + dst(x2, y2, X2, Y2);
double d2 = dst(x1, y1, X2, Y2) + dst(x2, y2, X1, Y1);
double s = min(d1, d2);
double res;
if (s == 0)
res = 100.;
else {
double sim = max(0., (40000 - s) / 40000);
res = (int)(sim * 1000) / 10.;
}
static int cnt = 0;
// assert(valid(x1)&&valid(x2)&&valid(y1)&&valid(y2));
cerr << ++cnt << "th qry\n";
cerr << x1 << " " << y1 << " " << x2 << " " << y2 << " " << res << "\n";
if(res==100.)cerr<<"holy jesus you made it\n";
#endif
#ifndef local114514
cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
double res;
cin >> res;
if(res==100.)exit(0);
#endif
return res;
}
void make_valid(int& x) {
x = max(x, -lim);
x = min(x, lim);
}
void solve() {
// double t=20000;
// cerr<<ask(99,99,99,99)<<"\n";
// cerr<<ask(50,99,99,99)<<"\n";
// cerr<<ask(50,0,-50,0)<<"\n";
// return;
int x1 = get(-lim, lim), y1 = get(-lim, lim);
int x2 = get(-lim, lim), y2 = get(-lim, lim);
int x[4] = {x1, y1, x2, y2};
double old = ask(x1, y1, x2, y2);
// int timer=24000;
// int move=0;
// while(timer--){
// move^=1;
// int range=(int)max(1.,t);
// cerr<<range<<" range\n";
// int dx=get(-range,range);
// int dy=get(-range,range);
// if(move){
// dx+=x1,make_valid(dx);
// dy+=y1,make_valid(dy);
// double newans=ask(dx,dy,x2,y2);
// cerr<<dx<<" "<<dy<<" "<<x2<<" "<<y2<<" "<<newans<<"\n";
// if(newans==100.)return;
// double delta=old-newans;
// if(exp(-delta/t)>get(1,1e9)/1e9){
// old=newans;
// x1=dx,y1=dy;
// }
// }
// else{
// dx+=x2,make_valid(dx);
// dy+=y2,make_valid(dy);
// double newans=ask(x1,y1,dx,dy);
// cerr<<x1<<" "<<x2<<" "<<dx<<" "<<dy<<" "<<newans<<"\n";
// if(newans==100.)return;
// double delta=old-newans;
// if(exp(-delta/t)>get(1,1e9)/1e9){
// old=newans;
// x2=dx,y2=dy;
// }
// }
// t*=0.9993;
// }
// cerr<<"fuck, GG\n";
int change = 0;
while (1) {
int l = -lim, r = lim;
int oldx = x[change];
while (r - l >= 20) {
int lm = (l + l + r) / 3., rm = (l + r + r) / 3.;
x[change] = lm;
double vl = ask(x[0], x[1], x[2], x[3]);
if (vl == 100.) exit(0);
x[change] = rm;
double vr = ask(x[0], x[1], x[2], x[3]);
if (vr == 100.) exit(0);
if (vl > vr)
r = rm;
else if (vl < vr)
l = lm;
else if (get(0, 1e9) > 5e8)
l = lm;
else
r = rm;
}
for (int i = l; i <= r; i++) {
x[change] = i;
double v = ask(x[0], x[1], x[2], x[3]);
if (v == 100.) exit(0);
if (v > old || (v == old && get(0, 1e9) > 5e8)) {
oldx = i;
old = v;
}
}
x[change] = oldx;
// cerr << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << " " << old << " fuck\n";
if (old == 99.9) break;
change = (change + 1) % 4;
}
// cerr<<"ok lets go\n";
while (1) {
vector<int> choose(4);
iota(choose.begin(), choose.end(), 0);
shuffle(choose.begin(), choose.end(), rng);
int t = choose[0], s = choose[1];
int tmp = x[s];
double v = ask(x[0], x[1], x[2], x[3]);
if(v==100.)exit(0);
// assert(v == 99.9);
auto checkfor = [&](int xs) {
int oldt = x[t];
int olds = x[s];
x[s] = xs;
double v = ask(x[0], x[1], x[2], x[3]);
if (v != 99.9) return 0;
int l = 1, r = 1;
while (valid(oldt - l)) {
x[t] = oldt - l;
double v = ask(x[0], x[1], x[2], x[3]);
if (v == 100.) exit(0);
if (v != 99.9) break;
l++;
}
while (valid(oldt + r)) {
x[t] = oldt + r;
double v = ask(x[0], x[1], x[2], x[3]);
if (v == 100.) exit(0);
if (v != 99.9) break;
r++;
}
x[t] = oldt;
x[s] = olds;
return r + l - 1;
};
auto getxs = [&](int delta) {
int tmp = x[s] + delta;
make_valid(tmp);
return checkfor(tmp);
};
int mid = getxs(0);
int o = 1, L, R;
while (1) {
L = getxs(-o), R = getxs(o);
// cout<<mid<<" "<<L<<" "<<R<<"\n";
// cerr<<"??"<<" "<<o<<"\n";
if (L == R && L == mid) {
o++;
continue;
}
break;
}
// cerr<<"whatlaksjdfla\n";
if (mid >= L && mid >= R) {
;
} else {
if (L > mid)
x[s]--, make_valid(x[s]);
else if (R > mid)
x[s]++, make_valid(x[s]);
// else
// assert(0);
}
// cerr << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << " fuck\n";
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
66.9 65.9 66.0 67.5 63.2 67.7 66.7 67.4 67.7 67.7 67.5 67.7 67.7 67.6 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 67.7 78.3 78.3 72.7 83.8 80.1 85.6 85.0 83.2 83.4 ...
output:
-2241 -7548 -4217 -3340 -3333 -7548 -4217 -3340 3333 -7548 -4217 -3340 1111 -7548 -4217 -3340 5555 -7548 -4217 -3340 -370 -7548 -4217 -3340 2592 -7548 -4217 -3340 -1358 -7548 -4217 -3340 617 -7548 -4217 -3340 -41 -7548 -4217 -3340 1275 -7548 -4217 -3340 -480 -7548 -4217 -3340 397 -7548 -4217 -3340 -...