#include <string>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 100005
struct Node
{
int l, r;
Node() :l(0), r(0){}
Node(int l, int r)
{
this->l = l; this->r = r;
}
bool operator <(Node &rhs)const
{
return r < rhs.r;
}
};
Node interval[maxn];
int n;
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//ios::sync_with_stdio(false);
//cin.tie(0); cout.tie(0);
//ifstream in;
//in.open("input.txt", ios::in);
scanf("%d", &n);
int a, b;
int ans = 0;
for (int i = 0; i < n; ++i)
{
scanf("%d%d", &interval[i].l, &interval[i].r);
}
sort(interval, interval + n);
ans = 2; a = interval[0].r - 1; b = interval[0].r;
for (int i = 1; i < n; ++i)
{
if (b < interval[i].l)
{
a = interval[i].r - 1; b = interval[i].r;
ans += 2;
}
else if (a < interval[i].l)
{
a = b; b = interval[i].r;
++ans;
}
}
printf("%d\n", ans);
//while (1);
return 0;
}
dist[b+1]>=dist[a]+2
dist[i+1]>=dist[i]
dist[i]>=dist[i+1]-1
#include <string>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 10005
#define maxm 300055
struct Edge
{
int next, to, w;
Edge() :next(0), to(0), w(0) { }
}edge[maxm];
int head[maxn], cnt = 0;
void add(int u, int v, int w)
{
edge[cnt].w = w;
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int n, m;
bool inq[maxn];
int dist[maxn];
bool SPFA(int s)
{
memset(inq, false, sizeof(inq));
memset(dist, -1, sizeof(int)*maxn);
queue<int> Q;
dist[s] = 0;
inq[s] = true;
Q.push(s);
while (!Q.empty())
{
int u = Q.front(); Q.pop();
int v;
inq[u] = false;
for (int i = head[u]; i != -1; i = edge[i].next)
{
//printf("u %d %d v %d %d edge %d\n", u, dist[u], edge[i].to, dist[edge[i].to], edge[i].w);
if (dist[u] + edge[i].w > dist[edge[i].to])
{
v = edge[i].to;
dist[v] = dist[u] + edge[i].w;
if (!inq[v])
{
Q.push(v);
inq[v] = true;
}
}
}
}
return true;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//ios::sync_with_stdio(false);
//cin.tie(0); cout.tie(0);
//ifstream in;
//in.open("input.txt", ios::in);
cnt = 0; memset(head, -1, sizeof(int)*maxn);
int a, b;
scanf("%d", &m);
n = 0;
int minv = maxn, maxv = 0;
for (int i = 0; i < m; ++i)
{
scanf("%d%d", &a, &b);
//dist[i]表示[0,i)中包含的數的個數
//dist[b+1]>=dist[a]+2
//dist[i+1]>=dist[i]
//dist[i]>=dist[i+1]-1
//>=就是求最長路,<=就是求最短路
add(a, b + 1, 2);
minv = min(a, minv); maxv = max(b + 1, maxv);
}
//printf("minv %d maxv %d\n", minv, maxv);
for (int i = minv; i < maxv; ++i)
{
add(i + 1, i, -1);
add(i, i + 1, 0);
}
SPFA(minv);
/*for (int i = minv; i <= maxv; ++i)
printf("%d ", dist[i]);
printf("\n");*/
printf("%d\n", dist[maxv]);
//while (1);
return 0;
}
dist[a]<=dist[b+1]-2
dist[i]<=dist[i+1]
dist[i+1]<=dist[i]+1
>=就是求最長路,<=就是求最短路
#include <string>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 10005
#define maxm 100005
struct Edge
{
int next, to, w;
Edge() :next(0), to(0), w(0) { }
}edge[maxm];
int head[maxn], cnt = 0;
void add(int u, int v, int w)
{
edge[cnt].w = w;
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int n, m;
bool inq[maxn];
int cntq[maxn];
int dist[maxn];
bool SPFA(int s)
{
memset(inq, false, sizeof(inq));
memset(cntq, 0, sizeof(int)*maxn);
memset(dist, 0x3f, sizeof(int)*maxn);
queue<int> Q;
dist[s] = 0;
inq[s] = true;
Q.push(s);
while (!Q.empty())
{
int u = Q.front(); Q.pop();
int v;
inq[u] = false;
for (int i = head[u]; i != -1; i = edge[i].next)
{
//printf("u %d %d v %d %d edge %d\n", u, dist[u], edge[i].to, dist[edge[i].to], edge[i].w);
if (dist[u] < INF&&dist[u] + edge[i].w < dist[edge[i].to])
{
v = edge[i].to;
dist[v] = dist[u] + edge[i].w;
if (!inq[v])
{
Q.push(v);
inq[v] = true;
}
}
}
}
return true;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//ios::sync_with_stdio(false);
//cin.tie(0); cout.tie(0);
//ifstream in;
//in.open("input.txt", ios::in);
cnt = 0; memset(head, -1, sizeof(int)*maxn);
int a, b;
scanf("%d", &m);
n = 0;
int minv = maxn, maxv = 0;
for (int i = 0; i < m; ++i)
{
scanf("%d%d", &a, &b);
//dist[i]表示[0,i)中包含的數的個數
//dist[a]<=dist[b+1]-2
//dist[i]<=dist[i+1]
//dist[i+1]<=dist[i]+1
//>=就是求最長路,<=就是求最短路
add(b + 1, a, -2);
minv = min(a, minv); maxv = max(b + 1, maxv);
}
//printf("minv %d maxv %d\n", minv, maxv);
for (int i = minv; i < maxv; ++i)
{
add(i, i + 1, 1);
add(i + 1, i, 0);
}
SPFA(maxv);
/*for (int i = minv; i <= maxv; ++i)
printf("%d ", dist[i]);
printf("\n");*/
printf("%d\n", -dist[minv]);
//while (1);
return 0;
}