埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)
题意
题目链接:https://www.nowcoder.com/acm/contest/91/H
来源:牛客网
题解
设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i]" role="presentation" style="position: relative;">r[i]r[i]r[i]为向右推第iii个骨牌最远能影响到的骨牌的编号,则有:
l[i]=min(l[j])+1, \ (j
使用线段树预处理出lll和r" role="presentation" style="position: relative;">rrr数组,复杂度为O(nlog(n))O(nlog(n))O(nlog(n))。
设dp[i][0]dp[i][0]dp[i][0]表示第iii个骨牌向左倒时,让前i个骨牌全倒的最少要推的骨牌数;dp[i][1]" role="presentation" style="position: relative;">dp[i][1]dp[i][1]dp[i][1]表示第iii个骨牌向右倒时,让前i个骨牌全倒的最少要推的骨牌数。则有:
dp[i][0]=min \begin{cases} dp[j-1][0]+1,\quad l[i]\leq j \\ dp[j-1][1]+1,\quad l[i]\leq j \end{cases}\\ dp[i][1]=min \begin{cases} dp[j-1][0]+1,\quad r[j]\geq i\\ dp[i-1][1]+1,\quad r[j]\geq i \end{cases}
答案就是min(dp[n][0],dp[n][1])min(dp[n][0],dp[n][1])min(dp[n][0],dp[n][1]),用线段树优化dp方程,复杂度为O(nlog(n))O(nlog(n))O(nlog(n))。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100010
#define lx x<<1
#define rx x<<1|1
#define lson x<<1,s,mid
#define rson x<<1|1,mid+1,t
const int inf=0x3f3f3f3f;
int n;
int seg[2][N*6],lazy[2][N*6];
int x[N],y[N],l[N],r[N],dp[2][N];
inline int op(int k,int x,int y)
{if(k==0) return min(x,y);else return max(x,y);
}
void build2(int x,int s,int t)
{seg[0][x]=s;seg[1][x]=t;if(s==t){l[s]=r[s]=s;return;}int mid=s+t>>1;build2(lson);build2(rson);
}
void updata2(int k,int x,int s,int t,int id,int w)
{if(s==t){seg[k][x]=w;return;}int mid=s+t>>1;if(id<=mid) updata2(k,lson,id,w);else updata2(k,rson,id,w);seg[k][x]=op(k,seg[k][lx],seg[k][rx]);
}
int query2(int k,int x,int s,int t,int l,int r)
{if(l<=s&&t<=r) return seg[k][x];int mid=s+t>>1,q=(k?0:inf);if(l<=mid) q=op(k,q,query2(k,lson,l,r));if(mid<r) q=op(k,q,query2(k,rson,l,r));return q;
}
inline void pushdown(int k,int x,int s,int t)
{if(lazy[k][x]!=inf){if(s!=t){seg[k][lx]=min(seg[k][lx],lazy[k][x]);seg[k][rx]=min(seg[k][rx],lazy[k][x]);lazy[k][lx]=min(lazy[k][lx],lazy[k][x]);lazy[k][rx]=min(lazy[k][rx],lazy[k][x]);}lazy[k][x]=inf;}
}
void updata(int k,int x,int s,int t,int l,int r,int w)
{if(l<=s&&t<=r){seg[k][x]=min(seg[k][x],w);lazy[k][x]=min(lazy[k][x],w);return;}pushdown(k,x,s,t);int mid=s+t>>1;if(l<=mid) updata(k,lson,l,r,w);if(mid<r) updata(k,rson,l,r,w);seg[k][x]=min(seg[k][lx],seg[k][rx]);
}
int query(int k,int x,int s,int t,int l,int r)
{if(l<=s&&t<=r) return seg[k][x];pushdown(k,x,s,t);int mid=s+t>>1,q=inf;if(l<=mid) q=min(q,query(k,lson,l,r));if(mid<r) q=min(q,query(k,rson,l,r));return q;
}
int main()
{int ca;scanf("%d",&ca);while(ca--){scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);build2(1,0,n);for(int i=2;i<=n;++i){int k=upper_bound(x+1,x+n+1,x[i]-y[i])-x;l[i]=query2(0,1,0,n,k,i);updata2(0,1,0,n,i,l[i]);}for(int i=n-1;i>0;--i){int k=lower_bound(x+1,x+n+1,x[i]+y[i])-x-1;r[i]=query2(1,1,0,n,i,k);updata2(1,1,0,n,i,r[i]);}memset(seg,0x3f,sizeof(seg));memset(lazy,0x3f,sizeof(lazy));dp[0][0]=0;updata(0,1,0,n,0,0,0);dp[1][0]=0;updata(1,1,0,n,0,0,0);for(int i=1;i<=n;++i){int tmp0=query(0,1,0,n,l[i]-1,i-1);int tmp1=query(1,1,0,n,l[i]-1,i-1);dp[0][i]=min(tmp0,tmp1)+1;updata(0,1,0,n,i,i,dp[0][i]);updata(1,1,0,n,i,r[i],min(dp[0][i-1],dp[1][i-1])+1);dp[1][i]=query(1,1,0,n,i,i);}printf("%d\n",min(dp[0][n],dp[1][n]));}return 0;
}
/*
3
4
1 3
2 1
3 1
4 3
3
1 3
4 2
5 2
3
1 3
4 3
7 7
*/
埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)相关推荐
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B 合约数 (dfs+预处理)(dsu on tree)
链接:https://ac.nowcoder.com/acm/contest/9115/B 题意:给定一棵n个节点的树,并且根节点的编号为p,第i个节点有属性值vali, 定义F(i): 在以i为根的 ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L-K序列
埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L-K序列 链接:https://www.nowcoder.com/acm/contest/91/L 来源:牛客网 题目描述 给一个数组 ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A-Wasserstein Distance
埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A-Wasserstein Distance 链接:https://www.nowcoder.com/acm/contest/91/A ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 E-小Y吃苹果
埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 E-小Y吃苹果 链接:https://www.nowcoder.com/acm/contest/91/E 来源:牛客网 题目描述 小Y买 ...
- 好久没撸c,第一场回状态的题(埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
题目链接: 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A:Wasserstein Distance ## 题意:有2大堆柱状图的土(总体积相同,问从第一堆土移动到第二堆消耗最少的 ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 I 二数(模拟)
题目描述 我们把十进制下每一位都是偶数的数字叫做"二数". 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他 ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛B合约数
链接:https://www.nowcoder.com/acm/contest/91/B 来源:牛客网 题目描述 在埃森哲,员工培训是最看重的内容,最近一年,我们投入了 9.41 亿美元用于员工培训和 ...
- 【牛客网】埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 题解
题目连接 A.Wasserstein Distance (水题) 题意:给你2行土a,b,每行都有n堆,每堆对应有a[i],b[i]克,我们可以对a中的土进行移动,移动任意堆的k克泥土到a中其他堆消耗 ...
- 二数 (埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛)...
题目描述 我们把十进制下每一位都是偶数的数字叫做"二数". 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他想 ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 C序列变换...
链接:https://www.nowcoder.com/acm/contest/91/C 来源:牛客网 没有账号的同学这样注册,支持博主 题目描述 给定两个长度为n的序列,ai, bi(1<=i ...
最新文章
- ios TableView编辑状态多选框的修改
- 2020年最火本科生专业来了!180所高校新增人工智能专业
- 没有绝对安全的系统!激光瞄准二极管,25米外从被物理隔绝的计算机中窃取数据...
- 分享20个Android游戏源代码。以后看看。
- 你最近学到的 飞鸽传书 东西的题目
- 研究生必须过计算机和英语吗,计算机考研考英语一还是英语二
- 【Flink】Flink 使用代码如何主动触发 SavePoint
- 剑灵灵动区服务器位置,盘点国服剑灵灵动内测4大玩家人气玩法(2)
- 3. 什么是icmp?icmp与ip的关系_Java抽象类、内部、类接口到底是什么?
- android webview 无法加载插件,webView 测试问题,无法检测到 webView 控件
- windows10华硕安装杜比音效
- 最新二次开发知宇自动发卡系统源码/全网对接/功能齐全
- AvgPool2d函数
- 关于海康威视网络摄像机二次开发问题
- Mysql数据库日期查询
- cla作用matlab,健身搞肌运动补剂小讲堂:共轭亚油酸CLA功效解析
- python实现排序算法lowb三人组之插入排序
- powerdesigner 导入sql文件生成模型
- HL7解析类的使用(java)
- Preftest测试
热门文章
- 微信公众号关于百度地图和腾讯地图本地定位api的调用(js)
- 全国中学生计算机大赛+试题,全国青少年信息学奥林匹克竞赛(NOI2018)正式开幕(附day1试题)...
- 倾斜补偿的电子罗盘(3):椭球拟合,磁传感器软磁干扰和硬磁干扰的9参数校准
- 利用文件头标志判断文件类型
- 黑马程序员01_String
- 真正解决layer弹层遮罩挡住窗体的问题
- 【厚积薄发系列】C++项目总结21—VS远程调试技巧分享
- 区块链原理及核心技术
- LVOOP(一)、如何创建类、属性和方法
- 扬帆际海:个人如何做跨境电商