CF-413E-线段树
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-线段树的更多相关文章
- CF 19D 线段树+set压缩坐标轴+离散化map
题意: n个操作,在200000*200000的平面上加删点 find 严格在坐标右上角,x最小,再y最小的点 线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y ...
- CF 552(div 3) E Two Teams 线段树,模拟链表
题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...
- CF 1023D Array Restoration - 线段树
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...
- cf 786 B 线段树优化建图
cf 786 B 链接 CF 思路 n个点,3种建边方式,规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊,说好的v,u变成了u,v. 两棵树,一棵出,一棵入.线段树的作用只不过是按照 ...
- CF 787D Legacy(线段树思想构图+最短路)
D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- CF 666E Forensic Examination 【SAM 倍增 线段树合并】
CF 666E Forensic Examination 题意: 给出一个串\(s\)和\(n\)个串\(t_i\),\(q\)次询问,每次询问串\(s\)的子串\(s[p_l:p_r]\)在串\(t ...
- DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)
题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...
- 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 ...
- [CF 474E] Pillars (线段树+dp)
题目链接:http://codeforces.com/contest/474/problem/F 意思是给你两个数n和d,下面给你n座山的高度. 一个人任意选择一座山作为起始点,向右跳,但是只能跳到高 ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
随机推荐
- Latex: IEEEtrans模板下 扩大标题宽度
参考: Extending side margins for Title section in IEEEtrans document class Latex: IEEEtrans模板下 扩大标题宽度 ...
- 将一个符合URL格式的字符串变成链接
function replaceURLWithHTMLLinks(text) { /* Example: >>> GateOne.Utils.replaceURLWithHTMLLi ...
- 正则表达式 & re
本节主要内容: 1.正则表达式 2.re模块的使用 一.正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE), 计算机 ...
- Vue--获取数据
一.Jsonp抓取数据 用 npm 安装 jsonp npm install jsonp 创建 jsonp.js import originJsonp from 'jsonp' export defa ...
- _itemmod_stat
制作几种基础模板,用模板快速生成装备 `comment` 备注 `entry`目标装备 entry `src_entry` 模板装备entry `stat_muilt` 属性倍率 `mindmg_mu ...
- 《spring boot 实战》读书笔记
前言:虽然已经用spring boot开发过一套系统,但是之前都是拿来主义,没有系统的,全面的了解过这套框架.现在通过学习<spring boot实战>这本书,希望温故知新.顺便实现自己的 ...
- gensim使用方法以及例子
来自:https://blog.csdn.net/u014595019/article/details/52218249 gensim是一个Python的自然语言处理库,能够将文档根据TF-IDF,L ...
- VIM编辑器和VI编辑器的区别
vi 和vim 的区别 写在前面:这个两个"东西"着实让我烦恼一阵子,但是自己一直没当回事,但是遇到了好几次再决定彻底把他们搞的明白,一下是我通过查找资料了解到的关于这两个编辑器的 ...
- 雷林鹏分享:查看 XML 文件
查看 XML 文件 在所有主流的浏览器中,均能够查看原始的 XML 文件. 不要指望 XML 文件会直接显示为 HTML 页面. 查看 XML 文件 - Tove Jani Reminder Don' ...
- 雷林鹏分享:C# 判断
C# 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C ...