博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uoj118 【UR #8】赴京赶考
阅读量:5146 次
发布时间:2019-06-13

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

不难发现我们直接走过去就行了

考虑到第\(i\)行的构造方法就是把\(b\)数组作为模板,每个数和\(a_i\)异或一下就可以了

于是不难发现对于一段连续相等的\(a\),它们在矩阵上就形成了完全相同的好几行

同时这个矩阵上只有两种本质不同的行,一种是\(b\)\(1\)异或得到的,一种是和\(0\)异或得到的

显然我们从\((x_s,y_s)\)走到\((x_e,y_e)\)从中间的任意一行切换过去都是等价的,因为从\(y_s\)走到\(y_e\)在任何一行的代价都是一样的

于是我们把问题转化成了两个一维的问题,即从\(x_s\)走到\(x_e\)的代价加上从\(y_s\)走到\(y_e\)

把连续相同的一段缩成一个点,就是求一下环上的距离

代码

#include
#define re register#define min(a,b) ((a)<(b)?(a):(b))const int maxn=1e5+5;inline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}int col[2][maxn],a[maxn],b[maxn],x[2],y[2],n,m,Q,L[2];inline int dis(int o,int x,int y) { if(x>y) std::swap(x,y); return min(y-x,L[o]-y+x);}int main() { n=read(),m=read(); for(re int i=1;i<=n;i++) a[i]=read(); for(re int j=1;j<=m;j++) b[j]=read(); int tot=1;col[0][1]=1; for(re int i=2;i<=n;i++) tot+=(a[i]!=a[i-1]),col[0][i]=tot; if(a[n]==a[1]) { for(re int i=n;i&&col[0][i]==tot;--i) col[0][i]=1; --tot; } L[0]=tot;tot=1;col[1][1]=1; for(re int i=2;i<=m;i++) tot+=(b[i]!=b[i-1]),col[1][i]=tot; if(b[m]==b[1]) { for(re int i=m;i&&col[1][i]==tot;--i) col[1][i]=1; --tot; } L[1]=tot;Q=read(); while(Q--) { x[0]=read(),y[0]=read(),x[1]=read(),y[1]=read(); printf("%d\n",dis(0,col[0][x[0]],col[0][x[1]])+dis(1,col[1][y[0]],col[1][y[1]])); } return 0;}

转载于:https://www.cnblogs.com/asuldb/p/11449049.html

你可能感兴趣的文章
Java数据结构和算法(四)--链表
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
Attributes.Add用途与用法
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
OpenFire 的安装和配置
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>