稍微剪枝一下,干扰直接干扰到有用
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
using namespace std;
struct node
{
int d,id;long long w;
friend bool operator<(node a,node b)
{
if(a.w==b.w)
return a.d<b.d;
return a.w<b.w;
}
}itm[100005];
int n,m,k;
vector<int> in[100005],out[100005];
int vis[100005];
long long c[100005];
int nxt[100005];
long long dp[100005][205];
long long dfs(int cur,int tm)
{
if(cur>n)
return 0;
//cout<<cur<<" "<<tm<<endl;
if(dp[cur][tm]!=1e18)
return dp[cur][tm];
long long tans=1e18;
if(nxt[cur]==-1)
{
if(cur==n)
tans=0;
else
tans=dfs(cur+1,tm);
}
else
{
int tid=nxt[cur];
if(tid>n)
{
tans=c[cur];
}
else
tans=c[cur]+dfs(tid,tm);
for(int i=cur+1;i<=n;i++)
{
if(i-cur>tm)
break;
if(nxt[i]!=tid)
{
tans=min(tans,dfs(i,tm-(i-cur)));
break;
}
}
if(n-cur+1<=tm)
tans=0;
}
//cout<<cur<<" "<<tm<<" "<<tans<<endl;
return dp[cur][tm]=tans;
}
int main() {
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=0;i<k;i++)
{
int l,r;scanf("%d%d%d%lld",&l,&r,&itm[i].d,&itm[i].w);
itm[i].id=i;
in[l].push_back(i);out[r+1].push_back(i);
}
priority_queue<node>q;
for(int i=1;i<=n;i++)
{
int len=in[i].size();
for(int j=0;j<len;j++)
{
vis[in[i][j]]=1;
q.push(itm[in[i][j]]);
}
len=out[i].size();
for(int j=0;j<len;j++)
{
vis[out[i][j]]=0;
}
nxt[i]=-1;
while(!q.empty() && vis[q.top().id]==0)
q.pop();
if(!q.empty())
{
nxt[i]=q.top().d+1;
c[i]=q.top().w;
}
}
for(int i=0;i<=100000;i++)
for(int j=0;j<=200;j++)
dp[i][j]=1e18;
long long ans=dfs(1,m);
printf("%lld\n",ans);
}
return 0;
}