#include <bits/stdc++.h>
using namespace std;
#define int long long
struct ar
{
int yD, yF, x;
bool typ;
bool operator<(const ar &autre) const
{
if (x == autre.x) return yD < autre.yD;
return x < autre.x;
}
};
struct inter
{
int y1, y2;
bool par;
bool operator<(const inter &autre) const
{
return y1 < autre.y1;
}
};
int nbI;
vector<ar> aretes;
set<inter> cur;
int N, M, maxi;
int nbA;
int nb[2];
void aj(int y1, int y2, int x)
{
auto it = cur.lower_bound({y2,0,0});
assert (it != cur.begin());
assert(it != cur.end());
auto prec = *prev(it);
auto suiv = *it;
if (y1 == prec.y2 && (x%2) == prec.par)
{
y1 = prec.y1;
nb[prec.par]--;
nbI -= ((prec.y1+prec.y2)%2);
cur.erase(prec);
if ((prec.par+x)%2) nb[(x+1)%2]++;
}
if (y2==suiv.y1 && (x%2) == suiv.par)
{
y2 = suiv.y2;
nb[suiv.par]--;
nbI -= ((suiv.y1+suiv.y2)%2);
cur.erase(suiv);
if ((suiv.par+x)%2) nb[(x+1)%2]++;
}
nb[(bool)(x%2)]++;
cur.insert({y1,y2,(bool)(x%2)});
nbI += ((y1+y2)%2);
}
void ret(int y1,int y2, int x)
{
auto it = cur.upper_bound({y1,0,0});
auto mec = *prev(it);
//cout << y1 << ' ' << y2 << ' ' << mec.y1 << ' ' << mec.y2 << '\n';
//cout << (*it).y1 << ' ' << (*it).y2 << '\n';
//assert (mec.y1 <= y1 && mec.y2 >= y2);
//cout << "alors " << y1 << ' ' << y2 << ' ' << mec.y1 << ' ' << mec.y2 << '\n';
if (mec.y2 < y2)
{
nb[(x+1)%2] ++;
cout << maxi;
exit(0);
}
if ((mec.par+x)%2) nb[(x+1)%2] ++;
nb[mec.par]--;
nbI -= ((mec.y1+mec.y2)%2);
cur.erase(mec);
if (y1 > mec.y1)
{
nbI += ((mec.y1+y1)%2);
//cout << mec.y1 << ' ' <<y1<<'\n';
cur.insert({mec.y1, y1, (bool)(x%2)});
//cout << 'a';
//for (auto i : cur) cout << i.y1 <<i.y2<<' ';
nb[(bool)(x%2)]++;
}
if (y2 < mec.y2)
{
nbI += ((mec.y2+y2)%2);
cur.insert({y2, mec.y2, (bool)(x%2)});
nb[(bool)(x%2)]++;
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin >> N >> M;
maxi = 0;
bool sens = 0;
int precX, precY, x0, y0;
cin >> precX >> precY;
x0 = precX; y0 = precY;
for (int i = 0; i < N; i ++)
{
int x, y;
if (i<N-1) cin >> x >> y;
else
{
x = x0; y = y0;
}
if (x == precX)
{
aretes.push_back({precY, y, x, 0});
}
if (x == 0 && precX == 0) {sens = !(y>precY);}
precX = x; precY = y;
}
nbA = aretes.size();
for (int i = 0; i < nbA; i ++)
{
aretes[i].typ = sens ^ (aretes[i].yF > aretes[i].yD);
//cout << (int) sens << (int)(aretes[i].yF>aretes[i].yD);
if (aretes[i].yF < aretes[i].yD) swap(aretes[i].yD, aretes[i].yF);
}
//for (auto i : aretes)
//{
// cout << i.yD << ' ' << i.yF << ' ' << i.x << ' ' << (int)i.typ << '\n';
//}
sort(aretes.begin(), aretes.end());
cur.insert({-1, -1,0});
cur.insert({1000000001, 1000000001, 0});
for (int i = 0; i < nbA; i ++)
{
if (nb[(aretes[i].x+1)%2]==0)
maxi = aretes[i].x;
else if (nb[(aretes[i].x)%2]==0)
maxi = aretes[i].x-1;
if (aretes[i].typ) aj(aretes[i].yD, aretes[i].yF, aretes[i].x);
else ret(aretes[i].yD, aretes[i].yF, aretes[i].x);
/*cout << "nouv : " << aretes[i].yD << ' ' << aretes[i].yF << ' ' << aretes[i].x << '\n';
for (auto truc : cur)
{
cout << truc.y1 << ' ' << truc.y2 << " et " << nbI << '\n';
}
cout << '\n';*/
if (i == nbA-1 || aretes[i+1].x > aretes[i].x)
{
//cout << nb[0] << ' ' << nb[1] << '\n';
if (nbI!=0)
{
break;
}
}
}
if (nb[(aretes[nbA-1].x+1)%2]==0)
maxi = aretes[nbA-1].x;
else if (nb[(aretes[nbA-1].x)%2]==0)
maxi = aretes[nbA-1].x-1;
cout << maxi << '\n';
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Incorrect |
8 ms |
2264 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
23 ms |
4056 KB |
Output is correct |
3 |
Correct |
22 ms |
3964 KB |
Output is correct |
4 |
Correct |
27 ms |
5840 KB |
Output is correct |
5 |
Correct |
38 ms |
5840 KB |
Output is correct |
6 |
Correct |
1 ms |
348 KB |
Output is correct |
7 |
Correct |
0 ms |
348 KB |
Output is correct |
8 |
Correct |
39 ms |
7252 KB |
Output is correct |
9 |
Correct |
49 ms |
7380 KB |
Output is correct |
10 |
Correct |
53 ms |
7368 KB |
Output is correct |
11 |
Correct |
51 ms |
7352 KB |
Output is correct |
12 |
Correct |
57 ms |
8136 KB |
Output is correct |
13 |
Correct |
60 ms |
8720 KB |
Output is correct |
14 |
Correct |
44 ms |
7364 KB |
Output is correct |
15 |
Incorrect |
40 ms |
7364 KB |
Output isn't correct |
16 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
42 ms |
7360 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |