#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)的更多相关文章

  1. bzoj 3809 莫队

    收获: 1.分块时顺便记录每个位置所属的块,然后一次排序就OK了. 2.要权衡在“区间移动”与“查询结果”之间的时间,莫队算法一般区间移动频率远大于查询结果,所以我们选择的辅助数据结构时就要注意了,我 ...

  2. 莫队+分块 BZOJ 3809

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1634  Solved: 482[Submit][Status][Di ...

  3. [BZOJ 3585] mex 【莫队+分块】

    题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数. 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数. 然后求mex用分块,将权值分块(显 ...

  4. Bzoj 3236: [Ahoi2013]作业 莫队,分块

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

  5. BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块

    BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...

  6. BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块

    BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一 ...

  7. 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 ...

  8. CFGym101138D Strange Queries 莫队/分块

    正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...

  9. [BZOJ3585]mex(莫队+分块)

    显然可以离线主席树,这里用莫队+分块做.分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补. 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每 ...

随机推荐

  1. 2D空间中求一点是否在多边形内

    参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...

  2. (7) 深入了解Java Class文件格式(六)

    转载:http://blog.csdn.net/zhangjg_blog/article/details/21888943 经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, ...

  3. python学习之列表语法

    1.列表 1 list.append(obj)在列表末尾添加新的对象2 list.count(obj)统计某个元素在列表中出现的次数3 list.extend(seq)在列表末尾一次性追加另一个序列中 ...

  4. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  5. aws在线技术峰会笔记-游戏解决方案

    选项1:可以将aws的SDK嵌入到APP中. 选项2:Mobile Hub自动生成代码. 选项3:开源免费的游戏引擎.可视化脚本编程,实现客户端的逻辑代码. 用户管理 Cognito Identity ...

  6. yii2中gii外网访问的配置方法

    if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debu ...

  7. 19 Using Optimizer Hints

    19.1 Overview of Optimizer Hints A hint is an instruction to the optimizer. In a test or development ...

  8. Android Tips – 填坑手册

    出于: androidChina   http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的 ...

  9. 原!!jar包 --可执行exe文件--安装包

    这几天由于部门统计名单,都是一边报,一边统计,感觉麻烦,写了个小工具,做成安装包.其他不多说,网上都有,我就自己按照网上操作,碰到了一些问题,对这些问题说下. ----------废话少说------ ...

  10. 查看Msi文件内容

    1通过msiexec命令解压msi包 msiexec.exe /a c:\msi\installer.msi /qb targetdir=d:\msi\installer 2 使用Orca查看. Or ...