boj 347

2024-05-26 09:58
文章标签 347 boj

本文主要是介绍boj 347,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description
Tradia对数据结构很感兴趣,她懂得很多有用的数据结构,比如链表、二叉树、图等等。最近她在学习堆的有关知识,并对堆能够在log2N的时间复杂度内返回当前集合的最值感到十分的满意。可是我们都知道,Tradia是一个求知欲很强的学生,她并不满足于得到集合的最值(最大、最小值),同时她还想获得集合当前的第K小数,并且要求每次查询的复杂度要与log2N相当,如果复杂度比log2N还低的话,她或许会以此来申请明年的图灵奖。
然而Tradia自己能力有限,没能想出什么好的解决办法,这时她想到了Jim,希望他能帮帮忙。但是Jim现在正忙着给大家出题呢,所以这个光荣的任务只能拜托聪明的你了!



Input
输入包含多组测试数据。
首先第一行输入一个数T(T<=10),表示总共有T组测试数据。
接下来是每组测试数据,第一行是一个数N(N<=50000),表示有N个操作。接着是这N个操作的描述,操作只有两种:
1、ADD X,表示往当前集合添加一个正数X(X<=200000)
2、QUERY K,查询当前集合的第K小数
注意,一开始集合都是空的,输入保证集合中每个数都不相等,且QUERY操作都是合法的。


Output
首先,输出Case #X:其中X代表是第X组数据(具体格式参照样例)。
然后对每组数据的QUERY查询,输出当前第K小的数即可。


Sample Input

2
2
ADD 1
QUERY 1
4
ADD 2
QUERY 1
ADD 1
QUERY 1


Sample Output

Case #1:
1
Case #2:
2
1


Source
humanjustic@Fourth

思路:

线段树

代码:

#include<iostream>
using namespace std;
#define N 200005
struct node{int l;int r;int c;
};
node arr[N*3];void bulid(int l,int r,int k)
{arr[k].l = l;arr[k].r = r;arr[k].c =0;if(l==r) return;int mid = (l+r)>>1;bulid(l,mid,2*k);bulid(mid+1,r,2*k+1);
}
void insert(int d,int k)
{if(arr[k].l==arr[k].r){arr[k].c++;return;}int mid = (arr[k].l+arr[k].r)>>1;if(d>mid) insert(d,2*k+1);else insert(d,2*k);arr[k].c = arr[2*k].c+arr[2*k+1].c;
}
int search(int d,int k)
{if(arr[k].l==arr[k].r)return arr[k].l;if(d>arr[2*k].c) return search(d-arr[2*k].c,2*k+1);else return search(d,2*k);
}
int main()
{int t,cnt = 1;scanf("%d",&t);while(t--){printf("Case #%d:\n",cnt++);bulid(1,N,1);int n;scanf("%d",&n);for(int i=0;i<n;i++){char a[6];int k;scanf("%s %d",a,&k);if(a[0]=='A') insert(k,1);else printf("%d\n",search(k,1));}}
}

 

这篇关于boj 347的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004138

相关文章

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

【Hot100】LeetCode—347. 前 K 个高频元素

目录 1- 思路自定义Node结点 + 哈希表实现 2- 实现⭐347. 前 K 个高频元素——题解思路 3- ACM实现 原题连接:347. 前 K 个高频元素 1- 思路 自定义Node结点 + 哈希表实现 ① 自定义 Node 结点: 自定义 Node 结点中有 value 和 cnt 字段,其中 value 为具体的数字,cnt 为具体的值实现 ① getCn

代码随想录算法训练营第十一天|150. 逆波兰表达式求值 、239. 滑动窗口最大值、347.前 K 个高频元素

Leetcode150. 逆波兰表达式求值 题目链接:150. 逆波兰表达式求值 C++: class Solution {public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i = 0; i < tokens.size(); i++) {if (tokens[i] == "+" || toke

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5

347_C++_BOOST_AUTO应用于:查找JSON字段、查找map容器中的key、推导list容器进行bit置位

BOOST_AUTO通常用于自动类型推导,尤其在模板编程中,与 C++11 及以后版本的 auto 关键字类似 1、----BOOST_AUTO推导查找JSON字段 -----迭代器array-----BOOST_AUTO(eventParm, revdoc.FindMember("eventTypes"));hl::json

【LeetCode最详尽解答】347. 前K 个高频元素 Top_K_Frequent_Elements

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 链接: 347_前K 个高频元素 直觉 最初,我想统计每个数字的出现次数,并将其存储在字典中,例如 {1: 3, 2: 2, 3: 1},其中键是元素

BOJ 4228 哈哈哈

题目链接~~> 做题感悟:这题一看就知道要用状态压缩,本题和HDU 1429 胜利大逃亡(续)差不多。 解题思路:你可以把宝物压缩为二进制,例如:01001 代表你已经拿过 1 号和 4 号宝物了 0 代表相应的宝物没拿。用同样的方法把拿某个物品的前提条件也映射成二进制。假如你现在遇到 3 号宝物,如果3号宝物的前提条件是拿到 1 号 和 4 号宝物才能拿 3 号,那么前提条件可以用二进制表示

boj 11

Description   We are familiar with the game called “Counting 24”. Now it comes a problem that we want to know whether we can figure out the exact answer with given 4 numbers only using +,-,*,/ and (,

boj 342

Descriptionxiaoming实在太好管闲事了.有一天他去参加一个舞会,这里聚集了一大堆帅哥美女,但是舞会却不是那么顺利,虽然帅哥和美女的人数都是相同的,但并不是每一位帅哥都能找到他的舞伴,原因就是有些女生只愿意接受某些男生的邀请.小明为了舞会的顺利进行,xiaoming只好厚着脸皮去和这些女生搭话,了解到了这些女生就都愿意接受哪些男生的邀请,那么剩下的工作就是要小明给这些帅哥美女们搭搭

boj 343

DescriptionTradia最近去了趟超市,采购了好多好吃的东西,其中花花绿绿的巧克力最是诱人。为了感谢Jim前段时间对自己的帮助,Tradia决定把自己的巧克力分一些给Jim。但是Tradia也爱吃巧克力,她不想把自己全部的巧克力都给Jim,而是把巧克力平均分配,使得给Jim的总量和留给自己的总量之差最小。聪明的你能帮助她吗?Input输入包含多组测试数据。首先第一行输入一个数T(T<=