解题:AHOI 2013 作业
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 作业的更多相关文章
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
- [ AHOI 2013 ] 作业 & [ BZOJ 3809 ] Gty的二逼妹子序列
\(\\\) Description 给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问: 对于一个区间 \([L_i,R_i]\),问区间内有多少个数在 \([a_i,b_i]\ ...
- [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】
题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...
- [AHOI 2013]差异
Description 题库链接 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \[\sum_{1\leqslant i< ...
- 【BZOJ 3238】【AHOI 2013】差异
http://www.lydsy.com/JudgeOnline/problem.php?id=3238 后缀数组裸题但是\(5\times 10^5\)貌似常数有点大就过不了?(我的sa常数那么大想 ...
- BZOJ3238:[AHOI 2013]差异
求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀. 方法一:SA+单调栈,自行yy. 方法二:SAM构造出来,然后每个状态对答案的 ...
- 【AHOI 2013】差异
Problem Description 给定一个长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀.求 \(\sum_{1\leqslant i&l ...
- COGS:1822. [AHOI2013]作业
1822. [AHOI 2013] 作业 ★★★ 输入文件:ahoi2013_homework.in 输出文件:ahoi2013_homework.out 简单对比时间限制:20 s ...
随机推荐
- [转]RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】
前言:关于RobotFrameWork+APPIUM实现对安卓APK的自动化测试的文章都是取自于乐于分享知识于网络的好心人们,所以我也希望我的知识可以分享给大家. 首先我们先罗列一下我们要安装的软件 ...
- windows python MySQL-python安装过程
问题表述: pip install MySQL-python==1.2.5 出现如下报错: C:\Users\Administrator\AppData\Local\Programs\Common\M ...
- Switch Game :因子数
A - Switch Game Problem Description There are many lamps in a line. All of them are off at first. A ...
- 深入react技术栈解读
1. react实现virtual DOM ,如果要改变页面的内容,还是需要执行DOM操作,比原生操作DOM多了virtualDOM的操作(计算,对比等), 应该是更耗性能??? 2. react特点 ...
- 使用 MPI for Python 并行化遗传算法
前言 本文中作者使用MPI的Python接口mpi4py来将自己的遗传算法框架GAFT进行多进程并行加速.并对加速效果进行了简单测试. 项目链接: GitHub: https://github.com ...
- C# 钱数 小写 转 大写
public class Rmb { /// <summary> /// 转换人民币大小金额 /// </summary> /// <param name="n ...
- Junit4 单元测试框架的常用方法介绍
Junit 介绍: Junit是一套框架(用于JAVA语言),由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),即 ...
- HDU 2012 FZU 1756关于素数的一些水题
HDU 2012 素数判定 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- 博弈---巴什博奕(Bash Game)(博弈入门)
巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走 ...
- 复利计算程序单元测试(C语言)
对我们和复利计算程序,写单元测试. 有哪些场景? 期待的返回值 写测试程序. 运行测试. 我的复利计算程序是用C语言写的,不懂使用C语言的测试工具,所以用C语言的运行结果来反映测试结果. 测试模块(场 ...