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)份,每 ...
随机推荐
- 读取NVRAM中的SN(barcode)
在Custom_NvRam_LID.h中,找到需要读取的ID对应的值 实现NvRAMAgent import java.lang.String; import android.os.RemoteExc ...
- 【C++/Qt】Qt中的parent形参
在 派生类的构造函数初始化列表中 调用 父类的带有参数的构造函数,是为了初始化从父类继承来的成员变量.因为这些变量无法直接初始化,只能采用这种方式初始化. 而在qt中,MainWindow中的某成员变 ...
- linux文件上传,给文件或目录添加apache权限
系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,测试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现如下php警告: ...
- kali linux安装virtualbox虚拟机之爬坑经历
很多kali爱好者想把kali linux作为系统使用,但是有些win下的程序有时候也需要用到,此时需要虚拟机. kali系统在安装虚拟机的时候也会遇到一大堆坑,接下来是我的爬坑过程. 一波三折. 环 ...
- DAL、DAO、ORM、Active Record辨析
转自:http://blog.csdn.net/suiye/article/details/7824943 模型 Model 模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑).一开始我 ...
- "SQLServer无法打开用户默认数据库,登录失败,错误4064"的解决办法
"SQLServer无法打开用户默认数据库,登录失败,错误4064"的解决办法 1.检查登录密码 如果密码错误,修改数据库密码,用windows身份验证登录进去, (1)安全--登 ...
- php总结 --- 2.字符串
字符串 恩聪 正则表达式 恩聪 中文验证 if (preg_match("/[\x{4e00}-\x{9fa5}]{2,4}\s{0,}\w{8,15}/u", $keyword) ...
- struts2学习:配置篇之namespace
把namespace单独拉出来讲一方面是因为它实际上不是一个element,而只是一个attribute,前面已经说了,它是package的一个attribute:另外一方面是因为这个属性是我接触St ...
- contiki-进程
进程的结构 Contiki的进程由两部分组成:进程控制块和进程线程.进程控制块存储在内存中,它包含进程运行时的信息,比如:进程名.进程状态.指向进程线程的指针. 进程线程是存储在ROM中的一个代码块. ...
- BWT (Burrows–Wheeler_transform)数据转换算法
1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续 ...