线段树每个节点维护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]神秘好人的更多相关文章

  1. 【BZOJ2459】 [BeiJing2011]神秘好人

    Description 有一个神秘好人跟Bdcxq玩一个游戏,如果Bdcxq成功完成了这个游戏,那么他将会得到一件礼物. 这个游戏是这样的: 有一个梯子形的图如下,每条边都有一个权值. 神秘好人一开始 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 神秘代理-Proxy

    前言: 代理模式作为常见的设计模式之一,在项目开发中不可或缺.本文就尝试着揭开代理的神秘面纱,也欢迎各路人批评指正! 1.如何实现代理: [假设有个关于汽车移动(move)的计时需求]设计:Movea ...

  4. 深入理解javascript对象系列第三篇——神秘的属性描述符

    × 目录 [1]类型 [2]方法 [3]详述[4]状态 前面的话 对于操作系统中的文件,我们可以驾轻就熟将其设置为只读.隐藏.系统文件或普通文件.于对象来说,属性描述符提供类似的功能,用来描述对象的值 ...

  5. BZOJ 2462: [BeiJing2011]矩阵模板

    2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Stat ...

  6. [BZOJ4408][Fjoi 2016]神秘数

    [BZOJ4408][Fjoi 2016]神秘数 试题描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1 ...

  7. 在c++这片神秘的大陆上

    在c++这片神秘的大陆上,有一个无往而不利的地下王国,据说其手段血腥残忍,却深得民心,因为,他们是侠,是剑胆琴心,诗肠酒骨的侠客,他们不知解决了多少疑难杂症,除去了多少问题漏洞,而他们的首领-> ...

  8. 揭开GrowingIO无埋点的神秘面纱

    揭开GrowingIO无埋点的神秘面纱   早在研究用户行为分析的时候,就发现国内的GrowingIO在宣传无埋点技术,最近正好抽出时间来研究一下所谓的无埋点到底是什么样的. 我分六部分来分析一下无埋 ...

  9. [bzoj4408][Fjoi2016]神秘数

    Description 一个可重复数字集合$S$的神秘数定义为最小的不能被$S$的子集的和表示的正整数. 例如$S={1,1,1,4,13}$, $1=1$, $2=1+1$, $3=1+1+1$, ...

随机推荐

  1. Stanford机器学习---第九讲. 聚类

    原文:http://blog.csdn.net/abcjennifer/article/details/7914952 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  2. C/C++ 文件操作

    C/C++ 文件操作大概有以下几种 1.C的文件操作: 2.C++的文件操作: 3.WINAPI的文件操作: 4.BCB库的文件操作: 5.特殊文件的操作. 当然了,水题时最常用的当然还是: freo ...

  3. Redis学习手册(Sorted-Sets数据类型)

    一.概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score ...

  4. VMware Snapshot 工作原理

    VMware中的快照是对VMDK在某个时间点的“拷贝”,这个“拷贝”并不是对VMDK文件的复制,而是保持磁盘文件和系统内存在该时间点的状态,以便在出现故障后虚拟机能够恢复到该时间点.如果对某个虚拟机创 ...

  5. 《ASP.NET1200例》统计网站访问量源代码

    void Application_Start(object sender, EventArgs e)     {        //在应用程序启动时运行的代码        int count=0;  ...

  6. Selenium webdriver 学习总结-元素定位

    Selenium webdriver 学习总结-元素定位 webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要 ...

  7. Cocos2d 学习资料推荐

    总算找到了一本介绍cocos2d的好书,注意,不是cocos2d-x!这本书叫 <cocos2d 权威指南> 定价99元,淘宝60多元,详细介绍了cocos2d的各个方面!不过你需要有oc ...

  8. 在eclipse中进行Struts2项目的配置

    Struts2是一个比较出色的基于MVC设计模式的框架,是由Struts1和WebWork发展而来的,性能也比较稳定,现在是Apache软件基金会的一个项目,下面就来配置Struts2进行初始化的开发 ...

  9. 六间房PK同时观看两方视频(绕过VIP限制)+直播状态批量监测

    可交换两个视频位置,记住最后播放记录,游客VIP限制也能观看视频等功能. 使用方法: 1.先运行 6.cn.live.exe 分别打开两个主播房间的网页(VIP限制也能获取视频的文件名) (房间已满提 ...

  10. tomcat启动,输出system.out.println()

    tomcat6.0在使用System.out.println("aa")的时候,用cmd启动startup.bat,弹出的那个cmd窗口看到 还可以看logs/catalina.o ...