首页 > 其他分享 >P3842 [TJOI2007] 线段

P3842 [TJOI2007] 线段

时间:2024-05-09 20:24:04浏览次数:19  
标签:P3842 每行 int 线段 端点 TJOI2007 dis

洛谷-题目链接

[TJOI2007] 线段

提示

我们选择的路线是

 (1, 1) (1, 6)
 (2, 6) (2, 3)
 (3, 3) (3, 1)
 (4, 1) (4, 2)
 (5, 2) (5, 6)
 (6, 6) (6, 4) (6, 6)

不难计算得到,路程的总长度是 24。

代码代码
#include <bits/stdc++.h>
using namespace std;

const int N = 2e4+5;

int n;
//a[i][0] 表示 第i行的左端点
//a[i][1] 表示 第i行的右端点
//b[i] 表示每行线段的距离
int a[N][2],b[N];
int f[N][2]; //利用发f[i][0],f[i][1] 保存每行左右端点的最短距离

int dis(int x,int y) { //利用 dis() 计算每行的距离
	return abs(x-y);
}
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>a[i][0]>>a[i][1];
		b[i]=a[i][1]-a[i][0];
	}
	
	f[1][0]=dis(a[1][1],1)+b[1];
	f[1][1]=dis(a[1][1],1);
	
	for(int i=2; i<=n; i++) {
		f[i][0]=min(f[i-1][0]+dis(a[i-1][0],a[i][1])+b[i],f[i-1][1]+dis(a[i-1][1],a[i][1])+b[i])+1;
		f[i][1]=min(f[i-1][0]+dis(a[i-1][0],a[i][0])+b[i],f[i-1][1]+dis(a[i-1][1],a[i][0])+b[i])+1;
	}
	cout<<min(f[n][0]+dis(n,a[n][0]),f[n][1]+dis(n,a[n][1]));
	return 0;
}

标签:P3842,每行,int,线段,端点,TJOI2007,dis
From: https://www.cnblogs.com/ltphy-/p/18183007

相关文章

  • 线段树合并[学习笔记]
    线段树合并壹.什么是线段树合并?简单来说就是合并两棵线段树对于当前要合并的节点\(x,y\)如果一方为空返回另一方否则分别合并左右子树intmerge(intx,inty){if(!x||!y)returnx+y;cnt(x)+=cnt(y);//...ls(x)=merge(ls(x),ls(y));rs(x)......
  • CF-522-D-线段树
    522-D题目大意给定一个长为\(n\)的序列\(a\),现有\(q\)个查询,每个查询\(q_i\)给定\(l_i,r_i(1\lel_i,r_i\len)\),要你找出所有相等元素对\(a_x\)和\(a_y(l_i\lex,y\ler_i)\)中,绝对值\(|x-y|\)的最小值。Solution考虑三个相等的元素\(a_x,a_y,a_z(x<y<z)\),对于一个......
  • CF-877-E-dfs序+线段树
    877-E题目大意给定一颗\(n\)个节点的树,根为\(1\),点带权,权值要么为0,要么为1。\(q\)次询问,两种类型:\(get\spacex\):询问\(x\)的子树中有多少个\(1\)。\(pow\spacex\):将\(x\)子树中所有的值取反。Solutiondfs序+线段树模板题,把子树上的操作转化为区间上的操作。时间......
  • 线段树--RMQ
    这是带上lazy标记的线段树板子inta[N];intls(intp){returnp<<1;}intrs(intp){returnp<<1|1;}classSegmentTree{public: inttree[N<<2|1],tag[N<<2|1]; inlinevoidpush_up(intp){ tree[p]=tree[ls(p)]+tree[rs(p)]; } in......
  • 算法随笔——主席树(可持久化线段树)
    介绍主席树即可持久化线段树,由hjt大佬发明。好像又称函数式线段树。可以查询序列在任意时间的历史状态。学习链接学习链接主要思路维护历史状态,若采用直接拷贝整棵树的方式,空间爆炸。可以发现每次修改只有部分节点发生了改变(其实就是到树根那条链会改变),因此每次只需要记......
  • [atcoder 351] [F Double Sum] [线段树]
    解法,使用线段树。请看代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.math.BigInteger;importjava.util.StringTokenizer;publicclassMain{staticclassSegmentNode{intleft;......
  • 数据结构--线段树合并
    线段树合并前置知识权值线段树,动态开点线段树简单说明一下,权值线段树就是以值域开的一棵线段树,而动态开点就是因为值域过大导致线段树开不下,于是开一棵残疾的线段树。线段树合并模板例:给定两个数列\(a,b\),求\(\suma_i+b_i\)当然我只是为了引出模板。代码(\(x\)表......
  • CF EDU165-E-序列问题,线段树
    link:https://codeforces.com/contest/1969/problem/E给一序列\(a\),要使得\(a\)的任意子段\([a_l,\dots,a_r]\)都存在某数\(a_i\),使得其只在该子段恰出现一次。问最少修改\(a\)中几处位置?\(1\leqn\leq3\times10^5\).一个不太好的想法:对每个值去考虑,这样的入手点只考......
  • 吉司机线段树 学习笔记
    前言第一篇笔记咋是这个啊?(吉司机,指Qerrj(急急司机(?))所以人是会怀念过去的,我称Qerrj急急(只是不是吉吉)很大原因也是初中的吉吉,初中又是因为小学有吉吉。不过现在一般叫(初中的)吉吉邱元教授就是了(?)他还在林荫呢,什么时候见见他啊。吉司机线段树基础基于最基本的区间加线段树,但......
  • 01 线段树
    目录线段树简介节点加法线段树1.准备变量2.上拉操作3.建树4.懒标记5.下放操作6.区间修改updata异或线段树pushupupdata最值线段树updatapushup线段树简介线段树(一个二叉树)是一个非常重要的数据结构,利用分治的思想。可以用于维护一些满足结合律区间的信息,例如区间元素......