每日一題(牛客)— 2020 - 04 - 21

題目鏈接

好像格式出了點問題,但是問題不大,這題會做,不過wa了好多,果然好久不做多組輸入的題就是容易wa

解題思路:

  • 首先我們利用差分的思想處理b數組(也就是發功),這裏存儲和差分一樣,不過我們處理的時候是從後往前,因爲他每次都是從1開始
  • 然後我們剩下的就是求出a[i], 循環從後向前在處理差分數組的時候就可以求出a[i]的值
  • 然後我們對 id1 與 id2 賦初值 - 1, 然後從後向前循環判斷就OK, 這裏需要的是看好數據範圍記得開long long
  • 因爲多組輸入,b 數組忘記初始化wa了好幾發

代碼:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 50010;

struct node
{
	int id;
    long long w;
}a[N];

int b[N];

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
        memset(b,0,sizeof b);
		int res = 0;
		int n, k;
		scanf("%d%d",&n,&k);
		for (int i = 1; i <= n; i ++){
			scanf("%d%lld",&a[i].id,&a[i].w);
		}

		for (int i = 0 ; i < k; i ++){
			int x;
			scanf("%d",&x);
			b[x] ++;
		}

		for (int i = n ; i >= 1; i --){
			b[i] += b[i + 1];
			a[i].w = a[i].w + b[i];
		}

		long long id1 = -1;
		long long id2 = -1;

		for (int i = n ; i >= 1; i --){
			if (a[i].id == 1){
				id1 = max(id1,a[i].w);
				if (id2 > a[i].w){
					res ++;
				}
			}
			else{
				id2 = max(id2,a[i].w);
				if (id1 > a[i].w){
					res++;
				}
			}
		}
		printf("%d\n",n - res);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章