http://codeforces.com/problemset/problem/413/E

  给出一个2*N的格子图,每个格子要么是障碍要么是空地,M次询问(A,B)之间的最短距离。

   采用分治的思想,由于只有两行,那么对于任意两列,起点和终点的组合方式只有四种,令d[i][]表示第i个节点对应的区间内,左上-右上,左下-右下,左上-右下,左下-右上的最短路,询问的时候也返回

一个一维数组就好了,对应四种不同的走向。

  zb的写了个LL*返回结果调试半天,发现指向的是一片临时区域,函数结束时销毁了这片内存所以值在中间就没了= =。换了new就好了。

 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define pii pair<int,int>
#define mid ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
#define pb push_back
#define mp make_pair
#define inf 500000
#define linf 0xffffffffffff
const int maxn=;
char e[][maxn];
LL d[maxn<<][];
void build(int id,int L,int R){
if(L==R){
d[id][]=e[][L]=='X'?inf:;
d[id][]=e[][L]=='X'?inf:;
d[id][]=e[][L]=='X'||e[][L]=='X'?inf:;
d[id][]=e[][L]=='X'||e[][L]=='X'?inf:;
}
else{
build(lc,L,mid);
build(rc,mid+,R);
{
d[id][]=+min(d[lc][]+d[rc][],d[lc][]+d[rc][]);
d[id][]=+min(d[lc][]+d[rc][],d[lc][]+d[rc][]);
d[id][]=+min(d[lc][]+d[rc][],d[lc][]+d[rc][]);
d[id][]=+min(d[lc][]+d[rc][],d[lc][]+d[rc][]);
}
}
}
int tot=;
LL* ask(int id,int L,int R,int l,int r){
if(L>=l&&R<=r){
return d[id];
}
if(r<=mid){
return ask(lc,L,mid,l,r);
}
else if(l>mid){
return ask(rc,mid+,R,l,r);
}
else{
LL *p=ask(lc,L,mid,l,r),*q=ask(rc,mid+,R,l,r);
LL *ret=new LL[];
{
ret[]=+min(p[]+q[],p[]+q[]);
ret[]=+min(p[]+q[],p[]+q[]);
ret[]=+min(p[]+q[],p[]+q[]);
ret[]=+min(p[]+q[],p[]+q[]);
}
return ret;
}
}
int main()
{
int u,v,N,M,i;
scanf("%d%d",&N,&M);
scanf("%s %s",e[]+,e[]+);
build(,,N);
while(M--){
scanf("%d%d",&u,&v);
int _u=(u-)%N+,_v=(v-)%N+;
if(_u>_v)swap(_u,_v),swap(u,v);
LL *ans;
ans=ask(,,N,_u,_v);
if(u<=N&&v<=N&&ans[]<inf){
printf("%lld\n",ans[]);
}
else if(u>N&&v>N&&ans[]<inf){
printf("%lld\n",ans[]);
}
else if(u<=N&&v>N&&ans[]<inf){
printf("%lld\n",ans[]);
}
else if(u>N&&v<=N&&ans[]<inf){
printf("%lld\n",ans[]);
}
else{
puts("-1");
}
}
return ;
}

CF-413E-线段树的更多相关文章

  1. CF 19D 线段树+set压缩坐标轴+离散化map

    题意: n个操作,在200000*200000的平面上加删点 find 严格在坐标右上角,x最小,再y最小的点 线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y ...

  2. CF 552(div 3) E Two Teams 线段树,模拟链表

    题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...

  3. CF 1023D Array Restoration - 线段树

    题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...

  4. cf 786 B 线段树优化建图

    cf 786 B 链接 CF 思路 n个点,3种建边方式,规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊,说好的v,u变成了u,v. 两棵树,一棵出,一棵入.线段树的作用只不过是按照 ...

  5. CF 787D Legacy(线段树思想构图+最短路)

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  6. CF 666E Forensic Examination 【SAM 倍增 线段树合并】

    CF 666E Forensic Examination 题意: 给出一个串\(s\)和\(n\)个串\(t_i\),\(q\)次询问,每次询问串\(s\)的子串\(s[p_l:p_r]\)在串\(t ...

  7. DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)

    题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...

  8. CF #296 (Div. 1) A. Glass Carving 线段树

    A. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. [CF 474E] Pillars (线段树+dp)

    题目链接:http://codeforces.com/contest/474/problem/F 意思是给你两个数n和d,下面给你n座山的高度. 一个人任意选择一座山作为起始点,向右跳,但是只能跳到高 ...

  10. CF 197 DIV2 Xenia and Bit Operations 线段树

    线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...

随机推荐

  1. Hadoop【单机安装-测试程序WordCount】

    Hadoop程序说明,就是创建一个文本文件,然后统计这个文本文件中单词出现过多少次! (MapReduce 运行在本地   启动JVM ) 第一步    创建需要的文件目录,然后进入该文件中进行编辑 ...

  2. Docker Builders:Builder pattern vs. Multi-stage builds in Docker

    原文链接 Builder pattern vs. Multi-stage builds in Docker This post looks at two new PRs from the Docker ...

  3. 防止网站检测出Selenium的window.navigator.webdriver属性

    只需在Chromeoptions对象中添加一个属性即可解决 import time from selenium.webdriver import Chrome, ChromeOptions optio ...

  4. 3D场景鼠标点选择物体

    对于以下几种选择: (1)点云: (2)线框: (3)网格: 针对以上准备三个函数: (1)获取点和线段最短距离函数: (2)获取线段和线段最短距离函数: (3)获取三角面片和线段最短距离函数: 算法 ...

  5. python学习 day05打卡

    今天可变学习的主要内容是 : 本节主要内容: 1.字典的简单介绍 2.字典增删改查和其他操作 3.字典的嵌套 一.字典的简单介绍 字典(dict)是pytho中唯一的一个映射类型.它是以{}括起来的键 ...

  6. 安装ik分词器以及版本和ES版本的兼容性

    一.查看自己ES的版本号与之对应的IK分词器版本 https://github.com/medcl/elasticsearch-analysis-ik/blob/master/README.md 二. ...

  7. tensorflow学习笔记一------下载安装,配置环境(基于ubuntu16.04 pycharm)

    一,安装TensorFlow 安装所有必备工具 sudo apt-get install python-pip python-dev python-virtualenv 安装TensorFlow su ...

  8. 求1000以内的质数c语言

    之前在做求1000以内的质数的时候,我们一般能想到的就是从3~(根号)no,逐一和no除,如果存在某个i使得  i|no成立的话,说明no不是质数(“i|no”是i整除除no的意思): 在<明解 ...

  9. EasyUI datebox 设置不可编辑后再次修改为可编辑失效的解决

    工作中遇到的问题,折腾了好久: 如下图: 需求:当状态发生改变后,如果状态是未核实 ,  核实人 核实时间 核实结果 核实说明  均为不可编辑状态 具体js代码如下: //状态改变    $('#js ...

  10. Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...