This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
#define sz(x) int(x.size())
int N, Vmax, V2;
vi A, C;
vi D;
const int INF = 2'000'000'005;
struct func
{
int y1;
int x1;
int x2;
int eval(int x)
{
if(x <= x1)
return y1;
else
return y1 + min(x,x2) - x1;
}
};
func combine(func A, func B)
{
if(max(A.y1, B.x1) <= min(A.y1 + A.x2 - A.x1, B.x2))
return {B.eval(A.eval(0)), max(A.y1, B.x1) - A.y1 + A.x1, min(A.y1 + A.x2 - A.x1, B.x2) - A.y1 + A.x1};
else
return {B.eval(A.eval(0)), 0, 0};
}
func nothing;
func plusone;
func minusone;
const int lg = 17;
const int Z = (1<<lg);
vector<func> segtree;
void set(int i, func v)
{
segtree[Z+i] = v;
for(int j = (Z+i)>>1; j >= 1; j >>= 1)
segtree[j] = combine(segtree[2*j], segtree[2*j+1]);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> Vmax >> V2;
nothing = {0, 0, Vmax};
plusone = {1, 0, Vmax-1};
minusone = {0, 1, Vmax};
A = C = vi(1+N);
for(int i = 1; i <= N; i++)
{
char c;
cin >> c;
A[i] = (c == '+' ? +1 : -1);
cin >> C[i];
}
D = vi(1+N);
D[1] = INF;
for(int i = 2; i <= N; i++)
D[i] = C[i] - C[i-1];
vi I;
for(int i = 1; i <= N; i++)
I.push_back(i);
int T = 0, V1 = V2;
sort(I.begin(), I.end(), [] (int p, int q)
{
return D[p] < D[q];
});
int u = 0, v = 0;
segtree = vector<func>((1<<(lg+1)) + 1, nothing);
for(u = 0; u < N; u++)
{
int currlim = D[I[u]] - 1;
// cerr << "checking : " << currlim << '\n';
int y1 = segtree[1].y1, x1 = segtree[1].x1, x2 = segtree[1].x2;
int y2 = y1+x2-x1;
// cerr << x1 << ' ' << x2 << ' ' << y1 << ' ' << y2 << '\n';
if(y1 <= V2 && V2 <= y2)
{
// cerr << "equal? " << V2 << " : " << y2 << '\n';
// cerr << Vmax << '\n';
// cerr << "y2 = " <<
int currV1 = (y2 == V2 ? Vmax : V2-y1+x1);
cerr << currV1 << '\n';
// cerr << "option: " << currV1 << ' ' << currlim << '\n';
if(currlim > T || (currlim == T && currV1 > V1))
{
T = currlim;
V1 = currV1;
}
}
// cerr << u << " : " << currlim << '\n';
for(v = u; v < N && D[I[v]] == D[I[u]]; v++)
{
int i = I[v];
if(i != 1)
{
if(A[i] == +1)
set(i, plusone);
else
set(i, minusone);
}
// cerr << "activating : " << i << '\n';
}
u = v-1;
}
if(T > 2'000'000'000)
cout << "infinity\n";
else
cout << T << ' ' << V1 << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |