思路挺简单的,但是总感觉好难写...码力还是差劲,最后写出来也挺丑的

  这题显然是个莫队题,考虑怎么转移和询问...

  根据莫队修改多查询少的特点,一般用修改快查询慢的分块来维护。查第$k_1$小的出现次数可以用权值分块做到$O(1)$修改,$O(\sqrt{n})$查询,$k_2$小的数同理。对于每一种出现次数$i$,预处理出有几种数在序列里的出现次数$\geq i$,并在每种出现次数中对这些数离散化,这样我们就能对每种出现次数进行权值分块查第$k_2$小的数了。

  因为$\sum cnt_i=n$,所以空间是$O(n)$的,这题卡空间...$O(n\sqrt{n})$的空间过不了....

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=, inf=1e9, sqrtm=;
struct poi{int l, r, k1, k2, pos;}q[maxn];
int n, m, x, blo;
vector<int>v[maxn], v2[maxn], sum2[maxn], blsum2[maxn];
int sum1[maxn], blsum1[sqrtm], a[maxn], b[maxn], bl[maxn], cnt[maxn], ans[maxn];
inline void read(int &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-'&&(f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
bool operator < (poi a, poi b)
{return bl[a.l]<bl[b.l] || (bl[a.l]==bl[b.l] && ((bl[a.l]&)?a.r<b.r:a.r>b.r));}
inline void add(int x, int delta)
{
x=a[x]; int pos=v2[x][cnt[x]-];
sum1[cnt[x]]+=delta;
if(sum1[cnt[x]]== && delta==) blsum1[bl[cnt[x]]]++;
if(sum1[cnt[x]]== && delta==-) blsum1[bl[cnt[x]]]--;
sum2[cnt[x]][pos]+=delta;
blsum2[cnt[x]][bl[pos]]+=delta;
}
inline void update(int x, int delta)
{
if(cnt[a[x]]>) add(x, -);
cnt[a[x]]+=delta;
if(cnt[a[x]]>) add(x, );
}
inline int query1(int k)
{
int x=, cnt=;
for(int i=;i<=bl[n];i++)
if(cnt+blsum1[i]>=k) break;
else cnt+=blsum1[i], x++;
for(int i=blo*x;i<=min(n, blo*(x+));i++)
if(cnt+(sum1[i]!=)>=k) return i;
else cnt+=(sum1[i]!=);
return ;
}
inline int query2(int ty, int k)
{
int x=, cntt=;
for(int i=;i<blsum2[ty].size();i++)
if(cntt+blsum2[ty][i]>=k) break;
else cntt+=blsum2[ty][i], x++;
for(int i=blo*x;i<=min(n, blo*(x+));i++)
{
if(cntt+sum2[ty][i]>=k) return i;
else cntt+=sum2[ty][i];
}
return ;
}
int main()
{
read(n); blo=sqrt(n); for(int i=;i<=n;i++) bl[i]=i/blo+;
for(int i=;i<=n;i++) read(a[i]), b[i]=a[i];
sort(b+, b++n); for(int i=;i<=n;i++) cnt[b[i]]++;
for(int i=;i<=n;i++)
{
for(int j=;j<=cnt[b[i]];j++)
{
v2[b[i]].push_back(v[j].size());
v[j].push_back(b[i]);
sum2[j].push_back();
}
cnt[b[i]]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=bl[sum2[i].size()];j++)
blsum2[i].push_back();
read(m);
for(int i=;i<=m;i++)
read(q[i].l), read(q[i].r), read(q[i].k1), read(q[i].k2), q[i].pos=i;
sort(q+, q++m);
for(int i=, l=, r=;i<=m;i++)
{
while(l<q[i].l) update(l++, -);
while(l>q[i].l) update(--l, );
while(r<q[i].r) update(++r, );
while(r>q[i].r) update(r--, -);
x=query1(q[i].k1);
ans[q[i].pos]=v[x][query2(x, q[i].k2)];
}
for(int i=;i<=m;i++) printf("%d\n", ans[i]);
}

bzoj3920: Yuuna的礼物(莫队+分块套分块)的更多相关文章

  1. BZOJ.3920.Yuuna的礼物(莫队 分块套分块 分段离散化)

    题目链接 详细题解:https://www.cnblogs.com/autsky-jadek/p/4376091.html 代码参考自:https://www.cnblogs.com/Sakits/p ...

  2. 【莫队算法】【权值分块】bzoj3920 Yuuna的礼物

    [算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次 ...

  3. 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)

    传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...

  4. (原创)BZOJ 2038 小Z的袜子(hose) 莫队入门题+分块

    I - 小Z的袜子(hose) 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z ...

  5. [BZOJ3920]Yuuna的礼物

    题目大意: 给你一个长度为$n(n\le40000)$的数列$\{a_i\}(1\le a_i\le n)$,给出$m(m\le40000)$次询问,每次给出$l,r,k_1,k_2$询问区间$[l, ...

  6. NOI模拟 颜色 - 带修莫队/树套树

    题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...

  7. POJ 2104 - 主席树 / 询问莫队+权值分块

    传送门 题目大意应该都清楚. 今天看到一篇博客用分块+莫对做了这道题,直接惊呆了. 首先常规地离散化后将询问分块,对于某一询问,将莫队指针移动到指定区间,移动的同时处理权值分块的数字出现次数(单独.整 ...

  8. BZOJ 3339 && BZOJ 3585 莫队+权值分块

    显然若一个数大于n就不可能是答案. #include <iostream> #include <cstring> #include <cstdio> #includ ...

  9. 反演+分块套分块——bzoj2154

    题解都在论文里了 #include<bits/stdc++.h> using namespace std; #define maxn 10000005 #define ll long lo ...

随机推荐

  1. C# online update demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  2. 20155232《网络对抗》Exp2 后门原理与实践

    20155232<网络对抗>Exp2 后门原理与实践 问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? 通过网页上弹出来的软件自动安装 2.例举你知道的后门如何启动起来(wi ...

  3. 20155321 《网络对抗》 Exp6 信息搜集与漏洞扫描

    20155321 <网络对抗> Exp6 信息搜集与漏洞扫描 实验内容 信息搜集 whois 在kali终端输入whois 网址,查看注册的公司.服务.注册省份.传真.电话等信息 dig或 ...

  4. 20155330 《网络攻防》 Exp4 恶意代码分析

    20155330 <网络攻防> Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操 ...

  5. Luogu P1120 小木棍 [数据加强版]

    看了题目心中只有一个字——搜索!!! 但是很显然,朴素的搜索(回溯)绝壁超时. 剪枝&优化(要搞很多,要不然过不了) 1:从小到大搜索它们的因数,这样找到就exit. 2:将数据从大到小排序, ...

  6. 汇编 inc 和 dec 指令

    知识点: inc 加1指令 dec 减1指令 一.加一指令inc inc a 相当于 add a, //i++ 优点 速度比sub指令快,占用空间小 这条指令执行结果影响AF.OF.PF.SF.Z ...

  7. adb连接不上手机的解决方案

    一.确认手机的USB调试接口是打开的:----------打开开发者模式,暴击手机版本号多次,直到提示已打开开发者模式. 二.使用USB线连接电脑和手机,可以首先执行adb remount(重新挂载系 ...

  8. windows超级实用快键键

    1 电脑锁屏Win + L 有些时候,需要暂时离开座位去处理其他事,可是电脑还有数据再跑. 关掉的话,数据就白跑了,不关的话,又不想让别人看到我电脑的资料. 那么就按住windows键后,再按L键. ...

  9. A星寻路算法入门(Unity实现)

    最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...

  10. mssql循环记录之while方法

    1.定义变量 Declare @i Int 2.获取单条记录 Select @i=Min([id]) From [数据库名] Where <检索条件> 3.While循环 While @i ...