[CF311B]Cats Transport

Cats Transport

题解

很水的一道斜率优化呀

首先因为每只猫玩的位置与玩的时间是一定的,故可以将其转化为铲*官带走猫所需要的出发时间。

于是,我们将其排序后得到的单调不下降序列上截取p个点,当做其的出发时间。

dp_{i,j}为铲*官已有i人出发,第i人在刚好可以带走第j只猫的时间出发时猫们最小的出发时间,容易得到转移方程式:

dp_{i,j}=min\left \{ dp_{i-1,k}+t_{i}(j-k)-\sum_{p=k+1}^{j}t_{p} \right \}。用前缀和将t表示出来,dp_{i,j}=min\left \{ dp_{i-1,k}+t_{i}(j-k)-sum_{j}+sum_{k}\right \}

时间复杂度O\left( m^{2}p \right ),明显会T,思考优化。

当对于点i,点j比点k更优时

dp_{j}+t_{i}(i-j)+sum_{j}-sum_{i}<dp_{k}+t_{i}(i-k)+sum_{k}-sum_{i}

dp_{j}-t_{i}j+sum_{j}<dp_{k}-t_{i}k+sum_{k}

dp_{j}-dp_{k}+sum_{j}-sum_{k}<t_{i}(j-k)

\frac{dp_{j}-dp_{k}+sum_{j}-sum_{k}}{j-k}<t_{i}

又转化成了熟悉的斜率优化的格式,于是,用单调队列维护斜率即可。

时间复杂度O\left(m(p+log_{m}) \right )(有个排序),可以过。

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
typedef long long LL;
typedef pair<int,int> pii;
const LL mo=1e9+7;
const LL INF=0x7f7f7f7f;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
LL n,m,p,d[MAXN],t[MAXN],dp[105][MAXN],sum[MAXN];
LL head[105],tail[105],q[105][MAXN];
double slope(int t,LL k,LL j){return 1.0*(dp[t][k]-dp[t][j]+sum[k]-sum[j])/(k-j);}
signed main(){
	scanf("%lld %lld %lld\n",&n,&m,&p);
	for(int i=2;i<=n;i++)scanf("%lld",&d[i]),d[i]+=d[i-1];
	for(int i=1;i<=m;i++){
		int pos;scanf("%lld %lld",&pos,&t[i]);
		t[i]=t[i]-d[pos];
	}
	if(p>=m){puts("0");return 0;}
	sort(t+1,t+m+1);dp[0][0]=0;
	for(int i=1;i<=m;i++)sum[i]=sum[i-1]+t[i];
	for(int j=1;j<=m;j++)
		for(int i=1;i<=min(1ll*j,p);i++){
			while(head[i-1]+1<tail[i-1]&&slope(i-1,q[i-1][head[i-1]],q[i-1][head[i-1]+1])<=t[j])head[i-1]++;
			int k=q[i-1][head[i-1]];dp[i][j]=dp[i-1][k]+1ll*t[j]*(j-k)-sum[j]+sum[k];
			//printf("%d %d %d:%lld\n",i,j,q[head],dp[i&1][j]);
			while(head[i]+1<tail[i]&&slope(i,q[i][tail[i]-2],q[i][tail[i]-1])>slope(i,q[i][tail[i]-1],j))tail[i]--;
			q[i][tail[i]++]=j;
			/*for(int k=0;k<j;k++)
				dp[i][j]=min(dp[i][j],dp[i-1][k]+(j-k)*t[j]-(sum[j]-sum[k]));*/
		}
	printf("%lld",dp[p][m]);
	return 0;
}

谢谢!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
map pfn expected mapping type uncached-minus for [mem 0x7c11f000-0x7c11ffff], got write-back 这个问题怎么解决,这个会导致系统死机吗?PID: 500 TASK: ffff8800740d6dd0 CPU: 4 COMMAND: "mate-settings-d" #0 [ffff88024a6e7988] machine_kexec at ffffffff81059cdb #1 [ffff88024a6e79e8] __crash_kexec at ffffffff81105182 #2 [ffff88024a6e7ab8] crash_kexec at ffffffff81105270 #3 [ffff88024a6e7ad0] oops_end at ffffffff8168ed88 #4 [ffff88024a6e7af8] no_context at ffffffff8167e993 #5 [ffff88024a6e7b48] __bad_area_nosemaphore at ffffffff8167ea29 #6 [ffff88024a6e7b90] bad_area_nosemaphore at ffffffff8167eb93 #7 [ffff88024a6e7ba0] __do_page_fault at ffffffff81691b1e #8 [ffff88024a6e7c00] do_page_fault at ffffffff81691cc5 #9 [ffff88024a6e7c30] page_fault at ffffffff8168df88 [exception RIP: dev_set_drvdata+26] RIP: ffffffff8142c60a RSP: ffff88024a6e7ce8 RFLAGS: 00010206 RAX: 0000000900000000 RBX: ffff880258686098 RCX: 0000000180040001 RDX: ffff8801849e4000 RSI: 0000000000000000 RDI: ffff880258686098 RBP: ffff88024a6e7cf8 R8: ffff8801849e4000 R9: 0000000180040001 R10: 00000000849e6001 R11: ffffea0006127800 R12: ffff880239383398 R13: ffff880239383300 R14: ffff880061c29d08 R15: 0000000000000246 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #10 [ffff88024a6e7d00] snd_usb_audio_free at ffffffffa059a587 [snd_usb_audio] #11 [ffff88024a6e7d28] snd_usb_audio_dev_free at ffffffffa059a5b2 [snd_usb_audio] #12 [ffff88024a6e7d38] __snd_device_free at ffffffffa02e2dc9 [snd] #13 [ffff88024a6e7d50] snd_device_free_all at ffffffffa02e311b [snd] #14 [ffff88024a6e7d70] release_card_device at ffffffffa02dd7de [snd] #15 [ffff88024a6e7d90] device_release at ffffffff814273f2 #16 [ffff88024a6e7db8] kobject_release at ffffffff8131a29e #17 [ffff88024a6e7de8] kobject_put at ffffffff8131a158 #18 [ffff88024a6e7e00] put_device at ffffffff81427717 #19 [ffff88024a6e7e10] snd_card_file_remove at ffffffffa02de1b4 [snd] #20 [ffff88024a6e7e40] snd_ctl_release at ffffffffa02df421 [snd] #21 [ffff88024a6e7e78] snd_disconnect_release at ffffffffa02ddafd [snd] #22 [ffff88024a6e7ea8] __fput at ffffffff811fff09 #23 [ffff88024a6e7ef0] ____fput at ffffffff812001be #24 [ffff88024a6e7f00] task_work_run at ffffffff810accc7 #25 [ffff88024a6e7f30] do_notify_resume at ffffffff8102ab22 #26 [ffff88024a6e7f50] int_signal at ffffffff8169677d gdb调试的bt,这个怎么判断是什么造成的死机
最新发布
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值