洛谷P4396 [AHOI2013]作业(树套树)
题意
Sol
为什么一堆分块呀。。三维数点不应该是套路离线/可持久化+树套树么。。
亲测树状数组套权值线段树可过
复杂度\(O(nlog^2n)\),空间\(O(nlogn)\)(离线)
#include<bits/stdc++.h>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define Fin(x) {freopen(#x".in","r",stdin);}
#define Fout(x) {freopen(#x".out","w",stdout);}
using namespace std;
const int MAXN = 4e5 + 10, SS = 1e7 + 10;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, a[MAXN], pre[MAXN], las[MAXN], Lim = 1e5, tot;
Pair ans[MAXN];
#define lb(x) (x & (-x))
struct BIT {
int T[MAXN];
void Add(int x, int v) {
x++;
while(x <= Lim) T[x] += v, x += lb(x);
}
int sum(int x) {
x++;
int ans = 0;
while(x) ans += T[x], x -= lb(x);
return ans;
}
int Query(int x, int y) {return sum(y) - sum(x - 1);}
}Q1;
struct query {
int k, a, b, id, p;
bool operator < (const query &rhs) const {
return k < rhs.k;
}
}q[MAXN];
int root[SS], sum[SS], ls[SS], rs[SS], cnt;
void update(int k) {
sum[k] = sum[ls[k]] + sum[rs[k]];
}
void insert(int &k, int l, int r, int p, int v) {
if(!k) k = ++cnt;
if(l == r) {sum[k]++; return ;}
int mid = l + r >> 1;
if(p <= mid) insert(ls[k], l, mid, p, v);
else insert(rs[k], mid + 1, r, p, v);
update(k);
}
int Query(int k, int l, int r, int ql, int qr) {
if(!k) return 0;
if(ql <= l && r <= qr) return sum[k];
int mid = l + r >> 1;
if(ql > mid) return Query(rs[k], mid + 1, r, ql, qr);
else if(qr <= mid) return Query(ls[k], l, mid, ql, qr);
else return Query(ls[k], l, mid, ql, qr) + Query(rs[k], mid + 1, r, ql, qr);
}
void Add(int x, int v) {
x++;
while(x <= Lim) insert(root[x], 0, Lim, v, 1), x += lb(x);
}
int Query(int x, int a, int b) {
x++;
int ans = 0;
while(x) ans += Query(root[x], 0, Lim, a, b), x -= lb(x);
return ans;
}
void Solve() {
int x = 0;
for(int i = 1; i <= tot; i++) {
while(x < q[i].k)
Q1.Add(a[++x], 1), Add(pre[x], a[x]);
ans[abs(q[i].id)].fi += (q[i].id / (abs(q[i].id))) * Q1.Query(q[i].a, q[i].b);
ans[abs(q[i].id)].se += (q[i].id / (abs(q[i].id))) * Query(q[i].p, q[i].a, q[i].b);
}
}
signed main() {
N = read(); M = read();
for(int i = 1; i <= N; i++) {
a[i] = read();
pre[i] = las[a[i]]; las[a[i]] = i;
}
for(int i = 1; i <= M; i++) {
int l = read(), r = read(), a = read(), b = read();
q[++tot].k = l - 1; q[tot].a = a; q[tot].b = b; q[tot].id = -i; q[tot].p = l - 1;
q[++tot].k = r; q[tot].a = a; q[tot].b = b; q[tot].id = i; q[tot].p = l - 1;
}
sort(q + 1, q + tot + 1);
Solve();
for(int i = 1; i <= M; i++) printf("%d %d\n", ans[i].fi, ans[i].se);
return 0;
}
洛谷P4396 [AHOI2013]作业(树套树)的更多相关文章
- bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)
题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...
- 洛谷 P4396 [AHOI2013]作业
题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...
- 洛谷 P4396 (离散化+莫队+树状数组)
### 洛谷P4396 题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)
[模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...
- 洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)
P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...
- 【洛谷3759】[TJOI2017] 不勤劳的图书管理员(树套树)
点此看题面 大致题意: 给定一个序列,每个元素有两个属性\(a_i\)和\(v_i\),每次操作改变两个元素的位置,求每次操作后\(\sum{v_i+v_j}[i<j,a_i>a_j]\) ...
- 【洛谷2617_BZOJ1901】Dynamic Rankings(树套树)
题目: 洛谷 2617 BZOJ 1901 是权限题,\(n=10^4\) ,内存 128 MB :洛谷 2617 \(n=10^5\) ,内存 1024 MB ,数据比较坑. 分析: 蒟蒻初学树套树 ...
随机推荐
- Tools - 文本编辑器Notepad++
00 - NotePad++ 官网 01 - Notepad++修改主题 依次点击设置---语言格式设置---选择主题,在显示界面中修改相关设置(背景色.前景色.字体等). 02 - Notepad+ ...
- 并发上下文控制包Context
Context,是golang用来控制并发流程的库,它能方便的将主控程序的停止信号传递到goroutinue中,从而实现一键中止关联goroutinue的执行,除此之外,它还能将外部变量通过Value ...
- 原子操作--sync/atomic的用法
golang 通过sync/atomic库来支持cpu和操作系统级别的原子操作.但是对要操作类型有如下要求 int32, int64,uint32, uint64,uintptr,unsafe包中的P ...
- 【sping揭秘】7、国际化信息支持
Spring提供messagesource接口,来进行国际化事务处理 Applicationcontext会优先找一个名为messageSouce的messageSource接口实现bean,如果找不 ...
- vue教程1-09 交互 vue实现百度下拉列表
vue教程1-09 交互 vue实现百度下拉列表 <!DOCTYPE html> <html lang="en"> <head> <met ...
- notecase的下载与安装(全网最详细)(图文详解)
不多说,直接上干货! notecase是什么? 一个按照树状结构来组织文档内容的笔记管理程序 1.双击 2.aceept 3.选择安装所放置的目录路径 4.选择开启目录文件夹 我这里,保持默认 建议默 ...
- 深入浅出zeptojs中tap事件
1.tap事件实现 zepto 源码里面看关于tap的实现方法: $(document).ready(function(){ var now, delta, deltaX = 0, deltaY = ...
- j2ee高级开发技术课程第八周
介绍一. hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因 ...
- 【IT笔试面试题整理】字符串的排列
[试题描述]输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba. 分析:这是一道很好的考查对 ...
- spring boot整合双持久层框架jpa、mybatis
公司之前用的是spring boot + jpa,但由于jpa无法完美的解决某些动态查询问题,就使用的jdbcTemplate 动态封装SQL,由于代码相对复杂,可读性差,现准备再引入mybatis. ...