分析:对于前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[1000010], b[1000010], cnt, tot, c[1000100], sizee, L = 1, R = 0, tong[1000010], ans[1000010];
bool flag = true;struct node
{int l, r, p, v,id;
}e[100010];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 = 1; i <= n; i++)scanf("%d", &a[i]);cnt = 0;for (int i = 1; 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 != 1 && e[i].p != e[i - 1].p)flag = false;b[++cnt] = e[i].v;}if (flag){for (int i = 1; i <= n; i++){a[i] %= e[1].p;b[++cnt] = a[i];}memcpy(c, b, sizeof(b));sort(c + 1, c + 1 + cnt);tot = unique(c + 1, c + 1 + cnt) - c - 1;for (int i = 1; i <= n; i++)a[i] = lower_bound(c + 1, c + 1 + tot, a[i]) - c - 1;for (int i = 1; i <= m; i++)e[i].v = lower_bound(c + 1, c + 1 + tot, e[i].v) - c - 1;sizee = (int)sqrt(n);sort(e + 1, e + 1 + m, cmp);for (int i = 1; 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 = 1; i <= m; i++)printf("%d\n", ans[i]);}else{for (int i = 1; i <= m; i++){int cnt = 0;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 0;
}

100分正解:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int n, m, a[100010], maxn, block, cnt, maxx, l[10010], r[10010], ans;
int f[1010][10010], g[1010][70][70], kuai[100100];int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);maxn = max(maxn, a[i]);}block = 100;cnt = (n - 1) / block + 1;maxx = 60;for (int i = 1; i <= cnt; i++){l[i] = (i - 1) * block + 1, r[i] = min(n, i * block);for (int j = 0; j <= maxn; j++)f[i][j] = f[i - 1][j];for (int j = 1; j <= maxx; j++)for (int k = 0; k < maxx; k++)g[i][j][k] = g[i - 1][j][k];for (int j = l[i]; j <= r[i]; j++){kuai[j] = i;f[i][a[j]]++;for (int k = 1; k <= maxx; k++)g[i][k][a[j] % k]++;}}for (int i = 1; i <= m; i++){int ll, rr, p, v;scanf("%d%d%d%d", &ll, &rr, &p, &v);ans = 0;v %= p;int L = kuai[ll], R = kuai[rr];if (L < R){if (p <= 60)ans += g[R - 1][p][v] - g[L][p][v];elsefor (int i = v; i <= maxn; i += p)ans += f[R - 1][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++;}elsefor (int j = ll; j <= rr; j++)if (a[j] % p == v)ans++;printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/7764387.html

noip模拟赛 街灯相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  3. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  4. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  5. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  6. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  7. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  8. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

  9. NOIP模拟赛套路技巧经验总结

    前言 还有2天就NOIP了,之前做了这么多场模拟赛,是时候拿出来总结一下, 算是给自己一针强心剂. 列表 从最近的考试总结起(个人认为的重点,可能有重复,仅供参考): (转化很重要,一定要简化问题过后 ...

最新文章

  1. 文件服务器结构,文件服务器结构
  2. UI组件之TextView及其子类(二)RadioButton和CheckBox
  3. linux php5.3 ssh2,Linux 安装php 的 ssh2扩展
  4. 主键和索引哪个快_数据库两大神器【索引和锁】
  5. Android 获取本地外网IP、内网IP、计算机名等信息
  6. Matlab元胞数组操作
  7. poj2750 PottedFlower(线段树的环状操作)
  8. Java利用jacob实现文档格式转换
  9. 80-10-015-原理-Java NIO-ByteBuffer
  10. javax.net.ssl.SSLException: closing inbound before receiving peer‘s close_notif---SpringCloud工作笔记111
  11. 一步一步学习Git(2)——Git基本操作
  12. 配电站房可视化巡检智能监控系统
  13. MySQL处理生意参谋_生意参谋低点击率怎么处理?
  14. Linux libmodbus库编译,libmodbus编译安装使用
  15. 用之前使用正常的keil工程调试程序时,一直卡在 0x00000000 的解决方案
  16. git将一个分支的提交合并到另一个分支
  17. 亮度键消失、亮度键失灵且电脑亮度为最大 | 小米 | win11 | 解决办法最最最全合集
  18. PMP考试有哪些科目
  19. 硬件学习之路-改善稳压电路的动态响应
  20. (Tiled官方文档翻译)第一节:简介及创建工程、图层集

热门文章

  1. python程序基础网课答案_知到Python程序设计基础网课答案
  2. 图像信息隐藏(索引图象)
  3. EVE模拟器完整路由拓扑实验报告
  4. 液晶显示屏的C语言编码,AT89C51单片机驱动液晶显示汉字C语言
  5. SSRPanel 后端配置对接教程
  6. MatLab实现的ftt大数乘法
  7. 测试IP和端口是否通
  8. 如何使用HTML5+CSS3绘制一个QQ 企鹅Logo
  9. unity 音频可视化方案
  10. 赠书丨如何高效学习计算机视觉?