Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业
Time Limit: 100 Sec Memory Limit: 512 MB
Submit: 1113 Solved: 428
[Submit][Status][Discuss]
Description
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 ...
随机推荐
- Win32 CreateWindow GdiPlus
#include "stdafx.h" #include "TestGidPlus.h" LRESULT CALLBACK WndProc(HWND, UINT ...
- ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- 访问Access数据库(有多个数据库时 体现多态)
如果想编写单机版MIS.小型网站等对数据库性能要求不高的系统,又不想安装SQLServer,可以使用Access(MDAC),只要一个mdb文件就可以了.使用Access创建mdb文件,建表.OleD ...
- HTML教程:link标记
开发php语言的网站,<head>里link标签这样:<link href="xmlrpc.php?rsd=1" title="rsd" ty ...
- CentOS 6.4 64位 安装 jdk 6u45
准备: 1.下载历史版本jdk 地址: http://java.sun.com/products/archive/ 下载的版本 jdk-6u45-linux-x64-rpm.bin Linux x6 ...
- CI的面向切面的普通权限验证
第一步:开启CI的钩子配置,此次不多说看CI手册即可. 第二步:在cofig/hooks.php中进行钩子配置,CI手册中有记载 <?php defined('BASEPATH') OR exi ...
- linux基础之Shell Script入门介绍
本文介绍下,学习shell script编程的入门知识,通过几个入门实例,带领大家走进shell script的神圣殿堂,呵呵,有需要的朋友参考下. 本文转自:http://www.jbxue.com ...
- 压缩代码加速ecshop程序页面加载速度
由于页面有很多图片,页面加载速度有点慢,本来打算减小图片的体积,后来想想这个后期还得测试下,所以暂时不打算使用google的图片优化工具,先把ecshop生成的html代码压缩下吧 压缩前:首页体积为 ...
- 005 Python的数值类型
005 Python的数值类型 BIF 指的是内置函数,一般不作为变量命名.如 input,while,if,else,float,等等.整型:整数.(python3.0版本把整型和长整型结合在 ...
- 大话设计模式(带目录完整版).pdf等
点击进入百度网盘 大话设计模式(带目录完整版).pdf等 保存至网盘下载二维码举报 赞(0)| 评论 | 分享至 分享时间:2014-04-01 11:02 | 467次浏览 130次下载 81次保存 ...