博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2459 : [BeiJing2011]神秘好人
阅读量:5112 次
发布时间:2019-06-13

本文共 1446 字,大约阅读时间需要 4 分钟。

线段树每个节点维护d[4][4]表示四个顶点之间的最短路,合并时用Floyed合并,查询时分三段然后合并。

 

#include
#define N 100010struct 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
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
<<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
<<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
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
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
<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;}

  

 

转载于:https://www.cnblogs.com/clrs97/p/4403178.html

你可能感兴趣的文章
《Windows Mobile平台应用与开发》写作工作顺利进行中
查看>>
过滤机的故障排除
查看>>
javascript小技巧
查看>>
C#登录窗口(访问数据库)的制作,类文件的制作及使用
查看>>
大小写转换
查看>>
[树状数组][二分] 洛谷 P2161 会场预约
查看>>
[数位dp] Jzoj P4239 光棍
查看>>
167. Two Sum II - Input array is sorted两数之和
查看>>
面试中关于Java你所需知道的的一切
查看>>
由一个activity跳转到另一个activity
查看>>
PLSQL
查看>>
浮动float的一些规则
查看>>
跳频通信(梅文华)pdf
查看>>
Java基础-重要版本
查看>>
POJ1006 中国剩余定理
查看>>
部署JUnit
查看>>
【图论 搜索】bzoj1064: [Noi2008]假面舞会
查看>>
Python补充之函数
查看>>
获取含有class为某个值的a标签或img标签
查看>>
接口测试概念
查看>>