P9212 题解
显然,我们维护的答案具有 可差分 性,所以转换为 \([1,r]\) 上的查询。
首先,对于 \(x,y,a_i\) 先对 \(m\) 取模不影响结果。
下面为了方便令 \(v = a_i\)。
如果 \(x>y\)。
则一定是 \(x+v-m<y+v\)。
有 \(m \leq x+v\) 且 \(y+v < m\)。
转化为 \(m-x \leq v\) 且 \(x<m-y\)。
得到 \(v \in[m-x,m-y-1]\)。
如果 \(x<y\)。
答案为所有情况减去 \(x>y\) 的情况。
然后维护 \([1,r]\) 上的答案可以离线扫描一遍。
至此问题转化成维护一个集合,支持插入一个数以及查询 \(\bmod m\) 意义下 \(\in[m-x,m-y-1]\) 的数的数量。
考虑根号分治。
那么对于 \(m \leq \sqrt n\),我们记录所有 \(\bmod M = k\)(\(M \leq \sqrt n\)) 的数的出现次数,询问就直接回答。插入 \(O(\sqrt n)\),查询 \(O(\sqrt n)\)。
\(m > \sqrt n\) 的情况下满足条件的数构成桶上不多于 \(\sqrt n\) 个区间,用 \(O(1)\) 查询 \(O(\sqrt n)\) 修改的值域分块即可。插入 \(O(\sqrt n)\),查询 \(O(\sqrt n)\)。
那么就 \(O( (n+q) \sqrt n)\) 的做完了。
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+114;
struct Node{
int x,y,M,id,f;//anser[id]+=f*v f = 1 or -1
};
const int top = 100000;
const int B = 556;
vector<Node> A[maxn];//储存离线询问
int a[maxn];
int anser[maxn];//输出答案
struct block{
int pre[1000];
}cnt[1000];
int cnt_pre[1001];
int ans[1001][1001];
int n,q;
inline void change(int x,int val){
int sum = x/B;
x%=B;
if(x==0) sum--,x+=B;
for(int i=x;i<=B;i++) {
cnt[sum].pre[i]+=val;
}
for(int i=sum;i<=B;i++) cnt_pre[i]+=val;
}
inline int query(int l,int r){
if(l>r) return 0;
int lc=l/B;
l%=B;
int rc=r/B;
r%=B;
if(l==0) lc--,l+=B;
if(r==0) rc--,r+=B;
if(lc==rc) return cnt[lc].pre[r]-cnt[rc].pre[l-1];
int res=0;
res+=cnt[lc].pre[B]-cnt[lc].pre[l-1];
res+=cnt[rc].pre[r];
res+=cnt_pre[rc-1]-cnt_pre[lc];
return res;
}
void set_add(int x){//向集合中插入 x
change(x,1);
for(int j=1;j<B;j++){
ans[j][x%j]++;
}
}
inline int set_pre(int m,int k){//mod m 意义下小于等于 k 的数的数量
if(k<0) return 0;
if(m<B)
{
int sum=0;
for(int j=0;j<=k;j++){
sum+=ans[m][j];
}
return sum;
}
else{
int l=m,r=m+k,res=query(1,k);
while(r<top){
res+=query(l,r);
l+=m;
r+=m;
}
if(l<=top)
res+=query(l,top);
return res;
}
}
inline int set_query(int m,int l,int r){//mod m \in [l,r]
if(l>r||l<0||r<0) return 0;
return set_pre(m,r)-set_pre(m,l-1);
}
void scan(){
for(int i=1;i<=n;i++){
set_add(a[i]);
for(int j=0;j<A[i].size();j++){
Node now = A[i][j];
//处理询问 now
if(now.x%now.M==now.y%now.M){
anser[now.id]+=now.f*0;
}
else if(now.x%now.M>now.y%now.M){
int l=now.M-now.x%now.M,r=now.M-now.y%now.M-1;
anser[now.id]+=now.f*set_query(now.M,l,r);
}
else{
int l=now.M-now.y%now.M,r=now.M-now.x%now.M-1;
anser[now.id]+=now.f*(i-set_query(now.M,l,r));
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=q;i++){
int l,r,x,y,m;
cin>>l>>r>>x>>y>>m;
Node R,L;
R.f=1;
R.id=i;
R.M=m;
R.x=x;
R.y=y;
A[r].push_back(R);
L.f=-1;
L.id=i;
L.M=m;
L.x=x;
L.y=y;
A[l-1].push_back(L);
}//询问离线
scan();
for(int i=1;i<=q;i++) cout<<anser[i]<<'\n';
}
P9212 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 带你十天轻松搞定 Go 微服务系列全集+勘误
官网手册: https://go-zero.dev/cn/ 文档说明: https://zhuanlan.zhihu.com/p/461604538 本地开发运行环境: https://github. ...
- Mysql5.7 Linux编译安装教程
1.系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/usr/local/mysql 数据库保存位置:/usr/local/mysql/data 日志保存位置:/tm ...
- java学习之旅(day.01)
Markdown学习 标题 一级标题:#空格+标题名字 二级标题:##空格+标题名字 三级标题:###空格+标题名字 字体 粗体:两边都加两个** Hello,world 斜体:两边都加一个* Hel ...
- kubernetes官网交互式教程学习
官网:https://kubernetes.io/docs/tutorials/kubernetes-basics/ 点击进入,创建集群 连不上,回头再试
- Python 将PowerPoint (PPT/PPTX) 转为HTML
PPT是传递信息.进行汇报和推广产品的重要工具.然而,有时我们需要将这些精心设计的PPT演示文稿发布到网络上,以便于更广泛的访问和分享.本文将介绍如何使用Python将PowerPoint文档转换为网 ...
- 使用Chrome 开发者工具提取对应的字符串
最近在查看一个API的数据,效果很好,但是里面只有一部分我想要的内容 如果是简单一点的可以直接获取 如下比如我想要提取返回的代码中关键的字符串:"video": "这里的 ...
- linux下使用chattr创建一个连root都无法删除的文件
一.关于chattr,lsattr 1.chattr 的作用:改变一个Linux文件系统上的文件属性. 2.chattr用来改变文件.目录的属性,lsattr用来查看文件.目录的属性. 3.chatt ...
- CF527E Data Center Drama 题解
目录 题目 题意 题解 思路 详解 注意事项 代码 AC 记录 尾声 题目 CF527E Data Center Drama · 戳这里 题意 给定一张 $n$ 个点 $m$ 条边的连通无向图. 你需 ...
- Http 代理工具 实战 支持网页与QQ代理
前言: 有些公司不让员工上Q或封掉某些网站,这时候,干着急没办法,只能鄱墙.如果上网搜代理IP,很少能用,用HTTP-Tunnel Client代理软件,免费的也是经常性的掉线.正好手头上有N台服务器 ...
- 互联网软件的安装包界面设计-Inno setup
https://blog.csdn.net/oceanlucy/article/details/50033773 "安装界面太丑了,不堪入目!" "这界面应该属于20年代 ...