分析:对于前30%的数据直接暴力模拟即可,对于另外30%的数据,因为每次的p是一样的,所以可以用莫队来维护,先离散化一下,再用一个桶统计次数.

100%的做法和之前做过的一道模拟赛题很像,当模数很小的时候分块,否则就暴力修改.其实看到区间操作第一感觉是线段树,但是线段树并不能维护这个,分块维护的信息多一些,所以分块.在模数较小的时候记录一下第i个块,模p等于v的有多少个,即g[i][p][v],利用前缀和统计1~i个块的个数.在模数较大的时候因为只有v,v+p,v+2p对答案有影响,所以记录第i个块值为v的有多少个,即f[i][v],同样也可以用前缀和处理一下.查询的时候还是分模数的大小来进行,先统计完整包含在块里面的,在暴力统计在块外面的就可以了.

当有些信息线段树维护不了的时候可以考虑一下分块,分块的时候可以根据范围来决定什么时候分块,什么时候用其它的方法,前缀和可以加速区间查询操作.

60分暴力:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m, a[], b[], cnt, tot, c[], sizee, L = , R = , tong[], ans[];
bool flag = true; struct node
{
int l, r, p, v,id;
}e[]; bool cmp(node a, node b)
{
if (a.l / sizee == b.l / sizee)
return a.r < b.r;
return a.l < b.l;
} void add(int x)
{
tong[a[x]]++;
} void del(int x)
{
tong[a[x]]--;
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
cnt = ;
for (int i = ; i <= m; i++)
{
scanf("%d%d%d%d", &e[i].l, &e[i].r, &e[i].p, &e[i].v);
e[i].id = i;
if (i != && e[i].p != e[i - ].p)
flag = false;
b[++cnt] = e[i].v;
}
if (flag)
{
for (int i = ; i <= n; i++)
{
a[i] %= e[].p;
b[++cnt] = a[i];
}
memcpy(c, b, sizeof(b));
sort(c + , c + + cnt);
tot = unique(c + , c + + cnt) - c - ;
for (int i = ; i <= n; i++)
a[i] = lower_bound(c + , c + + tot, a[i]) - c - ;
for (int i = ; i <= m; i++)
e[i].v = lower_bound(c + , c + + tot, e[i].v) - c - ;
sizee = (int)sqrt(n);
sort(e + , e + + m, cmp);
for (int i = ; i <= m; i++)
{
int l = e[i].l, r = e[i].r;
while (R < r)
add(++R);
while (R > r)
del(R--);
while (L > l)
add(--L);
while (L < l)
del(L++);
ans[e[i].id] = tong[e[i].v];
}
for (int i = ; i <= m; i++)
printf("%d\n", ans[i]);
}
else
{
for (int i = ; i <= m; i++)
{
int cnt = ;
for (int j = e[i].l; j <= e[i].r; j++)
if (a[j] % e[i].p == e[i].v)
cnt++;
printf("%d\n", cnt);
}
} return ;
}

100分正解:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m, a[], maxn, block, cnt, maxx, l[], r[], ans;
int f[][], g[][][], kuai[]; int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
maxn = max(maxn, a[i]);
}
block = ;
cnt = (n - ) / block + ;
maxx = ;
for (int i = ; i <= cnt; i++)
{
l[i] = (i - ) * block + , r[i] = min(n, i * block);
for (int j = ; j <= maxn; j++)
f[i][j] = f[i - ][j];
for (int j = ; j <= maxx; j++)
for (int k = ; k < maxx; k++)
g[i][j][k] = g[i - ][j][k];
for (int j = l[i]; j <= r[i]; j++)
{
kuai[j] = i;
f[i][a[j]]++;
for (int k = ; k <= maxx; k++)
g[i][k][a[j] % k]++;
}
}
for (int i = ; i <= m; i++)
{
int ll, rr, p, v;
scanf("%d%d%d%d", &ll, &rr, &p, &v);
ans = ;
v %= p;
int L = kuai[ll], R = kuai[rr];
if (L < R)
{
if (p <= )
ans += g[R - ][p][v] - g[L][p][v];
else
for (int i = v; i <= maxn; i += p)
ans += f[R - ][i] - f[L][i];
for (int j = ll; j <= r[L]; j++)
if (a[j] % p == v)
ans++;
for (int j = l[R]; j <= rr; j++)
if (a[j] % p == v)
ans++;
}
else
for (int j = ll; j <= rr; j++)
if (a[j] % p == v)
ans++;
printf("%d\n", ans);
} return ;
}

noip模拟赛 街灯的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. TestNG设置用例循环执行

    曾经做过一需求,需要单个集成测试用例循环执行N次,或许你会说for循环就可以了,这当然是可以的.那有没有逼格更高点的方法,当然也是有的.下面我们就说下使用TestNG注解功能实现用例的循环执行. 1. ...

  2. Akka源码分析-Cluster-Metrics

    一个应用软件维护的后期一定是要做监控,akka也不例外,它提供了集群模式下的度量扩展插件. 其实如果读者读过前面的系列文章的话,应该是能够自己写一个这样的监控工具的.简单来说就是创建一个actor,它 ...

  3. 乐搏讲自动化测试- Python环境搭建(7)

    Python的下载和安装 Python可应用于多平台包括 Linux 和 Mac OS X.你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Py ...

  4. css 实现 checkbox 大小调整

    一般调整 checkbox 大小我们想到的是 width.height,可是设置后,发现是没有效的. 如微信小程序里面,checkbox 默认就很大,想设置小一点怎么办? transform: sca ...

  5. laravel生命周期和核心思想

    工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...

  6. v形 加强版

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  7. 解决安装androidstudio无法查看源代码的问题

    如果androidstudio的sdk是自己导入的,则可能会有查看不了源代码的原因.原因是默认目录中没有这个api的源代码. 1.先在C:\Users\xxx\.AndroidStudio2.3\co ...

  8. [Windows Server 2008] IP安全策略限制端口方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:限制143 ...

  9. My-Eclipse 快捷键大全

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+ ...

  10. 【转】非常好的Java反射例子

    转自 http://www.douban.com/note/306848299/ 原文: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时 ...