https://www.luogu.org/problem/show?pid=3730

题目背景

will在曼哈顿开了一家交易所,每天,前来买卖股票的人络绎不绝。

现在,will想要了解持股的情况。由于来交♂易的人实在是太多了,需要你写一个程序来帮他完成这个任务。

题目描述

  • 前来交易的N个人排成了一行,为了简便起见,每个人都只持有一种股票。

  • 不同的的人可能会持有相同的股票。

  • 定义一种股票的热度为持有该股票的人数。

  • 每次,will会给出这样的询问:在一段连续区间的人之中,热度第k小的股票的热度是多少?

输入输出格式

输入格式:

  • 第一行两个正整数N,M,分别表示人数和询问的次数;

  • 接下来一行N个正整数,表示每个人所持的股票 

  • 接下来M行,每行三个正整数l,r,k,表示询问区间中的第k小的热度,保证

输出格式:

  • 对于每个询问,输出一行一个数,表示区间[l, r]中的第k小的热度值。

  • 如果k大于区间里股票的种类数,输出-1。

输入输出样例

输入样例#1:

4 4
2 3 3 3
1 4 1
1 4 2
1 3 2
1 3 3
输出样例#1:

1
3
2
-1

说明

对于20%的数据,

对于另外10%的数据,所有的

对于100%的数据,

莫队

离散化

维护每种股票的出现次数sum

维护出现次数(热度)为i的有几种股票,即出现次数的出现次数cnt

同时,对cnt分块查询

#include<cmath>
#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
int n,m,siz;
int key[N],hashh[N];
int bl[N],ans[N];
int sum[N],cnt[N],block[N],num;
struct node
{
int l,r,id,k;
bool operator < (node p)const
{
if(bl[l]!=bl[p.l]) return bl[l]<bl[p.l];
if(r!=p.r) return r<p.r;
return k<p.k;
}
}e[N];
void read(int &x)
{
x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') { x=x*+c-''; c=getchar(); }
}
inline void update(int pos,int w)
{ block[bl[sum[hashh[pos]]]]--; cnt[sum[hashh[pos]]]--;
if(w) sum[hashh[pos]]++;
else sum[hashh[pos]]--;
block[bl[sum[hashh[pos]]]]++; cnt[sum[hashh[pos]]]++;
}
inline int query(int w)
{
int i;
for(i=;i<=siz;i++)
if(w-block[i]>) w-=block[i];
else break;
for(int j=(i-)*siz+;j<=i*siz;j++)
{
w-=cnt[j];
if(w<=) return j;
}
return -;
}
int main()
{
read(n); read(m);
siz=sqrt(n);
for(int i=;i<=n;i++) bl[i]=(i-)/siz+;
for(int i=;i<=n;i++) read(key[i]),hashh[i]=key[i];
sort(key+,key+n+);
key[]=unique(key+,key+n+)-(key+);
for(int i=;i<=n;i++) hashh[i]=lower_bound(key+,key+key[]+,hashh[i])-key;
int l,r,w;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].k); e[i].id=i;
}
sort(e+,e+m+);
int L=,R=;
for(int i=;i<=m;i++)
{
while(L<e[i].l) update(L++,false);
while(L>e[i].l) update(--L,true);
while(R>e[i].r) update(R--,false);
while(R<e[i].r) update(++R,true);
ans[e[i].id]=query(e[i].k);
}
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
}

洛谷 P3730 曼哈顿交易的更多相关文章

  1. AC日记——曼哈顿交易 洛谷 P3730

    曼哈顿交易 思路: 都是套路: 代码: #include <cmath> #include <cstdio> #include <cstring> #include ...

  2. BZOJ1855或洛谷2569 [SCOI2010]股票交易

    一道单调队列优化\(DP\) BZOJ原题链接 洛谷原题链接 朴素的\(DP\)方程并不难想. 定义\(f[i][j]\)表示到第\(i\)天,手上持有\(j\)股时的最大收益. 转移方程可以分成四个 ...

  3. 【洛谷P1379】八数码难题(广搜、A*)

    八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...

  4. 洛谷 P3636 曲面

    题目背景 xht喜欢研究数学函数,他特别喜欢反比例函数. 题目描述 我们知道,反比例函数xy=a的图象是双曲线. xht于是想:把它推广到三维是什么样的呢? 定义曲面C(k)为方程xyz=k所确定的曲 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. Icingaweb2监控oracle数据库的安装配置流程

    Icinga2安装配置check_oracle_health流程 1.安装 由于check_oracle_health是使用perl语言编写的,因此在安装该插件之前,首先要安装oracle的客户端实例 ...

  2. “Hello World!”团队第三周召开的第五次会议

    一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码地址 一.会议时间 2017年10月31日  11:45-12:17 二.会议地点: ...

  3. 常用算法Java实现之快速排序

    快速排序和冒泡排序相似,都是通过多次比较和交换来实现排序. 具体流程如下: 1.首先设定一个分界值,通过分界值将数组分成左右两部分,将大于等于分界值的数据交换集中到右侧数组,将小于分界值的数据交换集中 ...

  4. 算法与数据结构实验题 4.2 小 F 打怪

    ★实验任务 小 F 很爱打怪,今天因为系统 bug,他提前得知了 n 只怪的出现顺序以及击 倒每只怪得到的成就值 ai.设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒 钟出现一只新怪且没被击倒 ...

  5. ACM 第十天

    动态规划2 1.树形DP 2.概率DP 3.区间DP 模板 ; len < n; len++) { //操作区间的长度 , j = len; j <= n; i++, j++) { //始 ...

  6. DataSet和List 泛型之间互相转换 (转载)

    //DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属 ...

  7. 【week7】psp

    本周psp 项目 内容 开始时间 结束时间 中断时间 净时间 2016/10/31 技术学习 看向数据库传入数据的代码 18:00 21:00 45 135 psp记录 将psp记录进电脑 21:20 ...

  8. HDU 2115 I Love This Game

    http://acm.hdu.edu.cn/showproblem.php?pid=2115 Problem Description Do you like playing basketball ? ...

  9. 【Windows】Windows Restart Manager 重启管理器

    Restart Manager(以下简称RM)可以减少或避免安装或更新程序所需要的系统重启次数.安装(或更新)过程中需要重启的主要原因是需要更新的某些文件当前正被一些其它程序或服务所使用.RM允许除关 ...

  10. monitor_guiagent

    monitor_guiagent monitor_guiagent.sh #!/usr/bin/env bash #filename : monitor_guiagent.sh #Usage: /us ...