2023 rcpc
This commit is contained in:
92
2023/rcpc/d2/editorial/l-dush-108.cpp
Normal file
92
2023/rcpc/d2/editorial/l-dush-108.cpp
Normal file
@@ -0,0 +1,92 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user