解题: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 ...
随机推荐
- C++自学第一课:函数
此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...
- android 签名相关
查看keystorekeytool -list -v -keystore debug.keystoreapk签名不带别名 apksigner sign --ks debug.keystore test ...
- JAVA基础学习之路(十一)引用传递
引用传递: 不同栈内存可以指向同一块堆内存,不同栈内存可以对一块堆内存进行修改 范例一: class Message { private int num = 10; public Message(in ...
- dotnet服务器端框架从精通到弃坑
当你们看到这篇经验分享的时候,我已经把服务器端主要力量转到JAVA了. 纯当留念. 另外里面实现oauth2.0的部分就不写了,因为特殊性太强,完全根据自家需求结合它的理念改写的. 为什么我会选择sp ...
- 在jre1.8版本下,使用ikvm将jar转换为dll,以供c#调用
由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件(心塞..),终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. ...
- Paper Reading - Attention Is All You Need ( NIPS 2017 ) ★
Link of the Paper: https://arxiv.org/abs/1706.03762 Motivation: The inherently sequential nature of ...
- 简析Monte Carlo与TD算法的相关问题
Monte Carlo算法是否能够做到一步更新,即在线学习? 答案显然是不能,如果可以的话,TD算法还有何存在的意义?MC算法必须要等到episode结束后才可以进行值估计的主要原因在于对Return ...
- GitLab 搭建与使用
操作系统:Centos 7 环境:VM虚拟机 0x00:这里说下VM 虚拟机的配置 然后选择NAT模式 接下来配置网络 cd /etc/sysconfig/network-scripts/ 编辑:vi ...
- gevent协程、select IO多路复用、socketserver模块 改造多用户FTP程序例子
原多线程版FTP程序:http://www.cnblogs.com/linzetong/p/8290378.html 只需要在原来的代码基础上稍作修改: 一.gevent协程版本 1. 导入geven ...
- 经验之谈:10位顶级PHP大师的开发原则
导读:在Web开发世界里,PHP是最流行的语言之一,从PHP里,你能够很容易的找到你所需的脚本,遗憾的是,很少人会去用“最佳做法”去写一个PHP程序.这里,我们向大家介绍PHP的10种最佳实践,当然, ...