首页 > 其他分享 >P8661 [蓝桥杯 2018 省 B] 日志统计 题解

P8661 [蓝桥杯 2018 省 B] 日志统计 题解

时间:2024-04-10 17:57:18浏览次数:25  
标签:P8661 100005 fr 题解 ll ts 蓝桥 id block

好久没写题解了,水一篇

这里主要想讲的是不同的处理方法,在阅读本篇题解前请确保读完题

详解

一,排序

这很好理解,题目要求将热帖从小到大输出,同时题目中还有相对的时间这一概念,因此将输入的 \(id\) 与 \(ts\) 按照优先 \(id\) 其次 \(ts\) 的排序方式从小到大,排序,这样输出时就没必要刻意去处理顺序。

二,分段

为了将每一个帖子(编号不同)区分开,额外增设三个数组 \(L\),\(R\),\(ide\) 与变量 \(block\) 分别表示在排完序后的序列中共有数量为 \(block\) 的帖子,对于每一个 \(L_i\) 与 \(R_i\),分别表示第 \(i\) 个热帖在序列中从 \(L_i\) 开始到 \(R_i\) 结束,并且第 \(i\) 个帖子的编号为 \(ide_i\)。请注意区分这里第 \(i\) 个帖子与第 \(i\) 个帖子的编号的区别。

部分分段代码展示

sort(s + 1 , s + n + 1 , cmp);
s[0].id = s[n + 1].id = -1;
fr(i , 1 , n)
{
	if(s[i].id != s[i - 1].id)
	{
		R[block] = i - 1;
		L[++block] = i;
		ide[block] = s[i].id;
	}
}
R[block] = n;

注意这里 s[0].id = s[n + 1].id = -1; 的目的是为了防止序列中有这一编号的存在导致存储出现错误(不加只有八十八分)。最后补齐 \(R_{block}\)。

三,输出

在进行了上面的处理了,输出就变得非常简单了。只需要从 \(1\) 到 \(block\) 遍历一遍所有编号的帖子,判断是否是热帖即可。

四,判断是否为热帖

想必大家都会单调队列吧。不会的话给大家推荐一篇。
而这里我们只需要执行出队操作,将超过时限的点赞消息踢出队列即可,非常简单。

代码

#include<bits/stdc++.h>
#define ll int
#define mod 100000000
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
using namespace std;
ll n , d , k;
struct node
{
	ll ts , id;
}s[100005];
inline bool cmp(node x , node y)
{
	return (x.id != y.id) ? x.id < y.id : x.ts < y.ts;
}
ll L[100005] , R[100005] , block;
ll ide[100005];
ll q[100005];
inline void max_deque(ll l , ll r , ll now_block)
{
	ll head = 1 , tail = 0;
	fr(i , l , r)
	{
		while(head <= tail && q[head] + d <= s[i].ts)
		{
            head++;
		}
		q[++tail] = s[i].ts;
		if(tail - head + 1 >= k)
		{
			cout << now_block << '\n'; 
			return;
		}
	}
}
signed main()
{
//	freopen("data.in","r",stdin);
//	freopen("data.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> d >> k;
	fr(i , 1 , n)
	{
		cin >> s[i].ts >> s[i].id;
	}
	sort(s + 1 , s + n + 1 , cmp);
	s[0].id = s[n + 1].id = -1;
	fr(i , 1 , n)
	{
		if(s[i].id != s[i - 1].id)
		{
			R[block] = i - 1;
			L[++block] = i;
			ide[block] = s[i].id;
		}
	}
	R[block] = n;
//	fr(i , 1 , n)
//	{
//		cout << s[i].ts << ' ' << s[i].id << '\n';
//	}
	fr(i , 1 , block)
	{
//		cout << L[i] << ' ' << R[i] << ' ' << ide[i] << '\n';
		max_deque(L[i] , R[i] , ide[i]);
	}
	return 0;
}

标签:P8661,100005,fr,题解,ll,ts,蓝桥,id,block
From: https://www.cnblogs.com/xhqdmmz/p/18126552

相关文章

  • CF133B Unary 题解
    题面。在考虑如何优化程序时,不要忽略了这题的纯暴力做法。对于样例2此处样例2的输入应该是++++[>,.<-],也许是翻译问题,但并不重要。思路依据题意,将输入的字符串\(s\)转为其对应的二进制串\(str\),在暴力将\(str\)由二进制转为十进制即可。代码为了防止因为幂运算而......
  • CF1913C Game with Multiset 题解
    翻译初始时你有一个空序列,共\(m\)次操作,每次操作读入两个数\(t_i\),\(v_i\),分为以下两种操作:当\(t_i=1\)时,在空序列中加入\(2^{v_i}\)这一元素。(此时\(0\lev_i\le29\))当\(t_i=2\)时,询问是否存在:取当前序列的某些元素,使它们的的和等于\(v_i\)(此时\(0\lev_i\l......
  • CF1913B Swap and Delete 题解
    翻译给定一个字符串\(s\),你有两种操作:删除一个字符。(花费一枚金币)交换某两个字符的位置。(不花费金币)假设经过若干次操作后得到的字符串为\(t\)。\(t\)是好的当且仅当对于任意的\(i\)(\(1\lei\le|t|\),\(|t|\)为字符串\(t\)的长度),均满足\(t_i\nes_i\)。(\(s\)是......
  • CF1907B YetnotherrokenKeoard 题解
    比较简单,建议评橙。题面。思路对于每个给定的字符串,用两个大根堆来分别记录小写字母与大写字母,注意这里记录时不要记录大写的B和小写的b。每当出现一个B时,从记录大写字母的大根堆中取出目前最后录入的大写字母的位置,标记,接着弹出堆顶元素,标记。小写字母同理。以上操作在......
  • CF1891B Deja Vu 题解
    建议凭橙,思路橙,码量红到橙。题面。思路一,暴力直接依照题意模拟,复杂度\(O(tqn^2)\),看一眼数据范围,妥妥T飞,倒在第三个点。二,逐步优化看一眼数据发现,虽然\(q\)很大,但实际上\(x\)只有三十个值,因此首先预处理出从\(2^1\)到\(2^{30}\)的所有值,摘掉一个\(n\),复杂度\(O......
  • P9750 [CSP-J 2023] 一元二次方程 题解
    题面。直接依照题意模拟即可,注意细节。细节第一注意输出分式时分母为\(1\)不输出,分子为\(0\)直接输出零且不带正负号。第二约分时,\(gcd\)内的两个数应该都是非负实数。第三可以单独输出符号,注意别有多余的符号。第四当方程有两根且均是有理数时,要根据\(2a\)的正......
  • CF1815A Ian and Array Sorting 题解
    题面。直接进入主题吧。思路题目要求非递减序列,很明显,由题目给的操作,一定可以将这个序列的前\(n-1\)项能够满足是非递减序列,最后只需要比较第\(n\)项是否大于等于第\(n-1\)项即可。解释一下为什么。对于序列\(a\),从\(a_1\)开始到\(a_{n-1}\)结束,每次对\(a_i\)......
  • CF1909C Heavy Intervals 题解
    一种似乎更快抽象的解法?题面正文看这道题,给定序列\(l,r,c\),要求重构\(l,r,c\)使得\(\sum_{i=1}^n(r_i-l_i)\timesc_i\)最小。首先可以想到的就是尽量让小的\(r_i-l_i\)乘上大的\(c_i\)。这样子看来\(c_i\)几乎不需要更多的处理,仅需从小到大(或从大到小)排个序。来......
  • GitHub问题解决新突破,复旦大学MAGIS框架大幅超越GPT-4
    获取本文论文,请关注公众号【AI论文解读】回复:&nbsp;论文解读引言:GitHub问题解决的挑战与LLMs的潜力在软件开发的演进过程中,解决GitHub仓库中出现的问题是一个复杂的挑战。这不仅涉及到新代码的加入,还要维护现有功能的稳定运行。大型语言模型(LLMs)在代码生成和理解方......
  • Air Conditioner 题解
    [AirConditioner]题意简述题目链接。给定一个整数\(n\),每秒钟可以选择使\(n\)增加\(1\)或减少\(1\)或不改变,有\(M\)个询问,对于第\(i\)个询问,给定\(t_i,l_i,r_i\),表示询问在第\(t_i\)秒时,是否有\(n\in[l_i,r_i]\)。如果能满足所有的询问,输出YES,否则输出NO。......