题面

emmm......我把莫队扔到了杂题里,因为感觉局限挺大的=。=

这题是莫队维护信息+分块查询答案,都是两者的基本操作,复杂度$O(m$ $sqrt(n)+n$ $sqrt(m))$

所以为啥要写这水题的题解来着

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,Sq=;
struct a
{
long long ans,num;
int l,r,xx,yy,v,id;
}mo[N];
int b[N],blo[N],cnt[N],exi[Sq],bkt[Sq],pts[Sq][];
int n,m,t1,t2,t3,t4,lp,rp,sqr,srt,xnt,maxx;
bool cmp(a x,a y)
{
return x.v==y.v?x.r<y.r:x.v<y.v;
}
bool com(a x,a y)
{
return x.id<y.id;
}
void change(int val,int typ)
{
if(typ)
{
bkt[blo[val]]++;
exi[blo[val]]+=(++cnt[val]==);
}
else
{
bkt[blo[val]]--;
exi[blo[val]]-=(!(--cnt[val]));
}
}
int query1(int x,int y)
{
int ret=;
if(blo[x]!=blo[y])
{
for(int i=x;i<=pts[blo[x]][];i++) ret+=cnt[i];
for(int i=pts[blo[y]][];i<=y;i++) ret+=cnt[i];
for(int i=blo[x]+;i<=blo[y]-;i++) ret+=bkt[i];
}
else for(int i=x;i<=y;i++) ret+=cnt[i];
return ret;
}
int query2(int x,int y)
{
int ret=;
if(blo[x]!=blo[y])
{
for(int i=x;i<=pts[blo[x]][];i++) ret+=(cnt[i]>);
for(int i=pts[blo[y]][];i<=y;i++) ret+=(cnt[i]>);
for(int i=blo[x]+;i<=blo[y]-;i++) ret+=exi[i];
}
else for(int i=x;i<=y;i++) ret+=(cnt[i]>);
return ret;
}
int main ()
{
scanf("%d%d",&n,&m),sqr=sqrt(n);
for(int i=;i<=n;i++)
scanf("%d",&b[i]),maxx=max(maxx,b[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
mo[i].v=(t1-)/sqr+,mo[i].id=i,maxx=max(maxx,t4);
mo[i].l=t1,mo[i].r=t2,mo[i].xx=t3,mo[i].yy=t4;
}
pts[xnt=][]=,srt=sqrt(maxx);
for(int i=;i<=n;i++)
{
blo[i]=(i-)/srt+;
if(i%srt==)
{
pts[xnt++][]=i;
pts[xnt][]=i+;
}
}
pts[xnt][]=maxx,lp=;
sort(mo+,mo++m,cmp);
for(int i=;i<=m;i++)
{
while(lp<mo[i].l) change(b[lp++],);
while(lp>mo[i].l) change(b[--lp],);
while(rp<mo[i].r) change(b[++rp],);
while(rp>mo[i].r) change(b[rp--],);
mo[i].ans=query1(mo[i].xx,mo[i].yy);
mo[i].num=query2(mo[i].xx,mo[i].yy);
}
sort(mo+,mo++m,com);
for(int i=;i<=m;i++)
printf("%lld %lld\n",mo[i].ans,mo[i].num);
return ;
}

解题:AHOI 2013 作业的更多相关文章

  1. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  2. BZOJ 3236 AHOI 2013 作业 莫队算法

    题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...

  3. [ AHOI 2013 ] 作业 & [ BZOJ 3809 ] Gty的二逼妹子序列

    \(\\\) Description 给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问: 对于一个区间 \([L_i,R_i]\),问区间内有多少个数在 \([a_i,b_i]\ ...

  4. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  5. [AHOI 2013]差异

    Description 题库链接 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \[\sum_{1\leqslant i< ...

  6. 【BZOJ 3238】【AHOI 2013】差异

    http://www.lydsy.com/JudgeOnline/problem.php?id=3238 后缀数组裸题但是\(5\times 10^5\)貌似常数有点大就过不了?(我的sa常数那么大想 ...

  7. BZOJ3238:[AHOI 2013]差异

    求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀. 方法一:SA+单调栈,自行yy. 方法二:SAM构造出来,然后每个状态对答案的 ...

  8. 【AHOI 2013】差异

    Problem Description 给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \(\sum_{1\leqslant i&l ...

  9. COGS:1822. [AHOI2013]作业

    1822. [AHOI 2013] 作业 ★★★   输入文件:ahoi2013_homework.in   输出文件:ahoi2013_homework.out   简单对比时间限制:20 s   ...

随机推荐

  1. PHP:Iterator(迭代器)接口和生成器

    迭代器 可在内部迭代自己的外部迭代器或类的接口.详情:http://php.net/manual/zh/class.iterator.php 接口摘要 Iterator extends Travers ...

  2. Ubuntu18.04重装指南

    Guide google chrome sougou 谷歌服务助手\(\rightarrow\)谷歌访问助手(谷歌应用商店)登录谷歌账号(cnyalitea@gmail.com)然后同步. \(\te ...

  3. 深度学习-tensorflow学习笔记(2)-MNIST手写字体识别

    深度学习-tensorflow学习笔记(2)-MNIST手写字体识别超级详细版 这是tf入门的第一个例子.minst应该是内置的数据集. 前置知识在学习笔记(1)里面讲过了 这里直接上代码 # -*- ...

  4. 2017年软件工程第八次作业-每周PSP例行报告

    1.PSP表格 2.进度条 3.博文字数累积折线图 4.代码行数累积折线图 5.PSP饼图

  5. 冲刺ing-7

    第七次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 Leangoo的看板截图,燃尽图 蔺皓雯 编写博客 蔡晨旸 进行测试 曾茜 界面设计 鲁婧楠 界面前后端 杨池宇 界面前后端 项目的发布说 ...

  6. Ubuntu16.04下安装显卡驱动记录

    安装环境及硬件信息 Ubuntu16.04 LTS 内核版本:4.4.0 显卡:Nvidia GeForce GTX 1060 安装过程 一.首先要下载好显卡驱动程序,官方网址:http://www. ...

  7. Optimized Flow Migration for NFV Elasticity Control

    NFV弹性控制中的流迁移优化 ABSTRACT 基于动态创建和移除网络功能实例,NFV在网络功能控制上有很大的弹性.比如,网络功能和并,网络功能拆分,负载均衡等等. 那么为了实现弹性控制,就需要网络流 ...

  8. 【第二周】Java实现英语文章词频统计(改进1)

    本周根据杨老师的spec对英语文章词频统计进行了改进 1.需求分析: 对英文文章中的英文单词进行词频统计并按照有大到小的顺序输出, 2.算法思想: (1)构建一个类用于存放英文单词及其出现的次数 cl ...

  9. Struts2转换器配置和用法

    struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制. 一.类型转换的意义 对于一个 ...

  10. PHP对象的遍历

    对象的遍历 对象的遍历,跟数组的遍历,一样! 其实,只能遍历出对象的“实例属性数据” foreach( $对象名  as   $key => $value){ //这里就可以处理$key和$va ...