简单的单调DP,连队列都用不到
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct node
{
int s,p;
bool operator<(const node &c) const
{
return p<c.p;
}
};
vector<node>v[10005];
node q;
int f[10005],S[205];
void work(int x)
{
if (!v[x].size())
{
f[x]=0;
return ;
}
int i=0,n=0,now=0;
while (i<v[x].size())
{
while (now<v[x].size() && v[x][now].s==v[x][i].s)
++now;
if (!v[x][i].s)
{
S[n++]=now-i;
if (now-i>=3)
S[n-1]*=2;
}
else
S[n++]=i-now;
i=now;
}
now=S[0];
int ans=max(0,now);
for (i=1; i<n; ++i)
{
now=max(now,0)+S[i];
ans=max(ans,now);
}
f[x]=ans;
}
int main()
{
int T,i,n,m,t,s,p;
scanf("%d",&T);
for (int kcase=1; kcase<=T; ++kcase)
{
for (i=1; i<=10000; ++i)
v[i].clear();
scanf("%d%d",&n,&m);
int maxt=0,ans=0;
for (i=0; i<n; ++i)
{
scanf("%d%d%d",&t,&s,&p);
maxt=max(maxt,t);
q.s=s,q.p=p;
v[t].push_back(q);
}
for (i=1; i<=maxt; ++i)
sort(v[i].begin(),v[i].end());
if (maxt<=m+1)
{
for (i=1; i<=maxt; ++i)
work(i),ans=max(ans,f[i]);
printf("Case %d: %d\n",kcase,ans);
continue;
}
for (i=1; i<=m; ++i)
work(i),ans=max(ans,f[i]);
int Q=0;
for (; i<=maxt; ++i)
{
work(i);
f[i]+=Q;
ans=max(ans,f[i]);
Q=max(Q,f[i-m]);
}
// for (i=1; i<=maxt; ++i)
// printf("%d==========%d\n",i,f[i]);
printf("Case %d: %d\n",kcase,ans);
}
return 0;
}