题解:P5583 「SWTR-1」Ethan and Sets
SheepGod33 · · 题解
思路
看到题目要输出的
用
对于每次
每次
如果
最后提醒一下要开 long long。然后记得特判一下,如果
其他细节见代码。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, d, l = 1, r, flag, dl, ml, zl, ansdl = INT_MAX, ansml, ansl, ansr, t[3010], num[3010], c[3010][1010], cnt[3010], like[1010], book[1010];
signed main()
{
scanf("%lld%lld%lld", &n, &m, &d);
for (int i = 1, p; i <= d; i++)
scanf("%lld", &p), like[p] = 1;
for (int i = 1; i <= n; i++)
{
scanf("%lld%lld", &t[i], &num[i]);
for (int j = 1; j <= num[i]; j++)
scanf("%lld", &c[i][j]), cnt[i] += !like[c[i][j]];
}
while (l <= n)
{
while (r < n && (zl < d || !cnt[r + 1]))
{
r++, dl += cnt[r], ml += t[r];
for (int i = 1; i <= num[r]; i++)
zl += !book[c[r][i]] && like[c[r][i]], book[c[r][i]]++;
}
if (zl == d && (dl < ansdl || (dl == ansdl && ml >= ansml)))
ansdl = dl, ansml = ml, ansl = l, ansr = r;
for (int i = 1; i <= num[l]; i++)
book[c[l][i]]--, zl -= !book[c[l][i]] && like[c[l][i]];
dl -= cnt[l], ml -= t[l], l++;
}
if (!ansl && !ansr)
printf("-1");
else
printf("%lld %lld", ansl, ansr);
return 0;
}
给个赞再走吧。