这个题正解是莫队+树状数组,但是我个人非常不喜欢树状数组这种东西,所以决定用分块来水这个题。直接在莫队维护信息的时候,维护单点同时维护块内信息就行了。

莫队就是这几行核心代码:

void add(int x)
{
++f[bl[x]];//维护块
++cnt[x];//维护点
if(cnt[x] == )
g[bl[x]]++;
}
void del(int x)
{
--f[bl[x]];
--cnt[x];
if(!cnt[x])
g[bl[x]]--;
}
void moqueue()
{
int l = ,r = ;
duke(i,,m)
{
while(l > G[i].l) add(s[--l]);
while(l < G[i].l) del(s[l++]);
while(r < G[i].r) add(s[++r]);
while(r > G[i].r) del(s[r--]);
work(G[i].a,G[i].b,i);
}
}

剩下就是暴力了,说真的,这个作法真的暴力,但是就是能过。哈哈哈。

题干:

题目描述

此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷。英语作业其实不算多,一个小时刚好可以做完。然后是一个小时可以做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文......小A压力巨大。

这是小A碰见了一道非常恶心的数学题,给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间表示数列的第1个数到第r个数),首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小于等于b的,且在该区间中出现过的数值的个数。

小A望着那数万的数据规模几乎绝望,只能向大神您求救,请您帮帮他吧。
输入输出格式
输入格式: 第一行n,m 接下来n个数表示数列 接下来m行,每行四个数l,r,a,b 输出格式: 输出m行,分别对应每个询问,输出两个数,分别为在1到i?这段区间中大小在[a,b]中的数的个数,以及大于等于a,小于等于b的,且在该区间中出现过的数值的个数(具体可以参考样例)。 输入输出样例
输入样例#: 复制 输出样例#: 复制 说明 N<=,M<=

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N=;
struct edge{
int l,r,a,b;
int ans1,ans2;
int id;
}G[N];
int cnt[N];
int bl[N];
int blk;
int n,m;
int s[N];
int f[N],g[N];
bool cmp(edge x,edge y)
{
if(bl[x.l] != bl[y.l])
return bl[x.l] < bl[y.l];
else
return x.r < y.r;
}
void add(int x)
{
++f[bl[x]];
++cnt[x];
if(cnt[x] == )
g[bl[x]]++;
}
void del(int x)
{
--f[bl[x]];
--cnt[x];
if(!cnt[x])
g[bl[x]]--;
}
void work(int l,int r,int x)
{
if(bl[l] == bl[r])
{
duke(i,l,r)
{
if(cnt[i])
G[x].ans1 += cnt[i],G[x].ans2 ++;
}
}
else
{
lv(i,bl[l] * blk - ,l)
if(cnt[i])
G[x].ans1 += cnt[i],G[x].ans2 ++;
duke(i,bl[r] * blk - blk,r)
if(cnt[i])
G[x].ans1 += cnt[i],G[x].ans2 ++;
duke(i,bl[l] + ,bl[r] - )
G[x].ans1 += f[i],G[x].ans2 += g[i];
}
}
void moqueue()
{
int l = ,r = ;
duke(i,,m)
{
while(l > G[i].l) add(s[--l]);
while(l < G[i].l) del(s[l++]);
while(r < G[i].r) add(s[++r]);
while(r > G[i].r) del(s[r--]);
work(G[i].a,G[i].b,i);
}
}
bool cmp2(edge a,edge b)
{
return a.id < b.id;
}
int main()
{
read(n);read(m);
duke(i,,n)
read(s[i]);
blk = sqrt(n);
duke(i,,m)
bl[i] = (i) / blk + ;
duke(i,,m)
{
read(G[i].l);read(G[i].r);
read(G[i].a);read(G[i].b);
G[i].id = i;
}
sort(G + ,G + m + ,cmp);
moqueue();
sort(G + ,G + m + ,cmp2);
duke(i,,m)
{
printf("%d %d\n",G[i].ans1,G[i].ans2);
}
return ;
}
/*
3 4
1 2 2
1 2 1 3
1 2 1 1
1 3 1 3
2 3 2 3
*/

代码:

P4396 [AHOI2013]作业 分块+莫队的更多相关文章

  1. BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块

    BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...

  2. 【Luogu4396】[AHOI2013]作业(莫队)

    [Luogu4396][AHOI2013]作业(莫队) 题面 洛谷 题解 模板题 #include<iostream> #include<cstdio> #include< ...

  3. [BZOJ3236]:[Ahoi2013]作业(莫队+分块)

    题目传送门 题目描述 此时已是凌晨两点,刚刚做了$Codeforces$的小$A$掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可与做完的数学作业,接下来是分别都是一个小时可 ...

  4. 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

    题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...

  5. BZOJ3236 [Ahoi2013]作业 【莫队 + 树状数组】

    题目链接 BZOJ3236 题解 没想到这题真的是如此暴力 #include<algorithm> #include<iostream> #include<cstring ...

  6. 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Di ...

  7. 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)

    传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码

  8. HDU 5145 分块 莫队

    给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...

  9. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

随机推荐

  1. CSS命名规则和如何命名

    CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...

  2. 青橙 M4 解锁BootLoader 并刷入recovery ROOT

    首先下载工具链接:https://pan.baidu.com/s/1o9xzTEi密码:7s7a 备用连接:https://pan.baidu.com/s/1bq47TMn 本篇教程教你如何傻瓜式解锁 ...

  3. ★Java语法(六)——————————分支语句

    1. if 语句   格式用法: if(布尔表达式) { 语句: } 2. if……else  语句 格式用法: if(表达式) { 语句1: } else { 语句2: } 3.if……else i ...

  4. 【PostgreSQL-9.6.3】函数(2)--字符型函数

    在上一篇博文中我们交流了数值型函数,这篇我们将讨论PostgreSQL中的字符型函数. 1. reverse(string) reverse函数可以将string字符串的字母显示顺序颠倒. test= ...

  5. 【sqli-labs】 less41 GET -Blind based -Intiger -Stacked(GET型基于盲注的堆叠查询整型注入)

    整型的不用闭合引号 http://192.168.136.128/sqli-labs-master/Less-41/?id=1;insert into users(id,username,passwo ...

  6. .net mvc DropDownListFor下拉列表使用(验证)方法

    @Html.DropDownListFor(model => model.SchoolId, new SelectList(ViewBag.SelectList, "SchoolTyp ...

  7. Crossing Rivers UVA - 12230 概率与期望

    题目大意:有个人每天要去公司上班,每次会经过N条河,家和公司的距离为D,默认在陆地的速度为1,给出N条河的信息,包括起始坐标p,宽度L,以及船的速度v.船会往返在河的两岸,人到达河岸时,船的位置是随机 ...

  8. eas之日期控件

    日期选择框能进行日期和时间的编辑,默认情况下只能进行日期选择“××××年××月××日”,可通过调用用函数setTimeEnabled(boolean)来设置是否也有时间编辑.对日期进行编辑时,可手工直 ...

  9. swift UITableViewCell 中的单选控制样式

    我昨天在网上找了一晚上的资料,但是大多都是OC得语法,swift资料实在是太少了,使得我这个刚入门swift的彩笔好不吃力,后面一直各种翻阅资料,终于让我找到了 visibleCells 这个方法,直 ...

  10. js-2018-11-09 关于Array中的srot()方法和compare()方法

    Array中的srot()方法 sort()方法是用来重排序的方法.在默认情况下,sort()方法按升序排列数组项----即最小的值位于最前面,最大的值排在最后面. 我们看看官方是怎么说的: arra ...