题目链接

luogu4396

思路

唯有水题暖人心

咕了4天,今天跟着std对拍才做出来不得不说题解真的水的一批

先离散化一下

第一问差分询问,权值树状数组套一套就好了 \(nlog_{n}\)

第二问,Emma

莫队,加上树状数组维护修改 \(nlog_{n}sqrt_{n}\)

\(3s\)随便过吧,最慢的也才\(800ms\)

代码

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn = 1e5 + 7;
int n, m, w[maxn];
int sub[maxn * 3], belong[maxn], lsh[maxn * 3];
struct query {
int s, t, a, b, id, ans1, ans2, tmp;
} Q[maxn];
bool cmp1(query a, query b) {return a.s < b.s;}
bool cmp2(query a, query b) {return a.t < b.t;}
bool cmp3(query a, query b) {return belong[a.t] == belong[b.t] ? a.s < b.s : a.t < b.t;}
bool cmp4(query a, query b) {return a.id < b.id;}
int read() {
int x = 0, f = 1; char s = getchar();
for (; s < '0' || s > '9'; s = getchar()) if (s == '-')f = -1;
for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int sum[maxn*6];
void add(int x, int ad) {
for (int i = x; i <= 3e5; i += (i&-i)) sum[i] += ad;
}
int query(int x) {
int ans = 0;
for (int i = x; i >= 1; i -= (i&-i)) ans += sum[i];
return ans;
}
inline void add(int x) {
if (!sub[x]) add(x, 1);
sub[x]++;
}
inline void delet(int x) {
sub[x]--;
if (!sub[x]) add(x, -1);
}
int main() {
// read
n = read(), m = read();
int k = sqrt(n);
FOR(i, 1, n) lsh[i] = w[i] = read();
FOR(i, 1, n) belong[i] = (i - 1) / k + 1;
int js = n;
FOR(i, 1, m) {
Q[i].s = read(),Q[i].t = read(),Q[i].a = read(),Q[i].b = read();
lsh[++js] = Q[i].a,lsh[++js] = Q[i].b, Q[i].id = i;
}
sort(lsh + 1, lsh + 1 + n + m * 2);
int nn = unique(lsh + 1, lsh + 1 + n + 2 * m) - (lsh + 1);
FOR(i, 1, n) w[i] = lower_bound(lsh + 1, lsh + 1 + nn, w[i]) - lsh;
FOR(i, 1, m) {
Q[i].a = lower_bound(lsh + 1, lsh + 1 + nn, Q[i].a) - lsh;
Q[i].b = lower_bound(lsh + 1, lsh + 1 + nn, Q[i].b) - lsh;
} // work1
js = 1;
sort(Q + 1, Q + 1 + m, cmp1);
FOR(i, 1, n) {
for (; Q[js].s == i; ++js)
Q[js].tmp = query(Q[js].b) - query(Q[js].a - 1);
add(w[i], 1);
} js = 1;
sort(Q + 1, Q + 1 + m, cmp2);
memset(sum, 0, sizeof(sum));
FOR(i, 1, n) {
add(w[i], 1);
for(;Q[js].t == i;++js)
Q[js].ans1 = query(Q[js].b) - query(Q[js].a - 1) - Q[js].tmp;
} // work2
sort(Q + 1, Q + 1 + m, cmp3);
memset(sum, 0, sizeof(sum));
int l = 1, r = 0;
FOR(i, 1, m) {
while (l > Q[i].s) add(w[--l]);
while (l < Q[i].s) delet(w[l++]);
while (r < Q[i].t) add(w[++r]);
while (r > Q[i].t) delet(w[r--]);
Q[i].ans2 = query(Q[i].b) - query(Q[i].a - 1);
} //print
sort(Q + 1, Q + 1 + m, cmp4);
FOR(i, 1, m) printf("%d %d\n", Q[i].ans1, Q[i].ans2);
}

P4396 [AHOI2013]作业的更多相关文章

  1. bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

    题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...

  2. P4396 [AHOI2013]作业 分块+莫队

    这个题正解是莫队+树状数组,但是我个人非常不喜欢树状数组这种东西,所以决定用分块来水这个题.直接在莫队维护信息的时候,维护单点同时维护块内信息就行了. 莫队就是这几行核心代码: void add(in ...

  3. 【题解】Luogu P4396 [AHOI2013]作业

    原题传送门 最快的解法好像是cdq,但窝只会莫队+线段树/树状数组的做法 题目要我们求1.在区间[l,r]中值域在[a,b]中有多少个数2.在区间[l,r]中值域在[a,b]中有多少个不同数 一眼就看 ...

  4. 洛谷P4396 [AHOI2013]作业(树套树)

    题意 题目链接 Sol 为什么一堆分块呀..三维数点不应该是套路离线/可持久化+树套树么.. 亲测树状数组套权值线段树可过 复杂度\(O(nlog^2n)\),空间\(O(nlogn)\)(离线) # ...

  5. luogu P4396 [AHOI2013]作业

    目录 题目 思路 错误&&傻叉 代码 题目 luogu 思路 每次都是插入比之前所有数字大的数,所以之前的答案就不会改变 用fhq-treap求出原序列,然后用树状数组依次算出每个值得 ...

  6. 洛谷 P4396 [AHOI2013]作业

    题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...

  7. [AHOI2013]作业 (莫队+分块)

    [AHOI2013]作业 (莫队+分块) 题面 给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间[l,r],首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小 ...

  8. BZOJ 3236: [Ahoi2013]作业

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1393  Solved: 562[Submit][Status ...

  9. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

随机推荐

  1. JAVA 的wait(), notify()与synchronized同步机制

    转自:http://blog.csdn.net/zyplus/article/details/6672775 在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过syn ...

  2. 洛谷P1903 数颜色 [国家集训队] 莫队

    正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...

  3. Nginx配置优化

    Nginx优化: 并发优化 KeepAlive长连接 压缩优化 配置缓存 两个监控工具: nginx_status:并发统计 Ngxtop:请求统计 Nginx配置并发.长连接.压缩.状态监控: 关闭 ...

  4. Loadrunner 手动关联技术

    录制成功,回放失败,怀疑和动态数据有关: 1 重新录制一份脚本,两次录制的脚本进行比对,确定动态数据,复制动态数据: 2  找到第一次产生该动态数据的响应对应的相应请求: 1)  拷贝脚本中适当长度的 ...

  5. 【HTML5】实例练习

    1.许多时髦的网站都提供视频.如果在网页上展示视频? <!DOCTYPE HTML> <html> <body> <video width="320 ...

  6. WordPress已占全球网站平台18.9%的份额

    Automattic创始人马特·穆伦维格(Matt Mullenweg)在旧金山的WordCamp会议上谈到了旗下博客平台WordPress的最新发展情况.WordPress平台已成为全球18.9%网 ...

  7. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  8. js-jquery-SweetAlert【一】使用

    一.下载安装 地址:http://t4t5.github.io/sweetalert/ 二.页面引用 <script src="dist/sweetalert.min.js" ...

  9. myeclipse连接并运行sql文件

    1:在工程目录上右键>new >SQL File  ,写入sql 2:在sql文件上面右键>execute sql files 3:选择数据库类型,并点击create创建一个连接: ...

  10. github多人协同使用。

    点击 一:自己跟随别人的项目进行开发 1:首先登陆github,找到自己协同开发的项目. 例如:CrossMountain 的we-pay项目 ,点击  fork,该项目就在自己的账号下面了. 2:在 ...