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

[TJOI2007] 线段

时间:2023-07-29 15:23:09浏览次数:39  
标签:le last int res 线段 ## TJOI2007

# [TJOI2007] 线段

## 题目描述

在一个 $n \times n$ 的平面上,在每一行中有一条线段,第 $i$ 行的线段的左端点是$(i, L_{i})$,右端点是$(i, R_{i})$。

你从 $(1,1)$ 点出发,要求沿途走过所有的线段,最终到达 $(n,n)$ 点,且所走的路程长度要尽量短。

更具体一些说,你在任何时候只能选择向下走一步(行数增加 $1$)、向左走一步(列数减少 $1$)或是向右走一步(列数增加 $1$)。当然,由于你不能向上行走,因此在从任何一行向下走到另一行的时候,你必须保证已经走完本行的那条线段。

## 输入格式

第一行有一个整数 $n$。

以下 $n$ 行,在第 $i$ 行(总第 $(i+1)$ 行)的两个整数表示 $L_i$ 和 $R_i$。

## 输出格式

仅包含一个整数,你选择的最短路程的长度。

## 样例 #1

### 样例输入 #1

```
6
2 6
3 4
1 3
1 2
3 6
4 5
```

### 样例输出 #1

```
24
```

## 提示

我们选择的路线是

```
(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$。

对于 $100\%$ 的数据中,$n \le 2 \times 10^4$,$1 \le L_i \le R_i \le n$。

//P3842 [TJOI2007] 线段
//贪心(58分)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e4+10;
int n,m,res,a[N],l[N],r[N],last;
bool vis[N],now;
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>l[i]>>r[i];
    for(int i=1;i<=n;i++){
            if(last>l[i]&&r[i]>last) res+=(last-l[i])*2,res+=(r[i]-last),last=r[i];
            else if(r[i]<=last) res+=(last-l[i]),last=l[i];
            else res+=(r[i]-last),last=r[i];
    }
    if(last!=r[n]) res+=abs(last-n);
    cout<<res+n-1;
    return 0;
}
//状态机:
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e4+10;
int n,m,res,f[2][N],l[N],r[N],len[N],num;
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>l[i]>>r[i],len[i]=r[i]-l[i];
    f[0][1]=r[1]-1+len[1],f[1][1]=r[1]-1;
    for(int i=2;i<=n;i++){
        f[0][i]=min(f[0][i-1]+abs(r[i]-l[i-1]),f[1][i-1]+abs(r[i]-r[i-1]))+len[i]+1;
        f[1][i]=min(f[0][i-1]+abs(l[i]-l[i-1]),f[1][i-1]+abs(r[i-1]-l[i]))+len[i]+1;
    }
    cout<<min(f[0][n],f[1][n])+abs(n-r[n])<<endl;
    return 0;
}

 

标签:le,last,int,res,线段,##,TJOI2007
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17589875.html

相关文章

  • lazy 线段树代码
    描述 代码:1classNode{2intl,r;3intsum;4intlazy;5}67classSegmentTree{89privateNode[]tree;1011privateint[]nums;1213publicSegmentTree(int[]nums){14intn=nums.length;15......
  • 懒标记线段树
    1.操作符号含义\(nums\)原数组\(d\)线段树节点维护值\(lazytag\)线段树节点懒标记值\(p\)当前节点\(s\)查询区间的开始\(e\)查询区间的结尾\(l\)节点区间的开始\(r\)节点区间的结尾一般习惯:建树从下标\(1\)开始\(mid=(l+......
  • poj 2886 Who Gets the Most Candies? (线段树单点更新应用)
                           poj2886WhoGetstheMostCandies?DescriptionNchildrenaresittinginacircletoplayagame.Thechildrenarenumberedfrom1toNinclockwiseorder.Eachofthemhasacardwithanon-zerointegeronit......
  • uva 12299 RMQ with Shifts(线段树单点更新初步应用)
                                 uva12299RMQwithShiftsInthetraditionalRMQ(RangeMinimumQuery)problem,wehaveastaticarrayA.Thenforeachquery(L,R)(LR),wereporttheminimumvalueamongA[L],A[L+1],...,A[R].N......
  • 线段树解题技巧
    前言线段树是一种在\(\log\)时间内维护区间信息的数据结构,其维护的信息通常具有区间可加性。区间可加性,也就是由区间\(A\)和区间\(B\),可以推出\(A\cupB\)。上面说到的区间,指的是区间内维护的信息。如区间和,区间平方和,区间最值,区间最大子段,区间最长连续子段,这类问题就是......
  • 学不会的线段树
    前言(胡言乱语)“杭电杯”被狠狠薄纱......
  • P3352 [ZJOI2016] 线段树 思考--zhengjun
    有一个显然的\(O(n^3q)\)的做法:设\(f_{i,l,r,x}\)表示\(i\)次操作过后,区间\([l,r]\)的数\(\lex\),\(a_{l-1},a_{r+1}>x\)的方案数。转移:$$f_{i,l,r,x}=f_{i-1,l,r,x}\timesg_{l,r}+\sum\limits_{j<l}f_{i-1,j,r,x}\times(j-1)+\sum\limits_{j>r}f_{i-1,l......
  • 线段树
    //单点修改查询//http://ybt.ssoier.cn:8088/problem_show.php?pid=1549//https://www.luogu.com.cn/problem/P1198//用一维数组来存,当作完全二叉树来存#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;longlongintm,p,n,last,t;charop;structnod......
  • 【codevs3012】线段覆盖4
      #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;structhp{ intai,bi,ci;}a[1005];boolcmp(hpa,hpb){ returna.bi<b.bi;}constintM=1e6+2;intn,i,j,k,maxn,f[1005];int......
  • 【模板】线段树优化建图
    区间连区间luoguP6348[PA2011]Journeys略带卡常#include<bits/stdc++.h>usingnamespacestd;vector<pair<int,int>>e[4200001];intdis[4200001],id[4200001];intlson(intl){returnl*2;}intrson(intl){returnl*2+1;}voidbuild(int......