BZOJ2459 : [BeiJing2011]神秘好人
线段树每个节点维护d[4][4]表示四个顶点之间的最短路,合并时用Floyed合并,查询时分三段然后合并。
#include<cstdio>
#define N 100010
struct P{int d[4][4];}T[N<<2],tmp;
int n,m,op,x,y,u,v,i,j,k,a[N],b[N],c[N],f[8][8],g[8][8],inf=~0U>>2,flag,ans,d1,d2;
inline void up(int&x,int y){if(x>y)x=y;}
inline void floyed(int n){for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)up(f[i][j],f[i][k]+f[k][j]);}
inline void cal(P&x,int p){
for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==j)f[i][j]=0;else f[i][j]=inf;
f[0][1]=f[1][0]=b[p];
f[2][3]=f[3][2]=b[p+1];
f[0][2]=f[2][0]=a[p];
f[1][3]=f[3][1]=c[p];
floyed(4);
for(i=0;i<4;i++)for(j=0;j<4;j++)x.d[i][j]=f[i][j];
}
inline void up(P&x,P l,P r){
for(i=0;i<6;i++)for(j=0;j<6;j++)if(i==j)f[i][j]=0;else f[i][j]=inf;
for(i=0;i<4;i++)for(j=0;j<4;j++)up(f[i][j],l.d[i][j]),up(f[i+2][j+2],r.d[i][j]);
floyed(6);
for(i=0;i<4;i++)for(j=0;j<4;j++)x.d[i][j]=f[i>1?i+2:i][j>1?j+2:j];
}
void build(int x,int a,int b){
if(a+1==b){cal(T[x],a);return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid,b),up(T[x],T[x<<1],T[x<<1|1]);
}
void change(int x,int a,int b,int c){
if(a+1==b){cal(T[x],a);return;}
int mid=(a+b)>>1;
if(c<mid)change(x<<1,a,mid,c);else change(x<<1|1,mid,b,c);
up(T[x],T[x<<1],T[x<<1|1]);
}
void ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d){
if(!flag)flag=1,tmp=T[x];else up(tmp,tmp,T[x]);
return;
}
int mid=(a+b)>>1;
if(c<mid)ask(x<<1,a,mid,c,d);
if(d>mid)ask(x<<1|1,mid,b,c,d);
}
int main(){
scanf("%d",&n);
for(i=1;i<n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)scanf("%d",&b[i]);
for(i=1;i<n;i++)scanf("%d",&c[i]);
build(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&op,&x,&y);
if(!op){
if(x==0)scanf("%d",&a[y]);
if(x==1)scanf("%d",&b[y]);
if(x==2)scanf("%d",&c[y]);
if(y<n)change(1,1,n,y);
if(y>1)change(1,1,n,y-1);
}else{
if(x==y){puts("0");continue;}
if(x>y)i=x,x=y,y=i;
u=(x+1)/2,v=(y+1)/2,d1=x&1^1,d2=y&1^1;
if(u==v){
ans=b[u];
if(u>1)flag=0,ask(1,1,n,1,u),up(ans,tmp.d[2][3]);
if(u<n)flag=0,ask(1,1,n,u,n),up(ans,tmp.d[0][1]);
}else{
for(i=0;i<8;i++)for(j=0;j<8;j++)if(i==j)g[i][j]=0;else g[i][j]=inf;
flag=0,ask(1,1,n,u,v);
for(i=0;i<4;i++)for(j=0;j<4;j++)up(g[i+2][j+2],tmp.d[i][j]);
if(u>1)for(flag=0,ask(1,1,n,1,u),i=0;i<4;i++)for(j=0;j<4;j++)up(g[i][j],tmp.d[i][j]);
if(v<n)for(flag=0,ask(1,1,n,v,n),i=0;i<4;i++)for(j=0;j<4;j++)up(g[i+4][j+4],tmp.d[i][j]);
for(i=0;i<8;i++)for(j=0;j<8;j++)f[i][j]=g[i][j];
floyed(8);
ans=f[2+d1][4+d2];
}
printf("%d\n",ans);
}
}
return 0;
}
BZOJ2459 : [BeiJing2011]神秘好人的更多相关文章
- 【BZOJ2459】 [BeiJing2011]神秘好人
Description 有一个神秘好人跟Bdcxq玩一个游戏,如果Bdcxq成功完成了这个游戏,那么他将会得到一件礼物. 这个游戏是这样的: 有一个梯子形的图如下,每条边都有一个权值. 神秘好人一开始 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 神秘代理-Proxy
前言: 代理模式作为常见的设计模式之一,在项目开发中不可或缺.本文就尝试着揭开代理的神秘面纱,也欢迎各路人批评指正! 1.如何实现代理: [假设有个关于汽车移动(move)的计时需求]设计:Movea ...
- 深入理解javascript对象系列第三篇——神秘的属性描述符
× 目录 [1]类型 [2]方法 [3]详述[4]状态 前面的话 对于操作系统中的文件,我们可以驾轻就熟将其设置为只读.隐藏.系统文件或普通文件.于对象来说,属性描述符提供类似的功能,用来描述对象的值 ...
- BZOJ 2462: [BeiJing2011]矩阵模板
2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 915 Solved: 432[Submit][Stat ...
- [BZOJ4408][Fjoi 2016]神秘数
[BZOJ4408][Fjoi 2016]神秘数 试题描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1 ...
- 在c++这片神秘的大陆上
在c++这片神秘的大陆上,有一个无往而不利的地下王国,据说其手段血腥残忍,却深得民心,因为,他们是侠,是剑胆琴心,诗肠酒骨的侠客,他们不知解决了多少疑难杂症,除去了多少问题漏洞,而他们的首领-> ...
- 揭开GrowingIO无埋点的神秘面纱
揭开GrowingIO无埋点的神秘面纱 早在研究用户行为分析的时候,就发现国内的GrowingIO在宣传无埋点技术,最近正好抽出时间来研究一下所谓的无埋点到底是什么样的. 我分六部分来分析一下无埋 ...
- [bzoj4408][Fjoi2016]神秘数
Description 一个可重复数字集合$S$的神秘数定义为最小的不能被$S$的子集的和表示的正整数. 例如$S={1,1,1,4,13}$, $1=1$, $2=1+1$, $3=1+1+1$, ...
随机推荐
- mac安装最新版本的git
文章转载自我的个人博客 http://www.iwangzheng.com/ 1.下载一个安装包哦 在mac下安装git,首先下载一个git安装包,这里我选的是git-1.9.3.tar , 因为这是 ...
- 把 表拷贝到test测试数据库
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) bundle exec rake db:schema:load RAILS_ENV=test 注 ...
- (转)女生应该找一个玩ACM的男生
1.强烈的事业心 将来,他也一定会有自己热爱的事业.而且,男人最性感的时刻之一,就是他专心致志做事的时候.所以,找一个机会在他全神贯注玩ACM的时候,从侧面好好观察他,你就会发现我说的话没错. 2.永 ...
- 写时复制技术(Copy-on-write)
COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制" ...
- Mysql函数集合
Mysql提供了很多函数 提供的常用函数集合 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整 ...
- linux下统计当前目录下文件个数
ls | wc -l 转自:http://bbs.csdn.net/topics/60387132
- 【OpenStack】OpenStack系列17之OpenStack私有云设计一
[软件系统] 1.操作系统(Minimal最小化安装): CentOS-6.6-x86_64,CentOS 6最后一个版本,官方建议版本. 相对于6.5版本: 强化对 SCSI 设备的处理,有助应付某 ...
- 《ASP.NET MVC4 WEB编程》学习笔记------ViewBag、ViewData和TempData的使用和区别
本文转自大卫Baby ViewBag和ViewData其实是互通的ViewBag和ViewData的区别:ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动 ...
- Compare Strings
Compare two strings A and B, determine whether A contains all of the characters in B. The characters ...
- [MySQL] - MySQL的Grant命令
本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...