[AtCoder-ARC073F]Many Moves

题目大意:
  有一排n个格子和2枚硬币。
  现在有q次任务,每一次要你把其中一枚硬币移到x的位置上,移动1格的代价是1。
  两枚硬币不能同时移动,任务必须按次序完成。
  现在告诉你两枚硬币初始状态所在的位置a和b,问完成所有任务的最小代价。

思路:
  很容易想到一个O(qn)的DP。
  由于完成任务的次序确定,每个任务的位置也确定,我们可以用f[i][j]表示完成第i个任务后,一个硬币在x[i],一个硬币在j的最小代价。
  转移方程为f[i][j]=min{f[i-1][j]+|x[i]-x[i-1]|},f[i][a[i-1]]=min{f[i-1][j]+|x[i]-j|}。
  然而这样还是会TLE,在AtCoder上只过了14/34的测试数据。
  不难发现,在状态转移方程中,如果我们能去掉绝对值,里面的东西就能用线段树维护。
  而绝对值的取值只与硬币的左右位置关系有关。
  因此我们可以建2棵线段树,一棵表示被转移的状态在目标状态左边,一棵表示在右边。
  左线段树中每个叶子结点x[i-1]维护f[i-1][j]-x[i-1]的值,右线段树每个叶子结点x[i-1]维护f[i-1][j]+x[i-1]的值。
  看了一下榜,发现排在前面的基本上都是用树状数组做的。
  然而用树状数组维护区间最值难道不是O(log^2 n)的吗?
  事实上我们可以发现线段树上维护的东西只会越来越小,这样我们可以直接在树状数组上修改,不用考虑原来的最小值没了怎么办。
  然后我又在树状数组里面加了一个剪枝。
  这样随随便便就能拿Rank1。

  1 #include<cstdio>
  2 #include<cctype>
  3 #include<cstdlib>
  4 #include<algorithm>
  5 typedef signed long long int int64;
  6 inline unsigned getint() {
  7     register char ch;
  8     while(!isdigit(ch=getchar()));
  9     register unsigned x=ch^'0';
 10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
 11     return x;
 12 }
 13 inline int64 min(const int64 &a,const int64 &b) {
 14     return a<b?a:b;
 15 }
 16 const int64 inf=0x7ffffffffffffff;
 17 const int N=200001;
 18 int n;
 19 class FenwickTree {
 20     private:
 21         int64 val[N];
 22         int lowbit(const int &x) const {
 23             return x&-x;
 24         }
 25     public:
 26         FenwickTree() {
 27             std::fill(&val[0],&val[N],inf);
 28         }
 29         void modify(int p,const int64 &x) {
 30             while(p<=n) {
 31                 if(x<val[p]) {
 32                     val[p]=x;
 33                 } else {
 34                     return;
 35                 }
 36                 p+=lowbit(p);
 37             }
 38         }
 39         int64 query(int p) const {
 40             int64 ret=inf;
 41             while(p) {
 42                 ret=min(ret,val[p]);
 43                 p-=lowbit(p);
 44             }
 45             return ret;
 46         }
 47 };
 48 FenwickTree ta;
 49 class RevFenwickTree {
 50     private:
 51         int64 val[N];
 52         int lowbit(const int &x) const {
 53             return x&-x;
 54         }
 55     public:
 56         RevFenwickTree() {
 57             std::fill(&val[0],&val[N],inf);
 58         }
 59         void modify(int p,const int64 &x) {
 60             while(p) {
 61                 if(x<val[p]) {
 62                     val[p]=x;
 63                 } else {
 64                     return;
 65                 }
 66                 p-=lowbit(p);
 67             }
 68         }
 69         int64 query(int p) const {
 70             int64 ret=inf;
 71             while(p<=n) {
 72                 ret=min(ret,val[p]);
 73                 p+=lowbit(p);
 74             }
 75             return ret;
 76         }
 77 };
 78 RevFenwickTree tb;
 79 int64 f[N];
 80 inline void modify(const int &p,const int64 x) {
 81     if(x<f[p]) {
 82         f[p]=x;
 83         ta.modify(p,x-p);
 84         tb.modify(p,x+p);
 85     }
 86 }
 87 int main() {
 88     n=getint();
 89     int q=getint(),a=getint(),b=getint();
 90     std::fill(&f[0],&f[N],inf);
 91     modify(a,0);
 92     int64 sum=0;
 93     while(q--) {
 94         a=b;
 95         b=getint();
 96         sum+=abs(a-b);
 97         int64 t1=ta.query(b)+b,t2=tb.query(b)-b;
 98         modify(a,min(t1,t2)-abs(a-b));
 99     }
100     int64 tmp=inf;
101     for(register int i=1;i<=n;i++) {
102         tmp=min(tmp,f[i]);
103     }
104     printf("%lld\n",tmp+sum);
105     return 0;
106 }

原来的O(n^2)DP程序:

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<cstring>
 4 #include<cstdlib>
 5 inline unsigned getint() {
 6     register char ch;
 7     while(!isdigit(ch=getchar()));
 8     register unsigned x=ch^'0';
 9     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
10     return x;
11 }
12 inline unsigned min(const unsigned &a,const unsigned &b) {
13     return a<b?a:b;
14 }
15 const unsigned N=200000;
16 unsigned long long f[2][N];
17 unsigned a[2];
18 int main() {
19     unsigned n=getint(),q=getint();
20     memset(f[0],0xff,n<<3);
21     a[0]=getint()-1,f[0][getint()-1]=0;
22     for(register unsigned i=1;i<=q;i++) {
23         a[i&1]=getint()-1;
24         memset(f[i&1],0xff,n<<3);
25         for(register unsigned j=0;j<n;j++) {
26             if(!~f[~i&1][j]) continue;
27             f[i&1][j]=min(f[i&1][j],f[~i&1][j]+abs(a[i&1]-a[~i&1]));
28             f[i&1][a[~i&1]]=min(f[i&1][a[~i&1]],f[~i&1][j]+abs(a[i&1]-j));
29         }
30     }
31     unsigned long long ans=~0;
32     for(register unsigned i=0;i<n;i++) {
33         ans=min(ans,f[q&1][i]);
34     }
35     printf("%llu\n",ans);
36     return 0;
37 }
View Code

 

转载于:https://www.cnblogs.com/skylee03/p/7609824.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenStack —— DevStack一键自动化安装

一、DevStack介绍Devstack目前是支持Ubuntu16.04和CentOS 7&#xff0c;而且Devstack官方建议使用Ubuntu16.04&#xff0c;所以我们使用Ubuntu 16.04进行安装。默认无论是Devstack和OpenStack&#xff0c;都是采用Master的代码进行安装&#xff0c;这样经常会出现&#xff0c;今…

Scala铸造

Scala中的类型 (Types in Scala) Type also know as data type tells the compiler about the type of data that is used by the programmer. For example, if we initialize a value or variable as an integer the compiler will free up 4 bytes of memory space and it wi…

OpenCV探索之路(二十五):制作简易的图像标注小工具

搞图像深度学习的童鞋一定碰过图像数据标注的东西&#xff0c;当我们训练网络时需要训练集数据&#xff0c;但在网上又没有找到自己想要的数据集&#xff0c;这时候就考虑自己制作自己的数据集了&#xff0c;这时就需要对图像进行标注。图像标注是件很枯燥又很费人力物力的一件…

图论 弦_混乱的弦

图论 弦Problem statement: 问题陈述&#xff1a; You are provided an input string S and the string "includehelp". You need to figure out all possible subsequences "includehelp" in the string S? Find out the number of ways in which the s…

「原创」从马云、马化腾、李彦宏的对话,看出三人智慧差在哪里?

在今年中国IT领袖峰会上&#xff0c;马云、马化腾、李彦宏第一次单独合影&#xff0c;同框画面可以说很难得了。BAT关心的走势一直是同行们竞相捕捉的热点&#xff0c;所以三位大Boss在这次大会上关于人工智能的见解&#xff0c;也受到广泛关注与多方解读。马云认为机器比人聪明…

字符串矩阵转换成长字符串_字符串矩阵

字符串矩阵转换成长字符串Description: 描述&#xff1a; In this article, we are going to see how backtracking can be used to solve following problems? 在本文中&#xff0c;我们将看到如何使用回溯来解决以下问题&#xff1f; Problem statement: 问题陈述&#xf…

java awt 按钮响应_Java AWT按钮

java awt 按钮响应The Button class is used to implement a GUI push button. It has a label and generates an event, whenever it is clicked. As mentioned in previous sections, it extends the Component class and implements the Accessible interface. Button类用于…

qgis在地图上画导航线_在Laravel中的航线

qgis在地图上画导航线For further process we need to know something about it, 为了进一步处理&#xff0c;我们需要了解一些有关它的信息&#xff0c; The route is a core part in Laravel because it maps the controller for sending a request which is automatically …

Logistic回归和SVM的异同

这个问题在最近面试的时候被问了几次&#xff0c;让谈一下Logistic回归&#xff08;以下简称LR&#xff09;和SVM的异同。由于之前没有对比分析过&#xff0c;而且不知道从哪个角度去分析&#xff0c;一时语塞&#xff0c;只能不知为不知。 现在对这二者做一个对比分析&#xf…

构建安全网络 比格云全系云产品30天内5折购

一年之计在于春&#xff0c;每年的三、四月&#xff0c;都是个人创业最佳的起步阶段&#xff0c;也是企业采购最火热的时期。为了降低用户的上云成本&#xff0c;让大家能无门槛享受到优质高性能的云服务&#xff0c;比格云从3月16日起&#xff0c;将上线“充值30天内&#xff…

数据结构 基础知识

一。逻辑结构: 是指数据对象中数据 素之间的相互关系。 其实这也是我 今后最需要关注的问题 逻辑结构分为以 四种1. 集合结构 2.线性结构 3.数形结构 4&#xff0c;图形结构 二。物理结构&#xff1a; 1&#xff0c;顺序存储结,2 2. 链式存储结构 一&#xff0c;时间复杂…

ruby 变量类中范围_Ruby中的类

ruby 变量类中范围Ruby类 (Ruby Classes) In the actual world, we have many objects which belong to the same category. For instance, I am working on my laptop and this laptop is one of those laptops which exist around the globe. So, this laptop is an object o…

以云计算的名义 驻云科技牵手阿里云

本文讲的是以云计算的名义 驻云科技牵手阿里云一次三个公司的牵手 可能会改变无数企业的命运 2017年4月17日&#xff0c;对于很多人来说可能只是个平常的工作日&#xff0c;但是对于国内无数的企业来说却可能是个会改变企业命运的日。驻云科技联合国内云服务提供商阿里云及国外…

浏览器端已支持 ES6 规范(包括 export import)

当然&#xff0c;是几个比较优秀的浏览器&#xff0c;既然是优秀的浏览器&#xff0c;大家肯定知道是那几款啦&#xff0c;我就不列举了&#xff0c;我用的是 chrome。 对 script 声明 type 为 module 后就可以享受 es6 规范所带来的模块快感了。 基础语法既然是全支持&#xf…

一文读懂深度学习框架下的目标检测(附数据集)

从简单的图像分类到3D位置估算&#xff0c;在机器视觉领域里从来都不乏有趣的问题。其中我们最感兴趣的问题之一就是目标检测。 如同其他的机器视觉问题一样&#xff0c;目标检测目前为止还没有公认最好的解决方法。在了解目标检测之前&#xff0c;让我们先快速地了解一下这个领…

设计一个应用程序,以在C#中的按钮单击事件上在MessageBox中显示TextBox中的文本...

Here, we took two controls on windows form that are TextBox and Button, named txtInput and btnShow respectively. We have to write C# code to display TextBox’s text in the MessageBox on Button Click. 在这里&#xff0c;我们在Windows窗体上使用了两个控件&…

Oracle优化器:星型转换(Star Query Transformation )

Oracle优化器&#xff1a;星型转换&#xff08;Star Query Transformation &#xff09;Star query是一个事实表&#xff08;fact table&#xff09;和一些维度表&#xff08;dimension&#xff09;的join。每个维度表都跟事实表通过主外键join&#xff0c;且每个维度表之间不j…

JavaScript | 声明数组并使用数组索引分配元素的代码

Declare an array, assign elements by indexes and print all elements in JavaScript. 声明一个数组&#xff0c;通过索引分配元素&#xff0c;并打印JavaScript中的所有元素。 Code: 码&#xff1a; <html><head><script>var fruits [];fruits[0]"…

Kubernetes基础组件概述

本文讲的是Kubernetes基础组件概述【编者的话】最近总有同学问Kubernetes中的各个组件的相关问题&#xff0c;其实这些概念内容在官方文档中都有&#xff0c;奈何我们有些同学可能英文不好&#xff0c;又或者懒得去看&#xff0c;又或者没有找到&#xff0c;今天有时间就专门写…

c语言将链表写入二进制文件_通过逐级遍历将二进制树转换为单链表的C程序

c语言将链表写入二进制文件Problem statement: Write a C program to convert a binary tree into a single linked list by traversing level-wise. 问题陈述&#xff1a;编写一个C程序&#xff0c;通过逐级遍历将二进制树转换为单个链表 。 Example: 例&#xff1a; The ab…