noip2012 开车旅行
此题100分的解法就是先预处理出每个点的下一个点之后倍增就好了。其实并没有太大难度。
pbihao用双向链表写过了此题。在本地上我treap狂操他,but在rqnoj上,我依靠反复提交才A掉此题(最后一组数据为999ms)。treap好看脸啊。
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100005
#define inf (1LL<<60)
#define ll long long
#define pli pair<long long,int>
#define pll pair<long long,long long>
#define FI "drive"
int nxt[N][17],da[N][17],db[N][17],na[N],nb[N],H[N];
int ina; char inc,inb[1<<16],*ins=inb,*ine=inb; bool insign;
#define getc() ((ins==ine&&(ine=(ins=inb)+fread(inb,1,1<<16,stdin),ins==ine))?EOF:*ins++)
inline int geti() {
    for(insign=false;(inc=getc())<'0'||inc>'9';insign|=inc=='-');
    for(ina=inc-'0';(inc=getc())>='0'&&inc<='9';ina=(ina<<3)+(ina<<1)+inc-'0');
	return insign?-ina:ina;
}
ll iabs_t;
#define iabs(a) ((iabs_t=(a))<0?-iabs_t:iabs_t)
inline void cal(int s,int x,int &t1,int &t2) {
	t1=t2=0;
	for(int i=14;~i;--i)
		if(nxt[s][i]&&t1+da[s][i]+t2+db[s][i]<=x){
			t1+=da[s][i],t2+=db[s][i];
			s=nxt[s][i];
		}
}
int totnode,ch[2][N],r[N],root,id[N]; ll v[N];
inline void rot(int &u,int d) {
	int t=ch[d^1][u]; ch[d^1][u]=ch[d][t];
	ch[d][t]=u; u=t;
}
void Ins(int &u,const ll&val,int idx) {
	if(!u){
		u=++totnode;v[u]=val,r[u]=rand(),id[u]=idx;
		ch[0][u]=ch[1][u]=0; return;
	}
	int k=val<v[u]?0:1;
	Ins(ch[k][u],val,idx);
	if(r[ch[k][u]]>r[u]) rot(u,k^1);
}
inline int find(int val) {
	int u=root;
	while(u) {
		if(v[u]==val) return u;
		u=ch[v[u]<val][u];
	}return 0;
}
int pred(int u,const ll&val) {
	if(!u) return -1;
	if(val<=v[u]) return pred(ch[0][u],val);
	int t=pred(ch[1][u],val); if(t<0) t=u;
	return t;
}
int succ(int u,const ll&val) {
	if(!u) return -1;
    if(val>=v[u]) return succ(ch[1][u],val);
	int t=succ(ch[0][u],val); if(t<0) t=u;
	return t;
}
int main() {
	freopen(FI".in","r",stdin); freopen(FI".out","w",stdout);
	int n,i,j,s,x,m; pll t[5]; root=totnode=0;
	for(n=geti(),i=1;i<=n;++i) H[i]=geti(); srand(time(NULL));
	Ins(root,inf,0); Ins(root,-inf,0);
	for(i=n;i;--i) { Ins(root,H[i],i);
		t[1].second=v[pred(root,H[i])],t[2].second=v[succ(root,H[i])];
		if(t[1].second>-inf) t[3].second=v[pred(root,t[1].second)];
		else t[3].second=-inf;
		if(t[2].second<inf) t[4].second=v[succ(root,t[2].second)];
		else t[4].second=inf;
		for(j=1;j<5;++j) t[j].first=iabs(t[j].second-H[i]);
		sort(t+1,t+5);
		na[i]=id[find(t[2].second)],nb[i]=id[find(t[1].second)];
		(na[i])?da[i][0]=t[2].first:1;
		(nb[na[i]])?db[i][1]=iabs(H[na[i]]-H[nb[na[i]]]),da[i][1]=t[2].first:1;
		nxt[i][0]=na[i],nxt[i][1]=nb[na[i]];
		for(j=2;j<15;++j)
			if(nxt[nxt[i][j-1]][j-1]) {
				nxt[i][j]=nxt[nxt[i][j-1]][j-1];
				da[i][j]=da[i][j-1]+da[nxt[i][j-1]][j-1];
				db[i][j]=db[i][j-1]+db[nxt[i][j-1]][j-1];
			}else break;
	}
	int t1,t2; x=geti(); double mi=inf,_t;
	for(i=1;i<=n;++i) {
		cal(i,x,t1,t2);
		_t=t2?(double)t1/t2:1e60;
		if(_t<mi||(_t==mi&&H[j]<H[i])) j=i,mi=_t;
	}printf("%d\n",j);
	for(m=geti();m;--m) {
		s=geti(),x=geti();
		cal(s,x,t1,t2);
		printf("%d %d\n",t1,t2);
	}return 0;
}
update:今天写了一份用指针的,快了好多。
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf (1LL<<60)
#define ll long long
#define pli pair<long long,int>
#define pll pair<long long,long long>
char INB[1<<16],*INS=INB,*INE=INB;
#define getc() (INS==INE&&(INE=(INS=INB)+fread(INB,1,1<<16,stdin),INS==INE)?EOF:*INS++)
inline int geti() {
	register int a; register char c,f=0;
	while(c=getc(),c<'0')f|=c=='-';a=c-'0';
	while(c=getc(),'-'<c)a=(a<<3)+(a<<1)+c-'0';
	return f?-a:a;
}
ll ibs_t;
#define ibs(a) ((ibs_t=(a))<0?-ibs_t:ibs_t)
/*template*/
#define N 100005
int nxt[17][N],da[17][N],db[17][N],na[N],nb[N],H[N];
inline void cal(int s,int x,int&t1,int&t2) {
	t1=t2=0;
	for(register int i=16;~i;--i)
		if(nxt[i][s]&&t1+da[i][s]+t2+db[i][s]<=x) {
			t1+=da[i][s];
			t2+=db[i][s];
			s=nxt[i][s];
		}
}
struct node{
	int r,id; ll v;
	node*ch[2];
}CD[N],*cd=CD,*root=NULL;
inline void rot(node*(&u),const int&d) {
	node*t=u->ch[d^1];u->ch[d^1]=t->ch[d];
	t->ch[d]=u; u=t;
}
void ins(node*(&u),const ll&val,const int&idx) {
	if(!u) {
		u=cd++; u->v=val,u->id=idx,u->r=rand();
		u->ch[0]=u->ch[1]=NULL; return;
	}
	int k=val<u->v?0:1;
	ins(u->ch[k],val,idx);
	if(u->ch[k]->r>u->r) rot(u,k^1);
}
inline node*find(const ll&val) {
	node*u=root;
	while(u) {
		if(u->v==val) return u;
		u=u->ch[u->v<val];
	}return NULL;
}
inline node*pred(const ll&val) {
	node*u=root,*r=NULL;
	while(u){
		if(u->v<val) r=u,u=u->ch[1];
		else u=u->ch[0];
	}
	return r;
}
inline node*succ(const ll&val) {
	node*u=root,*r=NULL;
	while(u) {
		if(val<u->v) r=u,u=u->ch[0];
		else u=u->ch[1];
	}
	return r;
}
int main() {
	register int n,i,j,s,x,m; pll t[5];
	for(n=geti(),i=1;i<=n;++i) H[i]=geti();
	srand(time(NULL));
	ins(root,inf,0); ins(root,-inf,0);
	for(i=n;i;--i) {
		ins(root,H[i],i);
		t[1].second=pred(H[i])->v,t[2].second=succ(H[i])->v;
		if(t[1].second>-inf) t[3].second=pred(t[1].second)->v;
		else t[3].second=-inf;
		if(t[2].second<inf) t[4].second=succ(t[2].second)->v;
		else t[4].second=inf;
		for(j=1;j<5;++j) t[j].first=ibs(t[j].second-H[i]);
		sort(t+1,t+5);
		if(nxt[0][i]=na[i]=find(t[2].second)->id) da[0][i]=t[2].first;
		nb[i]=find(t[1].second)->id;
		if(nxt[1][i]=nb[na[i]]) db[1][i]=ibs(H[na[i]]-H[nb[na[i]]]),da[1][i]=t[2].first;
		for(j=2;j^17;++j)
			if(nxt[j][i]=nxt[j-1][nxt[j-1][i]]) {
				da[j][i]=da[j-1][i]+da[j-1][nxt[j-1][i]];
				db[j][i]=db[j-1][i]+db[j-1][nxt[j-1][i]];
			}else break;
	}
	int t1,t2; x=geti(); double mi=inf,_t;
	for(i=1;i<=n;++i) {
		cal(i,x,t1,t2);
		_t=t2?(double)t1/t2:1e60;
		if(_t<mi||(_t==mi&&H[j]<H[i])) j=i,mi=_t;
	}printf("%d\n",j);
	for(m=geti();m;--m) {
		s=geti(),x=geti();
		cal(s,x,t1,t2);
		printf("%d %d\n",t1,t2);
	}return 0;
}
												
											noip2012 开车旅行的更多相关文章
- Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)
		
1264. [NOIP2012] 开车旅行 ★★☆ 输入文件:drive.in 输出文件:drive.out 简单对比时间限制:2 s 内存限制:128 MB [题目描述] 小A 和小 ...
 - P1081 [NOIP2012]开车旅行[倍增]
		
P1081 开车旅行 题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...
 - noip2012开车旅行 题解
		
题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...
 - NOIP2012开车旅行  【倍增】
		
题目 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城 ...
 - Luogu 1081 [NOIP2012] 开车旅行
		
感谢$LOJ$的数据让我调掉此题. 这道题的难点真的是预处理啊…… 首先我们预处理出小$A$和小$B$在每一个城市的时候会走向哪一个城市$ga_i$和$gb_i$,我们有链表和平衡树可以解决这个问题( ...
 - Luogu1081 NOIP2012 开车旅行 倍增
		
题目传送门 为什么NOIP的题目都这么长qwq 话说2012的D1T3和D2T3都是大火题啊qwq 预处理神题 对于这种跳跳跳的题目考虑使用倍增优化枚举.先预处理某个点之后距离最小和次小的城市,然后倍 ...
 - luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
		
先用不管什么方法求出来从每个点出发,A走到哪.B走到哪(我写了一个很沙雕的STL) 然后把每个点拆成两个点,分别表示A从这里出发和B从这里出发,然后连边是要A连到B.B连到A.边长就是这次走的路径长度 ...
 - 洛谷1081 (NOIp2012) 开车旅行——倍增预处理
		
题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...
 - Luogu 1081 【NOIP2012】开车旅行 (链表,倍增)
		
Luogu 1081 [NOIP2012]开车旅行 (链表,倍增) Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已 ...
 
随机推荐
- 当Eclipse报版本低时的处理方法
			
http://blog.sina.com.cn/s/blog_6f0c85e10100v6pv.html 更新到API12的时候出过问题,这一次难免又会出现了,不过我的版本还真全啊,哇咔咔~ 这里 ...
 - ListView之点击展开菜单
			
一.概述 ListView点击item显示菜单是要实现这样的效果: 需要实现的逻辑如下: 1)点击一个普通item,展开当前菜单,同时关闭其他菜单 2)点击一个已展开的菜单,隐藏当前菜单 3)将展开菜 ...
 - 面向初学者之烦人的mainactivity启动前的actionBAR
			
相信各位初学者的童鞋都遇到过一个问题,(大神们就别喷我哦,多多帮帮指正,嘿嘿)那就是当你点开你开发的软件或者是dome时,会发现这么一个问题: 你曾今以为你的软件点开的时候是这样的: 然而事实是残酷的 ...
 - 20-C语言结束
			
我回去看了下5号写的.虽然今天已经21号了~,花了16天. 复习完C专题,接下来我大概会用C做一些操作系统/信息安全的小东西,会发到博客里,敬请期待! ----2016/11/21
 - vs2010中如何设置Visual Assist方便地使用现成的代码编辑器风格
			
风格setting可以在下面网站上获取: http://studiostyl.es/ 在VS2010+VA直接使用会有2个显著的问题: 1,有些符号颜色太深,与黑色背景几乎融为一体: 2,光标落入大小 ...
 - MVC学习系列4--@helper辅助方法和用户自定义HTML方法
			
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...
 - Sybase_游标
			
本章将介绍如何在Sybase下使用游标 因业务需要,要批量处理一些数据,sql需要用到循环,所以要使用游标,我写了一个简单的游标,sql如下 DECLARE my_Cursor CURSOR FOR ...
 - ERR_CONTENT_DECODING_FAILED错误的原因和解决办法
			
1. ERR_CONTENT_DECODING_FAILED错误的原因 这种错误通常发生于Http请求中的头部信息标识内容是gzip编码的,但实际上不是. 2. ERR_CONTENT_DECODIN ...
 - Java类加载基本过程
			
基本过程: 根据类的全限定名称加载定义类的二进制字节流. 将字节流代表的静态存储结构转化为方法区的运行时数据结构 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各 ...
 - 错误: “WebForm_DoPostBackWithOptions”未定义
			
无论是ASP.NET WebForm 还是 ASP.NET MVC项目,在本地程序测试没问题,但是部署在IIS上访问就会出现 错误: “WebForm_DoPostBackWithOptions”未 ...