acdreamoj1108(The kth number)

题目链接:http://acdream.info/problem?pid=1108

题意:n个数的数列,m次查询某个区间出现次数第k多的数出现的次数。n,m<=100000

解法:这个因为是离线的所以可以先统一处理,然后再输出。可以维护一个left和right指针,pre,pre[i]表示此时区间内出现次数大于等于i的数的种类。为了减少复杂度,关键是left和right的移动方式,即查询区间如何排序,如果紧靠区间左端点排序,那么右端点每次一定最大回是n,如果按照右端点排序,左端点每次一定最大是n。这里有个很好的处理办法,就是模糊排序,先左端点非严格排序,即除以sqrt(n)再排序,这样复杂度最大是n*sqrt(n)

代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=100010;
const int INF=1e9+7;

int num[Max];
int help[Max];
int r[Max];
int l[Max];
int k[Max];
int pre[Max];
int cnt[Max];
int tool;
bool cmp(int i,int j)
{
    if(l[i]/tool==l[j]/tool&&r[i]!=r[j])
        return r[i]<r[j];
    return l[i]<l[j];
}
int ans[Max];
int n,m;
int findans(int t)
{
    int l=1,r=n;
    while(l<=r)
    {
        int middle=(l+r)/2;
        if(pre[middle]>=t)
        l=middle+1;
        else
            r=middle-1;
    }
    return l-1;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        tool=sqrt(n);
        for(int i=0; i<n; i++)
            scanf("%d",num+i),help[i]=i;
        for(int i=0; i<m; i++)
            scanf("%d%d%d",l+i,r+i,k+i),l[i]--,r[i]--;
        sort(help,help+m,cmp);
        memset(cnt,0,sizeof cnt);
        memset(pre,0,sizeof pre);
        int left=0,right=-1;
        for(int i=0;i<m;i++)
        {
           int L=l[help[i]],R=r[help[i]];
           while(left<L){ pre[cnt[num[left++]]--]--;}
           while(L<left){ pre[++cnt[num[--left]]]++;}
           while(right<R){ pre[++cnt[num[++right]]]++;}
           while(R<right){ pre[cnt[num[right--]]--]--;}
           ans[help[i]]=findans(k[help[i]]);
        }
        for(int i=0;i<m;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}

acdreamoj1108(The kth number)

时间: 2025-01-04 07:06:47

acdreamoj1108(The kth number)的相关文章

非数值(Not a Number)NaN的解释

它是一个特殊的数值.它用于表示一个本来要返回数值的操作数未返回数值的情况. 在ECMAScript中,任何数值除以0会返回NaN,而不会导致错误,不会停止代码的执行,因此不会影响其他代码的执行. NaN本身两个不同寻常的特点: 1.任何涉及NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题. 2.NaN与任何值都不相等,包括NaN本身,即:alert(NaN == NaN);  //false isNaN()函数,它可以接受一个任何类型的参数,例如: alert(isNaN(NaN)

图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)

做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树. 算法的思路: Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点 s 的路径权重被赋为 0 (dis

JS复习—基本包装类型(String、Number)、内置对象

   包装类型 在读取模式下访问基本类型值时,就会创建对应的基本包装类型的一个对象,从而方便了数据操作.每个包装类型都映射到同名的基本类型.操作基本类型值得语句一经执行完毕,就会立即销毁新创建的包装对象. 后台执行的操作: (1)创建一个String类型的一个实例: (2) 在实例上调用指定的方法 (3)销毁这个实例 var s1 = "some text"; var s2 = s1.substring(2); s1 = null; 一.Number类型 (1):valueOf() 返

HDU1394(Minimum Inversion Number)

题目地址:Minimum Inversion Number 题目大意: 求逆序对数,求循环移位后逆序数的最小值,意思一次将第一位移到最后一位,然后计算逆序对数,求出最小的那个. 解题思路: 数组数组. 线段树代码. 代码: 1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #in

《JavaScript高级程序设计(第三版)》-2

变量 ECMAScript变量是松散类型的,即可以保存任何类型的数据. 初始化变量不会把它标记类型,初始化的过程只是给变量付一个值,因此可以在修改变量的同时修改值的类型.但并不推荐这样做. var message ="hi"; message =100;// 有效,但不推荐 使用var操作符定义的变量将称为定义该变量的作用域中的局部变量.也就是说,如果在函数中使用使用var定义一个变量,那么这个变量在函数推出后就会被销毁.例如: function test(){ var message

迷你MVVM框架 avalonjs 入门教程(司徒正美)

迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板绑定(ms-include) 数据填充(ms-text, ms-html) 类名切换(ms-class, ms-hover, ms-active) 事件绑定(ms-on,……) 显示绑定(ms-visible) 插入绑定(ms-if) 双工绑定(ms-duplex) 样式绑定(ms-css) 数据绑

DotNet 资源大全中文版(Awesome最新版)

Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台. 官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备. 官网 ServiceStack:架构缜密.速度飞快

Python 学习笔记(第4课)

本节将学习如何用Python定义函数,调用函数,以及学习匿名函数的使用 1.定义函数 Python中定义函数用关键字def,如下例所示,testFun为函数名 def testFun(): print "hello world" 2.函数参数 一个函数可以有0个或多个形式参数: def testAdd(x,y): print x+y 函数的形式参数值可以初始化,使用了初始值的参数,在调用的时候可以不需要指定该参数. def testSum(z,x=1,y=0): print x+y+z

JS高级程序设计(1-3章笔记)

第一章    JavaScript简介 1.1    JavaScript简史 1995.02- 公司:Netscape 主要人物:就职于Netscape的Brendan Eich(布兰登.艾奇) 事件:为Netscape Navigator 2开发一种名为LiveScript的脚本语言 1995.02-前夕 公司:Netscape 事件:临时将LiveScript改名为JavaScript 1995.02+ JavaScript1.0获得巨大成功 1996.08 公司:微软 IE3加入名为JS