问题 C: Shopping
时间限制: 1.000 Sec 内存限制: 128 MB
提交 状态
题目描述
Your friend will enjoy shopping. She will walk through a mall along a straight street, where N individual shops (numbered from 1 to N) are aligned at regular intervals. Each shop has one door and is located at the one side of the street. The distances between the doors of the adjacent shops are the same length, i.e. a unit length. Starting shopping at the entrance of the mall, she visits shops in order to purchase goods. She has to go to the exit of the mall after shopping.
She requires some restrictions on visiting order of shops. Each of the restrictions indicates that she shall visit a shop before visiting another shop. For example, when she wants to buy a nice dress before choosing heels, she shall visit a boutique before visiting a shoe store. When the boutique is farther than the shoe store, she must pass the shoe store before visiting the boutique,and go back to the shoe store after visiting the boutique.
If only the order of the visiting shops satisfies all the restrictions, she can visit other shops in any order she likes.
Write a program to determine the minimum required walking length for her to move from the entrance to the exit.
Assume that the position of the door of the shop numbered k is k units far from the entrance, where the position of the exit is N + 1 units far from the entrance.
输入
The input consists of a single test case.
N m
c1 d1
.
.
.
cm dm
The first line contains two integers N and m, where N (1 ≤ N ≤ 1000) is the number of shops,and m (0 ≤ m ≤ 500) is the number of restrictions. Each of the next m lines contains two integers ci and di (1 ≤ ci < di ≤ N) indicating the i-th restriction on the visiting order, where she must visit the shop numbered ci after she visits the shop numbered di (i = 1, . . . , m).
There are no pair of j and k that satisfy cj = ck and dj = dk.
输出
Output the minimum required walking length for her to move from the entrance to the exit.
You should omit the length of her walk in the insides of shops.
样例输入 Copy
10 3 3 7 8 9 2 5
样例输出 Copy
23
思路
先把区间内所有点的步数都标记为1,输入一段区间,把区间内的所有点的步数标记为3,因为要过去➡、回来⬅、过去➡三趟,最后遍历累加即可。思路类似P1047 [NOIP2005 普及组] 校门外的树
代码
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define endl '\n'
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e5+10;
int a[1005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n+1;i++){
a[i]=1;
}
int x,y;
for(int i=0;i<m;i++){
cin>>x>>y;
for(int j=x;j<y;j++){
a[j]=3;
}
}
ll sum=0;
for(int i=1;i<=n+1;i++){
sum+=a[i];
}
cout<<sum;
return 0;
}