BZOJ3809,是权限题。

我永远喜欢莫队。

先莫队一下移下左右指针,然后用一个数据结构维护一下区间$[a, b]$中的颜色的值,跟着指针移动一起修改修改,每一次$query$的时候就相当于查询一下$[a, b]$中的和。

其实可以直接对颜色进行分块,维护一下块内的值以及每一个位置的答案,每一次修改是$O(1)$的,每一次查询是$O(\sqrt{n})$的,因为总共要进行$m$次查询,所以总的时间复杂度是$O((n + m)\sqrt{n})$,这样写可以比树状数组以及其他的数据结构少一个$log$。

然而这个$log$在你谷上跑的飞快……

最近真是颓了。

Code:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1e5 + ;
const int M = 1e6 + ; int n, qn, a[N], blo, ans[N];
int cnt[N], bel[N], ln[N], rn[N]; struct Querys {
int l, r, st, ed, id, ans;
} q[M]; bool cmp(const Querys &x, const Querys &y) {
if(bel[x.l] == bel[y.l]) return x.r < y.r;
else return x.l < y.l;
} inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int query(int st, int ed) {
int res = ;
if(bel[st] == bel[ed]) {
for(int i = st; i <= ed; i++)
if(cnt[i]) res++;
} else {
for(int i = st; i <= rn[bel[st]]; i++)
if(cnt[i]) res++;
for(int i = ln[bel[ed]]; i <= ed; i++)
if(cnt[i]) res++;
for(int i = bel[st] + ; i <= bel[ed] - ; i++)
res += ans[i];
}
return res;
} inline void add(int x) {
++cnt[a[x]];
if(cnt[a[x]] == ) ans[bel[a[x]]]++;
} inline void del(int x) {
--cnt[a[x]];
if(cnt[a[x]] == ) ans[bel[a[x]]]--;
} inline void solve() {
sort(q + , q + + qn, cmp);
for(int l = , r = , i = ; i <= qn; i++) {
for(; l < q[i].l; del(l++));
for(; l > q[i].l; add(--l));
for(; r < q[i].r; add(++r));
for(; r > q[i].r; del(r--));
q[q[i].id].ans = query(q[i].st, q[i].ed);
}
} int main() {
read(n), read(qn);
for(int i = ; i <= n; i++) read(a[i]); blo = sqrt(n);
for(int i = ; i <= blo; i++) {
ln[i] = (i - ) * blo + ;
rn[i] = i * blo;
}
if(rn[blo] < n)
++blo, ln[blo] = rn[blo - ] + , rn[blo] = n;
for(int i = ; i <= blo; i++) {
for(int j = ln[i]; j <= rn[i]; j++)
bel[j] = i;
} for(int i = ; i <= qn; i++) {
read(q[i].l), read(q[i].r), read(q[i].st), read(q[i].ed);
q[i].id = i;
} solve(); for(int i = ; i <= qn; i++)
printf("%d\n", q[i].ans);
return ;
}

Luogu 4867 Gty的二逼妹子序列的更多相关文章

  1. 【题解】Luogu P4867 Gty的二逼妹子序列

    原题传送门 同Luogu P4396 [AHOI2013]作业 询问多了10倍,但还能跑过(smog #include <bits/stdc++.h> #define N 100005 # ...

  2. BZOJ 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1387  Solved: 400[Submit][Status][Di ...

  3. 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Di ...

  4. Bzoj 3809: Gty的二逼妹子序列 莫队,分块

    3809: Gty的二逼妹子序列 Time Limit: 35 Sec  Memory Limit: 28 MBSubmit: 868  Solved: 234[Submit][Status][Dis ...

  5. 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 链接 分析: 和这道AHOI2013 作业差不多.权值是1~n的,所以对权值进行分块.$O(1)$修改,$O(\sqrt n)$查询. 代码: #include< ...

  6. 【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1728  Solved: 513 Description Autumn ...

  7. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

    [BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...

  8. [AHOI2013]作业 & Gty的二逼妹子序列 莫队

    ---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...

  9. [bzoj3809]Gty的二逼妹子序列_莫队_分块

    Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...

随机推荐

  1. 剑指offer--22.反转链表

    时间限制:1秒 空间限制:32768K 热度指数:440624 本题知识点: 链表 题目描述 输入一个链表,反转链表后,输出新链表的表头. /* struct ListNode { int val; ...

  2. nyoj-130-相同的雪花(hash)

    题目链接 /* Name:NYOJ-130-相同的雪花 Copyright: Author: Date: 2018/4/14 15:13:39 Description: 将雪花各个分支上的值加起来,h ...

  3. git教程3-添加远程库与从远程库拷贝

    一.添加到github 1.github上创建新的库learngit.git 2.git remote add origin git@github.com:moisiet/learngit.git  ...

  4. [基本操作] Mobius 反演, Dirichlet 卷积和杜教筛

    Dirichlet 卷积是两个定义域在正整数上的函数的如下运算,符号为 $*$ $(f * g)(n) = \sum_{d|n}f(d)g(\frac{n}{d})$ 如果不强调 $n$ 可简写为 $ ...

  5. python与mongodb

    一.mongodb的原理介绍: 特点: 为了理解以上特点,我们从一个真实的场景出发,介绍mongodb的原理:参考视频:https://www.youtube.com/watch?v=4SxHNmk5 ...

  6. Python Indentation

    In Python, code blocks don't have explicit begin/end or curly braces to mark beginning and end of th ...

  7. vue切换样式

    在vue中使用事件来切换绑定的class样式,在vue-cli脚手架中的Home.vue中 <template> <div id="main"> <l ...

  8. 使用window.print()后,未关闭打印页面,原网页不能操作

    使用window.print()后,未关闭打印页面,原网页不能操作,此时可以试着用window.location.reload()重新加载页面解决问题.

  9. springCloud组件启动时,提示内部tomcat无法加载

    忘记拷贝当时的异常信息了. 本地启动模块,做测试 大概就是emmble tomcat就是表示内部tomcat无法启动. 出现这样的异常是由于配置中心得代码已经修改,但是没有从git上down下来,然后 ...

  10. 通过PowerShell命令给Azure VM添加CustomScriptExtension

    Azure的VM提供了一种管理工具叫Azure VM Extension.它实现了一些管理虚拟机所需要的重要功能,比如:重设密码.设置RDP参数.以及许多其他关键的功能,并且Azure VM一直在添加 ...