[bzoj2259][Oibh]新型计算机_Dijkstra

新型计算机 bzoj-2259 Oibh

题目大意:给定一个n个数的数列,第i个数为a[i],更改第i个数至x的代价为|x-a[i]|。求最小代价,使得:读入一个数s1后,向后连着读s1个数,然后如s2,再向后读s2个数。保证最后恰好读到第n个数。

注释:$1\le n\le 10^6$



想法:又开始了... ...在那里一顿dp...

结果又是一个图论题.. ..这场面好熟悉

我们直接从第i个数像第i+a[i]连一条边权为0的边。然后这时我们思考暴力怎么做?暴力的话从i+a[i]开始像左右依次连边权为1,2,3...的边,然后Dijkstra即可,时空复杂度均为$O(n^2)$。如何优化这一过程?我们思考:其实这中的有些边是没有用的,我们只需要将相邻两个点之间连一条边权为1的边即可。然后堆优化Dij,时间复杂度为O(nlogn)。

正确性:我们发现:绝对值函数f(x)=|x|是一个偶函数,而且是一个线性偶函数,所以这东西支持在符号相同的情况下加减,在符号不同的情况下可以直接通过我们连的边退回去,证毕。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 1000010
#define mp make_pair
using namespace std;
priority_queue<pair<int,int> > pq;
int to[N<<2],nxt[N<<2],val[N<<2],head[N],tot;
int dis[N]; bool lv[N],rv[N],vis[N];
inline void add(int x,int y,int z)
{
    to[++tot]=y;
    val[tot]=z;
    nxt[tot]=head[x];
    head[x]=tot;
}
int main()
{
    int n; cin >> n ;
    for(int u,i=1;i<=n;i++)
	{
		scanf("%d",&u);
		if(i+u>n) add(i,n+1,i+u-n);
		else add(i,i+u+1,0);
		for(int j=i+1;j<=i+u+1&&j<=n&&!lv[j];j++) lv[j]=1,add(j,j-1,1);
		for(int j=i+u+1;j<=n&&!rv[j];j++) rv[j]=1,add(j,j+1,1);
	}
    memset(dis,0x3f,sizeof(dis));
	pq.push(mp(0,1)),dis[1]=0;
	while(!pq.empty())
	{
		int u=pq.top().second; pq.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=nxt[i])
			if(dis[to[i]]>dis[u]+val[i])
				dis[to[i]]=dis[u]+val[i],pq.push(mp(-dis[to[i]],to[i]));
	}
	printf("%d\n",dis[n+1]);
	return 0;
}

小结:图论真tm难... ...

原文地址:https://www.cnblogs.com/ShuraK/p/9374987.html

时间: 2024-10-06 11:36:28

[bzoj2259][Oibh]新型计算机_Dijkstra的相关文章

BZOJ2259 [Oibh]新型计算机

话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zyk的终于知道了怎么回事>_< 1 /************************************************************** 2 Problem: 2259 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:3220 ms 7 Mem

【BZOJ2259】[Oibh]新型计算机 最短路

[BZOJ2259][Oibh]新型计算机 Description Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有一些数字(都是自然数——自然数包括0),计算机先读取第一个数字S1,然后顺序向后读入S1个数字.接着再读一个数字S2,顺序向后读入S2个数字……依此类推.不过只有计算机正好将输入序列中的数字读完,它才能正确处理数据,否则计算机就会进行自毁性操

bzoj 2259 [Oibh]新型计算机 ——最短路(建图)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2259 不是 n^2 条边!连那条边权为0的边之后,只要每个位置向它的前一个位置和后一个位置连 1 的边,就能等价于一开始就走到那个位置了. 不会有情况使得操作后 a[ i ] 变成负数来走到 j .因为那样一定不如走到 i 的时候别走到 i 而是直接走到 j . 注意1号点.如果每个点都向后连 1 的边,最大代价岂不是不大于 n ?所以 1 不能向 2 连边权为1的边,因为1是起点,没有转

Google的量子计算之梦:比传统计算机快上1亿倍?

Google的量子计算之梦:比传统计算机快上1亿倍? 本文来自technologyreview,作者 Tom Simonite ,机器之心编译出品,参与:salmoner,薛矽,汪汪,微胖. 近日,谷歌宣布他们的量子计算机比传统计算机快上1亿倍,有人欢呼雀跃,有人提出质疑.让我们来看看背后的故事吧,看看物理学家John Martinis 如何帮谷歌实现炙手可热的量子计算之梦.他或许正手握着量子计算的圣杯,本文选自麻省理工科技评论. Martini团队追寻的神奇计算机 John Martinis用

计算机

计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件系统和软件系统所组成,没有安装任何软件的计算机称为裸机.可分为超级计算机.工业控制计算机.网络计算机.个人计算机.嵌入式计算机五类,较先进的计算机有生物计算机.光子计算机.量子计算机等.    计算机发明者约翰·冯·诺依曼.计算机是20世纪最先进的科学技术发明之一,对人类的生产活动和社会活动产生了极其

题目12:计算机芯片的发展历史

引用: http://wenku.baidu.com/view/d1d46c0ef78a6529647d5331.html http://www.docin.com/p-230059948.html 基本概念 计算机芯片:芯片组决定了主板的功能,是主板的灵魂. 分类:北桥芯片.南桥芯片. 北桥芯片提供对CPU的类型和主频.内存的类型和最大容量.ISA/PCI/AGP插槽.ECC纠错等支持.南桥芯片则提供对KBC(键盘控制器).RTC(实时时钟控制器).USB(通用串行总线).Ultra DMA/

计算机专业考研方向2011考研

计算机专业考研方向2011考研1  计算机系统结构计算机系统结构二级学科研究并行分布计算.新型计算机.计算机网络与通信.嵌入式系统.集成电路设计.信息存储.可信计算与容错计算等方向.其排名如下: 排名   校名   等级   排名   校名   等级   1   清华大学   A++   10   吉林大学   A   2   浙江大学   A++   11   电子科技大学   A   3   华中科技大学   A+   12   北京邮电大学   B+   4   北京大学   A+   1

计算机考研方向

本文复制了网上的一些资料,为了方便自己以后查阅. 摘自:百度知道 若比邻001的回答 在考研中计算机科学与技术属于工学门类里的一级学科,其有分为三个二级学科:分别是计算机系统结构,计算机软件与理论,计算机应用,每个二级学科下面又分若干研究方向,相关信息如下: 1.计算机系统结构 计算机系统结构二级学科研究并行分布计算.新型计算机.计算机网络与通信.嵌入式系统.集成电路设计.信息存储.可信计算与容错计算等方向. 2.计算机软件与理论 计 算机软件与理论主要包括软件设计.开发.维护和使用过程中涉及的

计算机发展趋势

计算机已经从功能单一.体积较大发展到了功能复杂.体积微小.资源网络化等. 计算机的未来充满了变数,性能的大幅度提高是不可置疑的,而实现性能的飞跃却有多种途径.性能的大幅提升并不是计算机发展的唯一路线,计算机的发展还应当变得越来越人性化,同时也要注重环保等等. 计算机从出现至今,编程语言经历了机器语言.汇编语言.高级语言:操作系统经历了简单操作系统和Linux.Macos.BSD.Windows等现代操作系统四代, 运行速度也得到了极大的提升,第四代计算机的运算速度已经达到几十亿次每秒. 计算机也