QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#202329#5155. Faster Than LightRd_rainydaysWA 96ms20628kbC++203.3kb2023-10-05 22:16:202023-10-05 22:16:21

Judging History

你现在查看的是最新测评结果

  • [2023-10-05 22:16:21]
  • 评测
  • 测评结果:WA
  • 用时:96ms
  • 内存:20628kb
  • [2023-10-05 22:16:20]
  • 提交

answer

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()
using ll = long long;
const int N = 2e5 + 5;

struct Point {
  ll x, y;
  Point(ll x = 0, ll y = 0) : x(x), y(y) { }
  bool operator < (const Point& t) const {
    return t.x == x ? y < t.y : x < t.x;
  }
  bool operator == (const Point& t) const {
    return x == t.x && y == t.y;
  }
  Point operator + (const Point& t) const {
    return Point(x + t.x, y + t.y);
  }
  Point operator - (const Point& t) const {
    return Point(x - t.x, y - t.y);
  }
  ll norm() {
    return x * x + y * y;
  }
  void log() {
    printf("(%lld, %lld)\n", x, y);
  }
};

ll dot(Point a, Point b) {
  return a.x * b.x + a.y * b.y;
}
ll cross(Point a, Point b) {
  return a.x * b.y - a.y * b.x;
}

int n;
Point p[N], q[N];

const int COUNTER_CLOCKWISE = 1;
const int CLOCKWISE = -1;
const int ONLINE_BACK = 2;
const int ONLINE_FRONT = -2;
const int ON_SEGMENT = 0;
int ccw(Point p0, Point p1 /*seg*/, Point p2) {
  Point a = p1 - p0;
  Point b = p2 - p0;
  if (cross(a, b) > 0) return COUNTER_CLOCKWISE;
  if (cross(a, b) < 0) return CLOCKWISE;
  if (dot(a, b) < 0) return ONLINE_BACK;
  if (a.norm() < b.norm()) return ONLINE_FRONT;
  return ON_SEGMENT;
}

using polygon = std::vector<Point>;
polygon convex(Point* p, int n) {
  polygon up, lo;

  std::sort(p + 1, p + 1 + n);
  up.push_back(p[1]), up.push_back(p[2]);
  lo.push_back(p[n]), lo.push_back(p[n - 1]);

  for (int i = 3; i <= n; i++) {
    while ((int)up.size() >= 2) {
      Point b1 = up.back(), b2 = *++up.rbegin();
      int st = ccw(b2, b1, p[i]);
      if (st <= 0) break;
      up.pop_back();
    }
    up.push_back(p[i]);
  }

  for (int i = n - 2; i; --i) {
    while ((int)lo.size() >= 2) {
      Point b1 = lo.back(), b2 = *++lo.rbegin();
      int st = ccw(b2, b1, p[i]);
      if (st <= 0) break;
      lo.pop_back();
    }
    lo.push_back(p[i]);
  }

  polygon res = std::move(lo);
  for (int i = 1; i + 1 < (int)up.size(); i++)
    res.push_back(up[i]);
  std::reverse(all(res));
  return res;
}

// p must be counter-clockwise
bool contains(const polygon &p, Point q) {
  int n = p.size();
  int lb = 0, ub = n - 1;
  if (p[0] == q) return 0;
  while (lb <= ub) {
    int mid = (lb + ub) / 2;
    int nxt = (mid + 1) % n;
    ll u = cross(p[mid] - p[0], q - p[0]);
    ll v = cross(p[nxt] - p[0], q - p[0]);

    if (u >= 0 && v <= 0) {
      if (u == 0 && mid - 1 == 0) return 0;
      if (v == 0 && nxt + 1 == n) return 0;
      return cross(p[nxt] - p[mid], q - p[mid]) > 0;
    }

    if (u < 0) ub = mid - 1;
    else lb = mid + 1;
  }
  return false;
}

bool test() {
  auto cp = convex(p, n);
  auto cq = convex(q, n);
  
  bool flag = 1;
  for (auto u : cp) {
    if (!flag) break;
    flag &= !contains(cq, u);
  }
  for (auto u : cq) {
    if (!flag) break;
    flag &= !contains(cp, u);
  }
  return flag;
}

int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%lld%lld%lld%lld", &p[i].x, &p[i].y, &q[i].x, &q[i].y);

  if (n <= 2) {
    puts("possible");
    return 0;
  }
  
  if (test()) {
    puts("possible");
    return 0;
  }
  for (int i = 1; i <= n; i++)
    std::swap(p[i].x, q[i].x);
  if (test()) {
    puts("possible");
    return 0;
  }
  
  puts("impossible");
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 10180kb

input:

5
1 3 3 4
2 2 4 3
4 1 5 3
5 2 7 3
6 3 8 4

output:

possible

result:

ok single line: 'possible'

Test #2:

score: 0
Accepted
time: 2ms
memory: 10176kb

input:

4
1 1 2 2
1 3 2 4
3 1 4 2
3 3 4 4

output:

impossible

result:

ok single line: 'impossible'

Test #3:

score: 0
Accepted
time: 1ms
memory: 10212kb

input:

3
1 1 2 2
1 3 2 4
3 3 4 4

output:

possible

result:

ok single line: 'possible'

Test #4:

score: 0
Accepted
time: 0ms
memory: 10204kb

input:

5
0 0 1 999999999
0 999999999 999999999 1000000000
1 0 999999998 1
999999998 0 999999999 999999999
2 999999998 3 999999999

output:

impossible

result:

ok single line: 'impossible'

Test #5:

score: 0
Accepted
time: 1ms
memory: 9884kb

input:

4
0 1 1 1000000000
1 0 999999999 1
999999999 0 1000000000 999999999
2 999999999 999999999 1000000000

output:

possible

result:

ok single line: 'possible'

Test #6:

score: 0
Accepted
time: 0ms
memory: 10200kb

input:

3
0 0 1 1000000000
2 0 999999999 1
2 999999999 999999999 1000000000

output:

impossible

result:

ok single line: 'impossible'

Test #7:

score: 0
Accepted
time: 0ms
memory: 10172kb

input:

3
0 0 1 1000000000
2 0 999999999 1
2 999999999 1000000000 1000000000

output:

possible

result:

ok single line: 'possible'

Test #8:

score: 0
Accepted
time: 89ms
memory: 17100kb

input:

199999
433914929 216935871 433914930 216935872
621822279 310889546 621822280 310889547
395914333 197935573 395914334 197935574
582775641 291366227 582775642 291366228
658726133 329341473 658726134 329341474
71689261 35823037 71689262 35823038
453260967 226608890 453260968 226608891
249802825 1248798...

output:

impossible

result:

ok single line: 'impossible'

Test #9:

score: 0
Accepted
time: 90ms
memory: 17668kb

input:

199999
783545903 638444708 783545904 638444709
129510863 105527268 129510864 105527269
844145756 687822366 844145757 687822367
69111161 56312696 69111162 56312697
820438487 668505332 820438488 668505333
541037357 440845152 541037358 440845153
201057677 163824672 201057678 163824673
132372296 1078588...

output:

impossible

result:

ok single line: 'impossible'

Test #10:

score: 0
Accepted
time: 81ms
memory: 17056kb

input:

199999
90035476 60020102 90035477 60020103
482291029 321523804 482291030 321523805
943496815 628994328 943496816 628994329
278866936 185907742 278866937 185907743
310938589 207288844 310938590 207288845
203677765 135781628 203677766 135781629
368744134 245825874 368744135 245825875
559390024 3729231...

output:

impossible

result:

ok single line: 'impossible'

Test #11:

score: 0
Accepted
time: 90ms
memory: 19968kb

input:

199999
207687261 415417709 207687262 415417710
150460947 300965081 150460948 300965082
9349830 18742847 9349831 18742848
87879837 175802861 87879838 175802862
354035800 708114787 354035801 708114788
305159254 610361695 305159255 610361696
248609913 497263013 248609914 497263014
499646110 999335407 4...

output:

impossible

result:

ok single line: 'impossible'

Test #12:

score: 0
Accepted
time: 84ms
memory: 19796kb

input:

199999
79738802 97861382 79738803 97861383
614827422 754561052 614827423 754561053
517213290 634761890 517213291 634761891
788424494 967612004 788424495 967612005
613541698 752983118 613541699 752983119
698980304 857839589 698980305 857839590
487475098 598265018 487475099 598265019
733711836 9004646...

output:

impossible

result:

ok single line: 'impossible'

Test #13:

score: 0
Accepted
time: 90ms
memory: 19680kb

input:

199999
161399962 242105266 161399963 242105267
385751852 578633101 385751853 578633102
222705450 334063498 222705451 334063499
503730932 755601721 503730933 755601722
454037530 681061618 454037531 681061619
334605270 501913228 334605271 501913229
478675624 718018759 478675625 718018760
137316204 205...

output:

impossible

result:

ok single line: 'impossible'

Test #14:

score: 0
Accepted
time: 85ms
memory: 9932kb

input:

199999
222639792 110935680 222639793 110935683
931931336 465581452 931931337 465581455
35474718 17353143 35474719 17353146
206777070 103004319 206777071 103004322
914064786 456648177 914064787 456648180
301496196 150363882 301496197 150363885
515345552 257288560 515345553 257288563
500949336 2500904...

output:

impossible

result:

ok single line: 'impossible'

Test #15:

score: 0
Accepted
time: 82ms
memory: 9932kb

input:

199999
14166026 11542586 14166027 11542589
212205815 172908340 212205816 172908343
997392464 812690054 997392465 812690057
766610585 624645560 766610586 624645563
843092432 686964102 843092433 686964105
362333537 295234632 362333538 295234635
724513967 590344612 724513968 590344615
903878693 7364936...

output:

impossible

result:

ok single line: 'impossible'

Test #16:

score: 0
Accepted
time: 85ms
memory: 9860kb

input:

199999
259728590 173148768 259728591 173148771
221053226 147365192 221053227 147365195
899826680 599880828 899826681 599880831
847582532 565051396 847582533 565051399
258078974 172049024 258078975 172049027
369519293 246342570 369519294 246342573
214263539 142838734 214263540 142838737
737461550 491...

output:

impossible

result:

ok single line: 'impossible'

Test #17:

score: 0
Accepted
time: 84ms
memory: 14816kb

input:

199999
310634507 622037446 310634510 622037447
14947597 30663626 14947600 30663627
99728538 200225508 99728541 200225509
184650291 370069014 184650294 370069015
166422010 333612452 166422013 333612453
302228792 605226016 302228795 605226017
386996090 774760612 386996093 774760613
326681088 654130608...

output:

impossible

result:

ok single line: 'impossible'

Test #18:

score: 0
Accepted
time: 86ms
memory: 14736kb

input:

199999
799006978 980599598 799006981 980599599
101833006 124976996 101833009 124976997
491420512 603107117 491420515 603107118
529582438 649942208 529582441 649942209
453375406 556415396 453375409 556415397
591719612 726201467 591719615 726201468
775042202 951188282 775042205 951188283
218921560 268...

output:

impossible

result:

ok single line: 'impossible'

Test #19:

score: 0
Accepted
time: 87ms
memory: 15256kb

input:

199999
354595980 531899408 354595983 531899409
57294868 85947740 57294871 85947741
297914740 446877548 297914743 446877549
306592118 459893615 306592121 459893616
648745732 973124036 648745735 973124037
267426974 401145899 267426977 401145900
363073104 544615094 363073107 544615095
512209740 7683200...

output:

impossible

result:

ok single line: 'impossible'

Test #20:

score: 0
Accepted
time: 72ms
memory: 9976kb

input:

200000
183486 13299 183487 13300
102571 78692 102572 78693
170699 23633 170700 23634
62500 111076 62501 111077
175314 19903 175315 19904
147075 42725 147076 42726
131050 55675 131051 55676
165234 28050 165235 28051
98541 81949 98542 81950
186747 10663 186748 10664
128558 57690 128559 57691
75090 100...

output:

possible

result:

ok single line: 'possible'

Test #21:

score: 0
Accepted
time: 77ms
memory: 9984kb

input:

200000
84832 76958 84833 76959
10067 59201 10068 59202
59229 70877 59230 70878
106141 82019 106142 82020
89100 77971 89101 77972
107123 82252 107124 82253
29040 63708 29041 63709
174481 98249 174482 98250
149793 92386 149794 92387
31435 64276 31436 64277
152941 93133 152942 93134
112041 83420 112042...

output:

impossible

result:

ok single line: 'impossible'

Test #22:

score: 0
Accepted
time: 76ms
memory: 10204kb

input:

200000
44135 36736 44136 36737
89083 45138 89084 45139
71165 41788 71166 41789
68851 41356 68852 41357
94251 46104 94252 46105
24076 32986 24077 32987
75127 42529 75128 42530
21105 32431 21106 32432
97018 46621 97019 46622
100975 47361 100976 47362
122230 51334 122231 51335
131723 53109 131724 53110...

output:

impossible

result:

ok single line: 'impossible'

Test #23:

score: 0
Accepted
time: 80ms
memory: 9804kb

input:

200000
12123595 65272337 12123596 65272338
47819779 50226819 47819780 50226820
34587193 55804197 34587194 55804198
31014123 57310204 31014124 57310205
55526647 46978466 55526648 46978467
63405174 43657760 63405175 43657761
92658071 31328012 92658072 31328013
69459554 41105911 69459555 41105912
13473...

output:

possible

result:

ok single line: 'possible'

Test #24:

score: 0
Accepted
time: 87ms
memory: 9904kb

input:

200000
25587435 13688997 25587436 13688998
67822058 7043790 67822059 7043791
50756536 9728884 50756537 9728885
50605565 9752638 50605566 9752639
948172 17565746 948173 17565747
99155430 2113788 99155431 2113789
2457571 17328257 2457572 17328258
55236107 9024067 55236108 9024068
6859008 16635734 6859...

output:

impossible

result:

ok single line: 'impossible'

Test #25:

score: 0
Accepted
time: 78ms
memory: 9860kb

input:

200000
308 141674 309 141675
30411 124142 30412 124143
26864 126208 26865 126209
153801 52285 153802 52286
90521 89137 90522 89138
159641 48883 159642 48884
188626 32004 188627 32005
22527 128734 22528 128735
132574 64646 132575 64647
45592 115301 45593 115302
47431 114231 47432 114232
173312 40922 ...

output:

impossible

result:

ok single line: 'impossible'

Test #26:

score: 0
Accepted
time: 74ms
memory: 10224kb

input:

200000
56156 97395 56157 97396
75189 41275 75190 41276
87911 3766 87912 3767
50380 114426 50381 114427
34447 161405 34448 161406
45750 128079 45751 128080
36895 154185 36896 154186
82967 18345 82968 18346
83297 17369 83298 17370
50841 113065 50842 113066
61613 81307 61614 81308
81748 21939 81749 219...

output:

possible

result:

ok single line: 'possible'

Test #27:

score: -100
Wrong Answer
time: 96ms
memory: 20628kb

input:

200000
110235 130882 110236 130883
132712 187597 132713 187598
94392 90907 94393 90908
81558 58524 81559 58525
59674 3306 59675 3307
61359 7558 61360 7559
133389 189304 133390 189305
120581 156987 120582 156988
129825 180310 129826 180311
84642 66306 84643 66307
112281 136044 112282 136045
67009 218...

output:

possible

result:

wrong answer 1st lines differ - expected: 'impossible', found: 'possible'