困死了,完全做不下去题

就当是对莫队最最基本的思想的一个复习叭(只有最最基本的思想,没有莫队)

传送

我们可以很容易的想到这题要用线段树。

60pts

此题要求某个区间里第K小的数,可以暴力的考虑对每个节点所对应的区间排序。这里排序一次可以最快\(O(n)\),查询时也要排序,所以查询一次是\(O(nlogn)\),总复杂度就是\(O(nmlogn)\)。不吸氧60pts。(可能还不如朴素?)

100pts

既然普通线段树不行,那咱就用权值线段树搞搞试试。权值线段树上维护每一个数出现的次数。先离散化,查询时往里扔点,删点即可。题目没有修改,考虑离线做法。我们可以参照莫队的思想,把所有询问的区间记录下来,以左端点为第一关键字,右端点为第二关键字排序。同时设置两个指针l,r,指向上一个处理的区间。当r<当前要处理的区间时,就不断向右移,同时把经过的点扔进权值线段树里。l同理,不过是把经过的点从线段树里删除。每处理完一个区间,就把查询的结果扔进ans数组里,最后输出ans数组即可。

因为题目保证查询的区间互不包含,所以r最多向右移n次,l最多向右移n次,修改与查询都是logn,总复杂度就是\(O(nlogn)\)。

突然奇想用树状数组会不会更快?

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#define pa pair<int,int>
using namespace std;
typedef long long ll;
inline int read()
{
char ch=getchar();
int x=0;bool f=0;
while(ch<'0'||ch>'9')
{
if(ch=='-')f=1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return f?-x:x;
}
const int N=3000001;
int n,m,be[N],ae[N],t,ans[50001],l=1,r,sum[4*N];
struct Q{
int l,r,k,id;//记录查询的区间与查询的顺序
}q[50001];
int lower_bound(int kkk)//手写离散化qwq
{
int ll=1,rr=t;
while(ll<=rr)
{
int mid=(ll+rr)>>1;
if(ae[mid]==kkk) return mid;
if(ae[mid]>kkk)rr=mid-1;
else ll=mid+1;
}
if(ae[ll]>kkk)ll--;//写丑了.jpg
return ll;
}
void modi(int k,int l,int r,int x,int v)
{
if(l==r&&l==x)
{sum[k]+=v;return ;}
int mid=(l+r)>>1;
if(x<=mid) modi(k<<1,l,mid,x,v);
else modi(k<<1|1,mid+1,r,x,v);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
int qry(int k,int l,int r,int rk)
{
if(l==r&&sum[k]==rk)
return l;
int mid=(l+r)>>1;
int rtn;
if(sum[k<<1]>=rk) rtn=qry(k<<1,l,mid,rk);
else rtn=qry(k<<1|1,mid+1,r,rk-sum[k<<1]);
return rtn;
}
bool cmp(Q a,Q b)
{
if(a.l!=b.l) return a.l<b.l;
return a.r<b.r;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
{
be[i]=read();ae[i]=be[i];
}
sort(ae+1,ae+1+n);
t=unique(ae+1,ae+1+n)-ae-1;
for(int i=1;i<=n;i++)
be[i]=lower_bound(be[i]);
for(int i=1;i<=m;i++)//丑陋的手写离散化
q[i].l=read(),q[i].r=read(),q[i].k=read(),q[i].id=i;
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;i++)
{
while(r<q[i].r)
modi(1,1,t,be[++r],1);
while(l<q[i].l)
modi(1,1,t,be[l++],-1); //注意是l++,不是++l
ans[q[i].id]=qry(1,1,t,q[i].k);
}
for(int i=1;i<=m;i++)
printf("%d\n",ae[ans[i]]);//记得在离散化后还原回去
}

P1533可怜的狗狗的更多相关文章

  1. 洛谷P1533 可怜的狗狗 [平衡树,FHQ_Treap]

    题目传送门 可怜的狗狗 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都 ...

  2. P1533 可怜的狗狗

    http://www.luogu.org/problem/show?pid=1533 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗 ...

  3. Luogu P1533 可怜的狗狗

    题目链接:https://www.luogu.org/problemnew/show/P1533 没人写$fhq\ treap$做法,那我就补一篇qwq 看到这题第一时间想主席树,然后发现我还没学主席 ...

  4. luogu P1533 可怜的狗狗 |莫队+二分

    题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都有一个不同的漂亮值.漂亮 ...

  5. 【题解】Luogu P1533 可怜的狗狗

    原题传送门 莫队介绍,Splay介绍 离线的题目,莫队是不错的解决方法 先把询问排一下序 剩下就套一个莫队的板子 每来一只狗就把漂亮值插入平衡树 每去掉一只狗就把漂亮值从平衡树中删掉 每次查询查平衡树 ...

  6. AC日记——可怜的狗狗 洛谷 P1533

    可怜的狗狗 思路: 主席树第k大: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300001 #defin ...

  7. [Luogu 1533] 可怜的狗狗

    平衡树,我用的SBT. 排一下序尽量减少操作次数. 第K大询问. 以及插入删除. #include <algorithm> #include <cstdio> #include ...

  8. 【luoguP1533】可怜的狗狗

    题目链接 发现区间按左端点排序后右端点也是单调的,所以扫一遍就行了,用权值线段树维护第\(k\)大 #include<algorithm> #include<iostream> ...

  9. Splay详解

    平衡树实际很简单的 以下讲解都以Luogu P3369 [模板]普通平衡树为例 我不会带指针的Splay,所以我就写非指针型的Splay Splay是基于二叉查找树(bst)实现的 什么是二叉查找树呢 ...

随机推荐

  1. vue-router实现原理

    vue-router实现原理 近期面试,遇到关于vue-router实现原理的问题,在查阅了相关资料后,根据自己理解,来记录下.我们知道vue-router是vue的核心插件,而当前vue项目一般都是 ...

  2. js 重要函数

    1. Array.some some() 方法用于检测数组中的元素是否满足指定条件(函数提供) 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测.如果没有满足条件的元素,则返 ...

  3. centos 7 私有云盘 OwnCloud 安装搭建脚本

    #!/bin/bash #Build LAMP Server Conf mysql_secure_installation service mariadb restart systemctl enab ...

  4. Linux部署java和tomcat的运行环境

    Linux部署java和tomcat的运行环境 1.上传下载的jdk的rpm包和tomcat的tar包,我是放到/opt目录了,文件直接去官网下载即可. 2.如果之前安装过其他版本的jdk,最好先现在 ...

  5. 小米Air安装Arch Linux之图形界面配置(Gnome 和 sway)持续更新中……

    0. 前言 上一篇文章简单讲述了在小米Air上安装Arch Linux的经验,但是安装完后基本系统后,还需要额外的配置才能进到日常使用.下文简单列举一些步骤. 1. 参考网站 主要还是参考ARCH W ...

  6. 搭建CentOs7的WebServer

    CentOs7,在安装的时候,自己可以定义一些东西,包括硬盘分区,服务器角色等. 这一些就搭了一个BasicWebServer,这样的话,里面的很多勾选,包括Java,Perl,Python,php等 ...

  7. Adaptive Synchronization of Dynamics on Evolving Complex Networks

    原文链接:https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.100.114101 发表在:PRL 2008 ------------- ...

  8. H5 2次重定向301

    测试环境http ,生产https,导致请求重定向.加之H5自己的一次请求重定向,一共2次.

  9. R 语言中的多项式回归

    代码 sessionInfo() # 查询版本及系统和库等信息 # 工作目录设置 getwd() path <- "E:/RSpace/R_in_Action" setwd( ...

  10. qt5--文件操作

    文本文件的读写操作: #include "win.h" #include "ui_win.h" #include <QDebug> #include ...