BZOJ3236 [Ahoi2013]作业 【莫队 + 树状数组】
题目链接
题解
没想到这题真的是如此暴力
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 100005,maxm = 3000005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,m,a[maxm],b[maxm],bi,B,tot,ans1[maxm],ans2[maxm];
struct Que{int l,r,a,b,bl,id;}q[maxm];
inline bool operator <(const Que& a,const Que& b){
return a.bl == b.bl ? a.r < b.r : a.l < b.l;
}
int getn(int x){return lower_bound(b + 1,b + 1 + tot,x) - b;}
int bac[maxm];
struct BIT{
int s[maxm];
void add(int u,int v){while (u <= tot) s[u] += v,u += lbt(u);}
int query(int u){int re = 0; while (u) re += s[u],u -= lbt(u); return re;}
int sum(int l,int r){return query(r) - query(l - 1);}
}T1,T2;
void solve(){
sort(q + 1,q + 1 + m);
int L = q[1].l,R = q[1].r;
for (int i = L; i <= R; i++){
T1.add(a[i],1);
if (!bac[a[i]]) T2.add(a[i],1);
bac[a[i]]++;
}
ans1[q[1].id] = T1.sum(q[1].a,q[1].b);
ans2[q[1].id] = T2.sum(q[1].a,q[1].b);
for (int i = 2; i <= m; i++){
while (L != q[i].l || R != q[i].r){
if (L < q[i].l){
bac[a[L]]--;
T1.add(a[L],-1);
if (!bac[a[L]]) T2.add(a[L],-1);
L++;
}
if (L > q[i].l){
L--;
T1.add(a[L],1);
if (!bac[a[L]]) T2.add(a[L],1);
bac[a[L]]++;
}
if (R < q[i].r){
R++;
T1.add(a[R],1);
if (!bac[a[R]]) T2.add(a[R],1);
bac[a[R]]++;
}
if (R > q[i].r){
bac[a[R]]--;
T1.add(a[R],-1);
if (!bac[a[R]]) T2.add(a[R],-1);
R--;
}
}
ans1[q[i].id] = T1.sum(q[i].a,q[i].b);
ans2[q[i].id] = T2.sum(q[i].a,q[i].b);
}
for (int i = 1; i <= m; i++)
printf("%d %d\n",ans1[i],ans2[i]);
}
int main(){
n = read(); m = read(); B = (int)sqrt(n) + 1;
REP(i,n) a[i] = b[++bi] = read();
REP(i,m){
q[i].l = read(); q[i].r = read(); q[i].bl = q[i].l / B;
b[++bi] = q[i].a = read();
b[++bi] = q[i].b = read();
q[i].id = i;
}
sort(b + 1,b + 1 + bi); tot = 1;
for (int i = 2; i <= bi; i++) if (b[i] != b[tot]) b[++tot] = b[i];
for (int i = 1; i <= n; i++) a[i] = getn(a[i]);
for (int i = 1; i <= m; i++) q[i].a = getn(q[i].a),q[i].b = getn(q[i].b);
solve();
return 0;
}
BZOJ3236 [Ahoi2013]作业 【莫队 + 树状数组】的更多相关文章
- BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...
- [AHOI2013]作业 莫队 树状数组
#include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- BZOJ_3289_Mato的文件管理_莫队+树状数组
BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
随机推荐
- 【思维题 细节】loj#6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相
挂于±1的细节…… 题目描述 跳蚤王国爆发了一场动乱,国王在镇压动乱的同时,需要在跳蚤国地方钦定一个人来做宰相. 由于当时形势的复杂性,很多跳蚤都并不想去做一个傀儡宰相,带着宰相的帽子,最后还冒着被打 ...
- php学习【1】
1:输出语句 <?php echo "hellow world"; print "hellow world"; print_r ("helow ...
- 《Redis设计与实现》- AOF持久化
1. AOF持久化 Redis AOF 持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的. 2. RDB持久化与AOF持久化的区别 RDB持久化 RDB持久化通过保存数据中的键值对来记 ...
- 第三课:PHP 语法
PHP 脚本在服务器上执行,然后向浏览器发送回纯 HTML 结果. 基础 PHP 语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾: < ...
- js for 循环中有异步函数时,回调函数总是最后一步的值。
原因:for循环执行时不会等待异步函数执行. 解决方法: 1.改为递归函数(暂时不会). 2.构建一个自执行函数传参(匿名函数) 参考::https://www.cnblogs.com/csuwuji ...
- C++机试笔记
- PHP代码审计2-常用超全局变量,常用命令注入,常用XSS漏洞审计,文件包含
超全局变量 $GLOBALS — 引用全局作用域中可用的全部变量$_SERVER — 服务器和执行环境信息$_GET — HTTP GET 变量$_POST — HTTP POST 变量$_FILES ...
- 洛谷P1331 海战
海战 题目链接 这还是一道联通块的题,只是需要判断是否存在以下四种情况: o. .o oo oo oo oo o. .o 如果存在就是Bad placement. 要注意标记以下,不然会出现多次输出B ...
- Field 'flag' doesn't have a default value错误
错误代码: java.sql.SQLException: Field 'flag' doesn't have a default value at com.mysql.jdbc.SQLError.cr ...
- 使用Eclipse把java文件打包成jar
本例仅限于要打包的文件没有使用第三方的jar包 在要打包的包或者文件上右键-Export 这里有一些选项: Export generated class files and resources 表示只 ...