BZOJ 3809 莫队+(分块|BIT)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#define pa pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
inline void Get_Int(int &x)
{
x=; char ch=getchar(); int f=;
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
}
inline void Put_Int(int x)
{
char ch[]; int top=;
if (x==) ch[++top]='';
while (x) ch[++top]=x%+'',x/=;
while (top) putchar(ch[top--]); putchar('\n');
}
//===================================================
const int Maxn=;
const int Maxm=;
struct Node{int l,r,u,v,id;}q[Maxm]; int n,m,s[Maxn],Block,Ans[Maxm],b[Maxn],B[Maxn];//Ans开Maxm
inline int Get(int x) {return (x-)/Block+;}
inline int Query(int x,int y)
{
int l=Get(x),r=Get(y),ret=;
if (l==r)
{
for (int i=x;i<=y;i++) if (b[i]) ret++;
return ret;
}
for (int i=l+;i<r;i++) ret+=B[i];
for (int i=x;Get(i)==l;i++) if (b[i]) ret++;
for (int i=y;Get(i)==r;i--) if (b[i]) ret++;
return ret;
}
inline bool cmp(Node A,Node B)
{
if (Get(A.l)==Get(B.l)) return A.r<B.r;
return Get(A.l)<Get(B.l);
}
inline void Del(int x)
{if (b[s[x]]==) B[Get(s[x])]--; b[s[x]]--;}
inline void Add(int x)
{if (b[s[x]]==) B[Get(s[x])]++; b[s[x]]++;} int main()
{
Get_Int(n),Get_Int(m); Block=(int)sqrt(n);
for (int i=;i<=n;i++) Get_Int(s[i]);
for (int i=;i<=m;i++)
Get_Int(q[i].l),Get_Int(q[i].r),Get_Int(q[i].u),Get_Int(q[i].v),q[i].id=i;
memset(b,,sizeof(b));
memset(B,,sizeof(B));
sort(q+,q+m+,cmp);
int L=,R=; for (int i=;i<=m;i++)
{
while (R<q[i].r) R++,Add(R);
while (L>q[i].l) L--,Add(L);
while (L<q[i].l) Del(L),L++;
while (R>q[i].r) Del(R),R--;
Ans[q[i].id]=Query(q[i].u,q[i].v);
}
for (int i=;i<=m;i++) Put_Int(Ans[i]);
return ;
}
分块 40s
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#define pa pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
inline void Get_Int(int &x)
{
x=; char ch=getchar(); int f=;
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
}
inline void Put_Int(int x)
{
char ch[]; int top=;
if (x==) ch[++top]='';
while (x) ch[++top]=x%+'',x/=;
while (top) putchar(ch[top--]); putchar('\n');
}
//===================================================
const int Maxn=;
const int Maxm=;
struct Node{int l,r,u,v,id;}q[Maxm]; int c[Maxn],n,m,s[Maxn],Block,Ans[Maxm],b[Maxn];//Ans开Maxm
inline int lowbit(int x) {return x&(-x);}
inline int Query(int x)
{int ret=; for (int i=x;i;i-=lowbit(i)) ret+=c[i];return ret;}
inline void Modify(int x,int v)
{for (int i=x;i<=n;i+=lowbit(i)) c[i]+=v;}
inline int Get(int x) {return (x-)/Block+;}
inline bool cmp(Node A,Node B)
{
if (Get(A.l)==Get(B.l)) return A.r<B.r;
return Get(A.l)<Get(B.l);
}
inline void Del(int x)
{if (b[s[x]]==) Modify(s[x],-);b[s[x]]--;}
inline void Add(int x)
{if (b[s[x]]==) Modify(s[x],); b[s[x]]++;} int main()
{
Get_Int(n),Get_Int(m); Block=(int)sqrt(n/);
for (int i=;i<=n;i++) Get_Int(s[i]);
for (int i=;i<=m;i++)
Get_Int(q[i].l),Get_Int(q[i].r),Get_Int(q[i].u),Get_Int(q[i].v),q[i].id=i;
memset(b,,sizeof(b));
memset(c,,sizeof(c));
sort(q+,q+m+,cmp);
int L=,R=;
for (int i=;i<=m;i++)
{
while (R<q[i].r) R++,Add(R);
while (L>q[i].l) L--,Add(L);
while (L<q[i].l) Del(L),L++;
while (R>q[i].r) Del(R),R--;
Ans[q[i].id]=Query(q[i].v)-Query(q[i].u-);
}
for (int i=;i<=m;i++) Put_Int(Ans[i]);
return ;
}
BIT 77s
对权值分块复杂度更优.
BZOJ 3809 莫队+(分块|BIT)的更多相关文章
- bzoj 3809 莫队
收获: 1.分块时顺便记录每个位置所属的块,然后一次排序就OK了. 2.要权衡在“区间移动”与“查询结果”之间的时间,莫队算法一般区间移动频率远大于查询结果,所以我们选择的辅助数据结构时就要注意了,我 ...
- 莫队+分块 BZOJ 3809
3809: Gty的二逼妹子序列 Time Limit: 80 Sec Memory Limit: 28 MBSubmit: 1634 Solved: 482[Submit][Status][Di ...
- [BZOJ 3585] mex 【莫队+分块】
题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数. 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数. 然后求mex用分块,将权值分块(显 ...
- Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1113 Solved: 428[Submit][Status ...
- BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块
BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...
- BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块
BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一 ...
- 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 ...
- CFGym101138D Strange Queries 莫队/分块
正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...
- [BZOJ3585]mex(莫队+分块)
显然可以离线主席树,这里用莫队+分块做.分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补. 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每 ...
随机推荐
- PetaPoco入门(一)
1. ORM概括 1.1. ORM简介 ORM 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应 ...
- AOJ 0121: Seven Puzzle (BFS DP STL 逆向推理)(转载)
转载自: http://m.blog.csdn.net/blog/Enjoying_Science/42008801 题目链接:http://acm.hust.edu.cn/vjudge/probl ...
- [问题2014A04] 解答
[问题2014A04] 解答 (1) 由条件可得 \(AB+BA=0\), 即 \(AB=-BA\), 因此 \[AB=A^2B=A(AB)=A(-BA)=-(AB)A=-(-BA)A=BA^2=B ...
- 安装DotNetCore.1.0.0-VS2015Tools.Preview2失败解决方案
1.把安装文件放入非系统盘 2.命令行带参数运行: DotNetCore.1.0.0-VS2015Tools.Preview2.0.1.exe SKIP_VSU_CHECK=1 或 DotNetCor ...
- 自建数据源(RSO2)、及数据源增强
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- eclipse + maven 搭建springMVC+Spring+mybatis 系统
首先需要下载maven 安装maven插件.自行百度. 1: 创建maven系统 http://huxiaoheihei.iteye.com/blog/1766986 2:添加pom依赖: pom.x ...
- 《BI那点儿事》数据流转换——模糊分组转换
在模糊查找中我们提到脏数据是怎样进入到表中的事情,主要还是由于一些“Lazy-add”造成的.这种情况我们的肉眼很容易被欺骗,看上去是同一个单词,其实就差那么一个字母,变成了两个不同的单词.一个简单的 ...
- java练习题(字符串类):显示4位验证码、输出年月日、从XML中抓取信息
1.显示4位验证码 注:大小写字母.数字混合 public static void main(String[] args) { String s="abcdefghijklmnopqrstu ...
- TextView 行数控制
控制textview只显示 2 行文本,超过 2 行显示展开/折叠按钮(mShowImage),isShow=true时,是展开状态,isShow=false时,是折叠状态 方法一: int line ...
- 习题-第5章Web自动化测试
一.选择题 二.判断题 三.填空题 四.简答题 五.设计题