Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业
Time Limit: 100 Sec Memory Limit: 512 MB
Submit: 1113 Solved: 428
[Submit][Status][Discuss]
Description
.jpg)
Input

Output

Sample Input
1 2 2
1 2 1 3
1 2 1 1
1 3 1 3
2 3 2 3
Sample Output
1 1
3 2
2 1
HINT
N=100000,M=1000000
Source
题解:
莫队+分块乱搞。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define MAXM 1000010
int block,sum[MAXN],tot[MAXN],num[],color[MAXN],pos[MAXN],ans1[MAXM],ans2[MAXM];
struct node
{
int l,r,a,b,id;
}q[MAXM];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
bool cmp(node aa,node bb)
{
if(pos[aa.l]==pos[bb.l])return aa.r<bb.r;
return aa.l<bb.l;
}
void Del(int C)
{
int cc=pos[C];
sum[cc]--;tot[C]--;
if(tot[C]==)num[cc]--;
}
void Add(int C)
{
int cc=pos[C];
sum[cc]++;tot[C]++;
if(tot[C]==)num[cc]++;
}
int getans1(int aa,int bb)
{
int p1=pos[aa],p2=pos[bb],gs=,i;
if(p1==p2)
{
for(i=aa;i<=bb;i++)gs+=tot[i];
return gs;
}
for(i=aa;i<=p1*block;i++)gs+=tot[i];
for(i=p1+;i<=p2-;i++)gs+=sum[i];
for(i=(p2-)*block+;i<=bb;i++)gs+=tot[i];
return gs;
}
int getans2(int aa,int bb)
{
int p1=pos[aa],p2=pos[bb],gs=,i;
if(p1==p2)
{
for(i=aa;i<=bb;i++)if(tot[i]!=)gs++;
return gs;
}
for(i=aa;i<=p1*block;i++)if(tot[i]!=)gs++;
for(i=p1+;i<=p2-;i++)gs+=num[i];
for(i=(p2-)*block+;i<=bb;i++)if(tot[i]!=)gs++;
return gs;
}
int write(int k)
{
if(k<){putchar('-');k=-k;}
if(k>)write(k/);
putchar(k%+'');
}
int main()
{
int n,m,i,L,R;
n=read();m=read();
block=(int)sqrt(n);
for(i=;i<=n;i++)color[i]=read(),pos[i]=(i-)/block+;
//block=(int)sqrt(n);
for(i=;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].a=read(),q[i].b=read(),q[i].id=i;
//for(i=1;i<=n;i++)pos[i]=(i-1)/block+1;
sort(q+,q+m+,cmp);
L=;R=;
//memset(tot,0,sizeof(tot));//当前枚举的区间中每种颜色的个数.
//memset(sum,0,sizeof(sum));//每一块的总共的数量.
//memset(num,0,sizeof(num));//每一块的颜色的数量.
for(i=;i<=m;i++)
{
while(L<q[i].l)
{
Del(color[L]);
L++;
}
while(L>q[i].l)
{
L--;
Add(color[L]);
}
while(R<q[i].r)
{
R++;
Add(color[R]);
}
while(R>q[i].r)
{
Del(color[R]);
R--;
}
ans1[q[i].id]=getans1(q[i].a,q[i].b);
ans2[q[i].id]=getans2(q[i].a,q[i].b);
}
for(i=;i<=m;i++){write(ans1[i]);putchar(' ');write(ans2[i]);putchar('\n');}//printf("%d %d\n",ans1[i],ans2[i]);
return ;
}
Bzoj 3236: [Ahoi2013]作业 莫队,分块的更多相关文章
- BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...
- BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...
- [AHOI2013]作业 (莫队+分块)
[AHOI2013]作业 (莫队+分块) 题面 给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间[l,r],首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小 ...
- bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)
题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...
- BZOJ 3809: Gty的二逼妹子序列 & 3236: [Ahoi2013]作业 [莫队]
题意: 询问区间权值在$[a,b]$范围内种类数和个数 莫队 权值分块维护种类数和个数$O(1)-O(\sqrt{N})$ #include <iostream> #include < ...
- bzoj3809 Gty的二逼妹子序列 & bzoj3236 [Ahoi2013]作业 莫队+分块
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3809 https://lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ3236:[AHOI2013]作业(莫队,分块)
Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...
- [BZOJ 3236] [Ahoi2013] 作业 && [BZOJ 3809] 【莫队(+分块)】
题目链接: BZOJ - 3236 BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删 ...
- 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 ...
随机推荐
- js清空前后空格
function trim(sValue){ var lastValue=this.replace(/(^\s*)|(\s*$)/g,""); ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- Jquery 实现瀑布流布局
//保证img文件夹下有图片//引入jquery <script src="Script/jquery-1.7.2.js"></script> <st ...
- ubuntu 下安装 apache php mysql
ubuntu 安装 apache+php+mysql1.打开终端,输入“sudo apt-get install apache2”,回车;(安装apache2.0或2.x新版本,系统会自动查找新的版本 ...
- DevExpress 控件使用之BarManager
DevExpress 开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,更可方便定制.对于编程人员来说是个不错的选择.它的菜单栏控件更具代表,完全可以替代开发环境提供的基本控件,而让您编写 ...
- 让你的 Node.js 应用跑得更快的 10 个技巧
Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...
- thinkphp给图片打水印不清晰
项目中打印条形码的函数,从thinkphp自带的water函数修改而来的. 贴上代码: /** * water2 * 改写thinkphp的water函数更强健的函数,增加了写入位置参数 去掉了alp ...
- centos下redis安装
下载redis http://www.redis.cn/download.html 下载php的redis扩展 https://github.com/phpredis/phpredis#install ...
- 数据库MySQL与xls文件的互导
最近的一个项目需要将xls表导入到MySQL数据库中和将MySQL数据表导出到xls表中,在网上搜了很多资料,经过多次尝试终于实现了功能,废话不多说,在这粘贴出代码,希望可以帮到需要的朋友. 一.将. ...
- zzuli oj 1165 实数的小数部分(指针专题)
Description 读入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉.如输入111111.12345678912345678900 则输出0.12345678912345678 ...