Files
contests/2023/rcpc/d2/editorial/l-dush-108.cpp
2024-04-22 16:45:09 +03:00

93 lines
2.1 KiB
C++

#include <cstdio>
#include <algorithm>
#include <cassert>
#define NRINT (100'000 + 5)
using namespace std;
struct interval
{
int apa, timpapa, inceput;
};
struct preferinte
{
int apa, timpdus;
};
int tmin[1500000];
int tnext[21][NRINT];
int nrinterv[21];
interval dus[NRINT];
preferinte om[21];
int log2[1500000];
inline int lsb(int val)
{
return val&(-val);
}
int bs(int val, int pers)
{
int st, dr, mid, last;
st = 0;
dr = nrinterv[pers];
while(st <= dr)
{
mid = (st + dr) / 2;
if(dus[tnext[pers][mid]].inceput > val)
dr = mid - 1;
else
{
last = mid;
st = mid + 1;
}
}
return last;
}
int main()
{
// freopen("dush.in", "r", stdin);
// freopen("dush.out", "w", stdout);
int n, m, i, j, missing, pozc, nex;
scanf("%d%d", &n, &m);
for(i = 1; i <= n; ++ i)
scanf("%d%d", &om[i].apa, &om[i].timpdus);
for(i = 1; i <= m; ++ i)
scanf("%d%d%d", &dus[i].inceput, &dus[i].timpapa, &dus[i].apa);
for(i = 1; i <= m; ++ i)
{
for(j = 1; j <= n; ++ j)
if(dus[i].apa == om[j].apa && dus[i].timpapa >= om[j].timpdus)
tnext[j][++ nrinterv[j]] = i;
}
for(i = 1; i < 1500000; ++ i)
tmin[i] = 2000000000;
for(i = 2; i <= (1 << n); ++ i)
log2[i] = log2[i/2] + 1;
for(i = 0; i < (1 << n); ++ i)
{
missing = ((1 << n) - 1) ^ i;
while(missing)
{
nex = lsb(missing);
j = log2[nex] + 1;
pozc = bs(tmin[i], j);
if(pozc > 0)
if(dus[tnext[j][pozc]].inceput + dus[tnext[j][pozc]].timpapa >= tmin[i] + om[j].timpdus)
if(tmin[i] + om[j].timpdus < tmin[i ^ nex])
tmin[i ^ nex] = tmin[i] + om[j].timpdus;
if(pozc < nrinterv[j])
if(tmin[i ^ nex] > dus[tnext[j][pozc + 1]].inceput + om[j].timpdus)
tmin[i ^ nex] = dus[tnext[j][pozc + 1]].inceput + om[j].timpdus;
missing ^= nex;
}
}
printf("%d", tmin[(1 << n) - 1]);
assert(tmin[(1 << n) - 1] < 2'000'000'000);
return 0;
}