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 ...
随机推荐
- SRAM、DRAM、Flash、DDR有什么区别
SRAM SRAM的全称是Static Rnadom Access Memory,翻译过来即静态随机存储器.这里的静态是指这种存储器只需要保持通电,里面的数据就可以永远保持.但是当断点之后,里面的数据 ...
- 网络拓扑—NAT内外网映射
使用Windows Server 2003 网络拓扑 Router 外网:NATIP 网段 = 192.168.17.0/24 内网:仅主机模式IP = 172.16.29.4 Client1:仅主机 ...
- 物联网平台在AIoT领域8大场景应用
物联网平台技术在AIoT智慧物联领域的应用越来越深入,尤其是在智慧城市建设项目中,提供了强有力的技术底座工具支撑.ToG的项目需要"门当户对"的服务商具备完善的资质和靠谱的技术服务 ...
- 「Python实用秘技17」快速获取国内节假日安排
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第17 ...
- MindSponge分子动力学模拟——体系控制(2024.05)
技术背景 在传统的分子动力学模拟软件中,对于分子体系的控制,例如控制体系的相对位置亦或是绝对位置,通常都是通过施加一些约束算法来实现的.例如用于限制化学键的LINCS算法,又比如水分子体系非常常用的S ...
- C# Afroge摄像头翻转90
1.dll和命名空间就不在此列举了,如下只是将转换方法介绍: 第一个函数: public void Rotate90() { // 计算角度,类变量 //dAngle = dAngle + 90; / ...
- 用 AI 速读海量文档!5款 AI 阅读工具推荐
在当今信息爆炸的时代,我们在手动搜集和处理信息时面临着几个挑战: 浩如烟海的信息量远远超出了我们的阅读能力. 信息的复杂性要求我们重复筛选和过滤. 专业或难以理解的内容需要被翻译成易懂的语言. 需要从 ...
- AI实用技巧 | 5分钟将coze集成到微信群机器人
细心的小伙伴已经注意到,国内的Coze平台已经开放了API,这一发现让他们感到兴奋不已.因此,他们迫切地想要掌握这一机会,将API应用到实际中,让Coze成为他们的得力助手.这样一来,他们就可以避免每 ...
- nonatomic 带来的线程安全问题
一.结论 一个对象对外暴露的读写属性,如果这个属性在多个线程中访问,一定会出现crash. 因此对外暴露的属性一定要考虑线程安全问题. 二.看下面的代码 下面的代码一定会crash,除非obj是ato ...
- JS中BOM事件,JS样式特效,表格对象和表单操作
DOM事件 1.DOM中的事件可以分为两类 1.浏览器行为 如:文档加载完成,图片加载完成 2.用户行为 如:输入框输入数据,点击按钮 (2).常见的DOM事件 onload 浏览器已完成页面的加载 ...