CF Round #573(Div. 2) C. Tokitsukaze and Discard Items(模拟)

链接

http://codeforces.com/contest/1191/problem/C

题意

给你一个数字n,让你把1-n的n个数字分块,每一块的大小是k(最后一块大小<=k),现在需要让你删掉m个数字,这些数字分布在不同块中,你需要按照从小到大顺序将它们删除,并且删除之后会留出空位,你需要将右边的所有数字往左移动来添补空位;对于同一块中的数字可以一次性删除(视为一次删除操作),最后问你删除所有的给定数字,需要几次删除操作;

分析

n,k是1e18,但是m是1e5,这里模拟删除过程就行了,从左往右,对于每一个包含未删除数字的页面,我们都把这个块内需要删除数字删除,这就是一次操作,之后我们还需要进行对于空出位置的填充,然后在进行下一次删除操作,对于页面的跳转则是计算问题;

代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>

using namespace std;

#define inf 0x7f7f7f7f
#define maxn 100005
#define N 200005
#define P 2
typedef long long ll;

ll n, m, k;
ll p[maxn];

int main() {
	cin >> n >> m >> k;
	for (int i = 1; i <= m; i++)
		cin >> p[i];
	ll res = 0;
	int x = 1;
	while (x <= m) {
		//r是删除p[x-1]之前数字并填充后,p[x]所在页面最右边位置
		ll r = ((p[x] - (x - 1) - 1) / k + 1) * k + (x - 1);
		while (x <= m and p[x] <= r)x++;
		res++;
	}
	cout << res << endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值