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 <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Nmax = 1e6 + 5;
struct restrictie
{
int x, y, add;
};
vector<restrictie> R[Nmax];
int n, m;
namespace rd
{
const int bsize = 1<<16;
char buffer[bsize+2];
int cursor;
static void refresh()
{
fread(buffer, 1, bsize, stdin), cursor = 0;
}
template <typename T>
static void read(T &x)
{
x = 0;
bool sgn = 0;
while(!isdigit(buffer[cursor]))
{
sgn |= (buffer[cursor] == '-');
++cursor;
if(cursor == bsize) refresh();
}
while(isdigit(buffer[cursor]))
{
x = x * 10 + buffer[cursor] - '0';
++cursor;
if(cursor == bsize) refresh();
}
if(sgn) x *= (-1);
}
}
void read_and_init()
{
rd :: refresh();
rd :: read(n); rd :: read(m);
int i;
vector<ll> A(n+1), B(m+1), S(n+1), T(m+1);
vector<int> P(n+1), Q(m+1), T1(n+1), T2(m+1);
for(i=1; i<=n; ++i) rd :: read(A[i]), rd :: read(S[i]), rd :: read(P[i]);
for(i=1; i<=m; ++i) rd :: read(B[i]), rd :: read(T[i]), rd :: read(Q[i]);
for(i=1; i<=n; ++i) A[i] += A[i-1];
for(i=1; i<=m; ++i) B[i] += B[i-1];
for(i=1; i<=n; ++i)
T1[i] = upper_bound(B.begin(), B.end(), S[i] - A[i]) - B.begin() - 1;
for(i=1; i<=m; ++i)
T2[i] = upper_bound(A.begin(), A.end(), T[i] - B[i]) - A.begin() - 1;
for(i=1; i<=n; ++i)
R[i].push_back({ 0, T1[i], P[i] });
for(i=1; i<=m; ++i)
R[T2[i]+1].push_back({ i, m, Q[i] });
}
class SegTree
{
ll a[Nmax];
public:
void maximize()
{
int i;
for(i=1; i<=m; ++i) a[i] = max(a[i], a[i-1]);
}
void update(vector<restrictie> &v)
{
for(auto it : v)
for(int i=it.x; i<=it.y; ++i)
a[i] += it.add;
}
void init()
{
memset(a, 0, sizeof(a));
}
ll query()
{
maximize();
return a[m];
}
} aint;
void solve()
{
aint.init();
int i;
for(i=1; i<=n; ++i)
{
aint.maximize();
aint.update(R[i]);
}
ll ans = aint.query();
for(auto it : R[n+1]) ans += it.add;
cout << ans << '\n';
}
int main()
{
// freopen("input", "r", stdin);
read_and_init();
solve();
return 0;
}
Compilation message (stderr)
dishes.cpp: In function 'void rd::refresh()':
dishes.cpp:26:39: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
fread(buffer, 1, bsize, stdin), cursor = 0;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
# | 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... |