首页 > 其他分享 >CF1842E Tenzing and Triangle - 线段树优化 dp -

CF1842E Tenzing and Triangle - 线段树优化 dp -

时间:2023-07-07 20:01:50浏览次数:53  
标签:Triangle 线段 long cost maxn Tenzing ll dp

题目链接:https://codeforces.com/contest/1842/problem/E

题解:
首先,如果两个等腰三角形相交了,那答案肯定不会更优。因此不会相交。
先考虑一个 \(n^2\) 的 dp:
设 \(dp_i\) 表示考虑到 \(x=i\) 时的最小代价,首先可以先都加一个 \(\sum c_i\),这样只需要考虑三角形覆盖范围内的 \(c_i\) 减去即可。
\(dp_i \leftarrow dp_j - cost(j+1,i) + A\times (i-j)\),其中 \(cost(j+1,i)\) 表示这两个坐标所确定的等腰直角三角形内部的 \(c_i\) 之和,减是因为最后要加一个 \(\sum c_i\)
转移的时候,可以每次更新一下 \(j\) 的 \(cost\)

如何优化?首先,为了方便,令 \(y := k-y\),具体是将后缀和转化为前缀和,详细见后。这样,覆盖所需要的等腰三角形就变成了

修改一下 dp 的定义:令 \(dp_i\) 表示考虑覆盖到 \(y=i\) 时的最小代价
考虑一下一个点 \((x,i)\) 会对哪些 dp 值产生贡献?显然是 \(1..x\)(也就是说,当 \(i\) 由 \(1..x\) 转移过来时,\(cost\) 都要加上 \((x,i)\) 点的贡献)
理解的话可以回到 \(y\) 的含义没有变的时候image
这就是一个前缀加。利用线段树维护一下 \(dp_i-i\times A\),然后就是前缀和,区间 min。注意线段树下标要从 0 开始。
最后加上 \(\sum c_i\) 即可

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 2e5+5;

int n,k,coef;
vector<pii>p[maxn];
ll f[maxn];

struct segm{
	ll mn,lazy;
}se[maxn << 2];

void build(int l,int r,int num){
	se[num].mn = 1e18;
	se[num].lazy = 0;
	if(l == r){
		return ; 
	}
	int mid=l+r>>1;
	build(l,mid,num << 1);build(mid+1,r,num<<1|1);
}

void pushdown(int num,int l,int r){
	if(!se[num].lazy)return ;
	int mid=r-l+1;
	ll lz = se[num].lazy;
	se[num << 1].mn += lz, se[num << 1|1].mn += lz;
	se[num << 1].lazy += lz, se[num << 1|1].lazy += lz;
	se[num].lazy = 0;
}

void update(int l,int r,int x,ll to,int num){
	if(r <= x){
		se[num].mn += to;
		se[num].lazy += to;
		return ;
	}
	pushdown(num,l,r);
	int mid = l+r>>1;
	if(x <= mid)update(l,mid,x,to,num << 1);
	else update(l,mid,x,to,num << 1), update(mid+1,r,x,to,num << 1|1);
	se[num].mn = min(se[num << 1].mn, se[num << 1|1].mn);
}

void upd(int l,int r,int x,ll to,int num){
	if(l == r){
		se[num].mn = to;
		return ;
	}
	pushdown(num,l,r);
	int mid = l+r>>1;
	if(x <= mid)upd(l,mid,x,to,num << 1);
	else upd(mid+1,r,x,to,num << 1|1);
	se[num].mn = min(se[num << 1].mn, se[num << 1|1].mn);
}

ll query(int l,int r,int x,int y,int num){
	if(x <=l && r<=y)return se[num].mn;
	int mid = l+r>>1;
	pushdown(num,l,r);
	if(y<=mid)return query(l,mid,x,y,num<<1);
	else if(x>mid)return query(mid+1,r,x,y,num<<1|1);
	else return min(query(l,mid,x,y,num<<1),query(mid+1,r,x,y,num<<1|1));
}

signed main(){
	scanf("%d%d%d",&n,&k,&coef);
	ll bs = 0;
	for(int i=1;i<=n;i++){
		int x,y,c;scanf("%d%d%d",&x,&y,&c);
		y = k-y;
		p[y].pb(mpr(x, c));
		bs += c;
	}
	build(0,k,1);
	upd(0,k,0,0,1);
	for(int i=1;i<=k;i++){
		for(auto it : p[i]){
			int y = it.first;
			ll c = it.second;
			update(0,k,y,-c,1);
		}
		f[i] = min(query(0,k,0,i-1,1) + 1ll*i*coef, f[i-1]);
		upd(0,k,i,f[i]-1ll*i*coef,1);
	}
	printf("%lld\n",f[k] + bs);

	return 0;
}

标签:Triangle,线段,long,cost,maxn,Tenzing,ll,dp
From: https://www.cnblogs.com/SkyRainWind/p/17535932.html

相关文章

  • 网安周报|黑客利用未修补的WordPress插件缺陷来创建秘密管理员帐户
    网安周报是棱镜七彩推出的安全资讯专栏,旨在通过展示一周内发生的与开源安全、软件供应链安全相关攻击事件,让用户了解开源及软件供应链威胁,提高对安全的重视,做好防御措施。1、黑客利用未修补的WordPress插件缺陷来创建秘密管理员帐户来百度APP畅享高清图片终极会员插件中未修补的关......
  • BZOJ 4247: 挂饰 背包dp
    4247:挂饰TimeLimit: 10Sec  MemoryLimit: 256MBSubmit: 999  Solved: 387[Submit][Status][Discuss]DescriptionJOI君有N个装在手机上的挂饰,编号为1...N。JOI君可以将其中的一些装在手机上。JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件......
  • BZOJ 1415: [Noi2005]聪聪和可可 期望dp
    1415:[Noi2005]聪聪和可可TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 1682  Solved: 991[Submit][Status][Discuss]DescriptionInput数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数。第2行包含两个整数C和M,以空格分......
  • BZOJ 1042:[HAOI2008]硬币购物 容斥原理 背包dp
    1042:[HAOI2008]硬币购物TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 2505  Solved: 1505[Submit][Status][Discuss]Description硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次......
  • BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压dp
    1725:[Usaco2006Nov]CornFields牧场的安排TimeLimit: 5Sec  MemoryLimit: 64MBSubmit: 698  Solved: 489[Submit][Status][Discuss]DescriptionFarmerJohn新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12;1<=N<=12),每一格都是一块正方形的土地。FJ......
  • BZOJ 1915: [Usaco2010 Open]奶牛的跳格子游戏 单调队列优化dp
    1915:[Usaco2010Open]奶牛的跳格子游戏TimeLimit: 4Sec  MemoryLimit: 64MBSubmit: 281  Solved: 110[Submit][Status][Discuss]Description奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3<=N<=250,000),编号为1..N......
  • 概率/期望dp刷题整理
    Bagofmice题意:有w只白鼠和b只黑鼠,公主和龙轮流抓老鼠,其中龙每抓一只老鼠就会有一只未被抓住的老鼠逃走,先抓到一只白鼠的获胜,问公主获胜的概率是多少Solution令dp[i][j]表示还剩i只白鼠和j只黑鼠时公主获胜的概率如果公主直接抓住一只白鼠,获胜的概率是\[\frac{i}{i+j}\]如......
  • 230706 // 换根 DP 复习
    菌:园什是我笋子元首:我是你打野我:元首耳朵得治G.求树的重心http://222.180.160.110:1024/contest/3744/problem/7我们知道,重心的定义是,将其切除后,每个连通块的大小不超过\(\dfracn2\)。连通块分为其子树和整棵树减去该结点引导的子树,所以我们记录size,在每次搜索结束后......
  • package com.ws.byd.bmgl.bmzdpz:编码字典------bydobject
    controller:packagecom.ws.byd.bmgl.bmzdpz.controller;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.lang.O......
  • [Typescript] OverloadedReturnType & OverloadedParameters
    typeOverloadedReturnType<T>=Textends{(...args:any[]):inferR;(...args:any[]):inferR;(...args:any[]):inferR;(...args:any[]):inferR}?R:Textends{(...args:any[]):inferR;(...args:any[]):inferR;(...args:any......