CodeForces —— 1075 C. The Tower is Going Home(思维 + 贪心)

C. The Tower is Going Home
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

On a chessboard with a width of 109
and a height of 109, the rows are numbered from bottom to top from 1 to 109, and the columns are numbered from left to right from 1 to 109. Therefore, for each cell of the chessboard you can assign the coordinates (x,y), where x is the column number and y

is the row number.

Every day there are fights between black and white pieces on this board. Today, the black ones won, but at what price? Only the rook survived, and it was driven into the lower left corner — a cell with coordinates (1,1)
. But it is still happy, because the victory has been won and it’s time to celebrate it! In order to do this, the rook needs to go home, namely — on the upper side of the field (that is, in any cell that is in the row with number 109

).

Everything would have been fine, but the treacherous white figures put spells on some places of the field before the end of the game. There are two types of spells:

Vertical. Each of these is defined by one number x

. Such spells create an infinite blocking line between the columns x and x+1
.
Horizontal. Each of these is defined by three numbers x1
, x2, y. Such spells create a blocking segment that passes through the top side of the cells, which are in the row y and in columns from x1 to x2

inclusive. The peculiarity of these spells is that it is impossible for a certain pair of such spells to have a common point. Note that horizontal spells can have common points with vertical spells. 

An example of a chessboard.

Let’s recall that the rook is a chess piece that in one move can move to any point that is in the same row or column with its initial position. In our task, the rook can move from the cell (r0,c0)
into the cell (r1,c1) only under the condition that r1=r0 or c1=c0

and there is no blocking lines or blocking segments between these cells (For better understanding, look at the samples).

Fortunately, the rook can remove spells, but for this it has to put tremendous efforts, therefore, it wants to remove the minimum possible number of spells in such way, that after this it can return home. Find this number!
Input

The first line contains two integers n
and m (0≤n,m≤105

) — the number of vertical and horizontal spells.

Each of the following n
lines contains one integer x (1≤x<109) — the description of the vertical spell. It will create a blocking line between the columns of x and x+1

.

Each of the following m
lines contains three integers x1, x2 and y (1≤x1≤x2≤109, 1≤y<109) — the numbers that describe the horizontal spell. It will create a blocking segment that passes through the top sides of the cells that are in the row with the number y, in columns from x1 to x2

inclusive.

It is guaranteed that all spells are different, as well as the fact that for each pair of horizontal spells it is true that the segments that describe them do not have common points.
Output

In a single line print one integer — the minimum number of spells the rook needs to remove so it can get from the cell (1,1)
to at least one cell in the row with the number 109

Examples
Input
Copy

2 3
6
8
1 5 6
1 9 4
2 4 2

Output
Copy

1

Input
Copy

1 3
4
1 5 3
1 9 4
4 6 6

Output
Copy

1

Input
Copy

0 2
1 1000000000 4
1 1000000000 2

Output
Copy

2

Input
Copy

0 0

Output
Copy

0

Input
Copy

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

Output
Copy

2

Note

In the first sample, in order for the rook return home, it is enough to remove the second horizontal spell.
Illustration for the first sample. On the left it shows how the field looked at the beginning. On the right it shows how the field looked after the deletion of the second horizontal spell. It also shows the path, on which the rook would be going home.

In the second sample, in order for the rook to return home, it is enough to remove the only vertical spell. If we tried to remove just one of the horizontal spells, it would not allow the rook to get home, because it would be blocked from above by one of the remaining horizontal spells (either first one or second one), and to the right it would be blocked by a vertical spell.
Illustration for the second sample. On the left it shows how the field looked at the beginning. On the right it shows how it looked after the deletion of the vertical spell. It also shows the path, on which the rook would be going home.

In the third sample, we have two horizontal spells that go through the whole field. These spells can not be bypassed, so we need to remove both of them.
Illustration for the third sample. On the left it shows how the field looked at the beginning. On the right it shows how the field looked after the deletion of the horizontal spells. It also shows the path, on which the rook would be going home.

In the fourth sample, we have no spells, which means that we do not need to remove anything.

In the fifth example, we can remove the first vertical and third horizontal spells.
Illustration for the fifth sample. On the left it shows how the field looked at the beginning. On the right it shows how it looked after the deletions. It also shows the path, on which the rook would be going home.

解题思路:
尽量减少遇到的障碍Spell , 横条的起点超过1肯定可以绕过这个横条,不消耗, 对答案无贡献。
出于贪心的思想,走一条竖的肯定会使答案 + 1 ,同时不得不走的横条也可能会随之减少。那么在走第n个竖线的基础上 + 不得不走的横条(ps:起始点为1 并且终点 >= 当前竖线的位置) 就是对答案某个估计,维护这个最小答案就好了~

AC代码:

#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
	x=0;int f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	x*=f;return;
}
const int inf = (int)1e9; 
const int maxn  = (int) 1e5 + 5; 	
int col[maxn];
int row[maxn];
int n,m;

int main(void)
{
//	std::ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL); 	
	read(n),read(m);
	for(int i = 0 ;i < n ; i++)  read(col[i]); 
	sort(col, col + n );   
	col[n] = inf; 
	int s,e,t;
	int tot = 0;
	for(int i = 0; i < m ; i++)
	{
		read(s), read(e), read(t);
		if(s == 1) row[tot++] = e; 
	}
	sort(row, row + tot);  
	int ans = inf; 
	s = 0;  
	for(int i = 0; i <= n ; i++)
	{
		while(s < tot && row[s] < col[i]) s++;
		ans = min(ans, tot - s + i);   
	}
	printf("%d\n",ans); 		
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值