洛谷 P3396 哈希冲突
洛谷 P3396 哈希冲突
Problem
Solution
本文摘自基础数据结构学习笔记
先想两种极端的做法
- 对于每个询问,暴力计算\(k,k+p,k+2\times p\dots\)的\(value\)之和。
- 预处理出\(ans[p][k]\)表示在\(\bmod p\)的意义下,余数为\(k\)的\(value\)之和。
第一种方法时间\(\rm O(n^2)\),空间\(\rm O(1)\);第二种方法时间\(\rm O(1)\),空间\(O(n^2)\)。
考虑根号分治。
对于\(p\le \sqrt n\),我们预处理,保存在数组\(ans[p][k]\)中。空间\(\rm O(\sqrt n\times\sqrt n)=\rm O(n)\),时间上预处理\(\rm O(n\sqrt n)\),修改\(\rm O(\sqrt n)\),查询\(\rm O(1)\).
对于\(p>\sqrt n\),我们不预处理,每一次询问暴力统计。每次统计的数量不会超过\(\dfrac np\le \sqrt n\).
\(\color{white}我做了那些Ynoi我都白做了啊啊啊,这么简单的一个根号分治我都想不出来……我太菜了……\color{gray}awa\)
Code
/**************************************************************
* Problem: 3396
* Author: Vanilla_chan
* Date: 20210402
* E-Mail: Vanilla_chan@outlook.com
**************************************************************/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<limits.h>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#ifdef TH
#define debug printf("Now is %d\n",__LINE__);
#else
#define debug
#endif
#ifdef ONLINE_JUDGE
char buf[1<<23],* p1=buf,* p2=buf,obuf[1<<23],* O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
using namespace std;
namespace oi
{
inline bool isdigit(const char& ch)
{
return ch<='9'&&ch>='0';
}
inline bool isalnum(const char& ch)
{
return (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9');
}
struct istream
{
char ch;
bool fu;
template<class T>inline istream& operator>>(T& d)
{
fu=(d=0);
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=1,ch=getchar();
d=ch-'0';ch=getchar();
while(isdigit(ch))
d=(d<<3)+(d<<1)+(ch^'0'),ch=getchar();
if(fu) d=-d;
return *this;
}
inline istream& operator>>(char& ch)
{
ch=getchar();
for(;!isalnum(ch);ch=getchar());
return *this;
}
inline istream& operator>>(string& str)
{
str.clear();
for(;!isalnum(ch);ch=getchar());
while(isalnum(ch))
str+=ch,ch=getchar();
return *this;
}
}cin;
inline int read()
{
int x=0,fu=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)) { x=x*10+ch-'0';ch=getchar(); }
return x*fu;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do { G[++g]=x%10;x/=10; } while(x);
for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
};
using namespace oi;
#define N 150010
#define S 500
int n,m;
int val[N];
int sq;
int ans[S][S];
int main()
{
freopen("3396.in","r",stdin);
//freopen(".out","w",stdout);
n=read();
m=read();
sq=sqrt(n);
for(int i=1;i<=n;i++) val[i]=read();
for(int i=1;i<=sq;i++)
{
for(int j=1;j<=n;j++)
{
ans[i][j%i]+=val[j];
}
}
char op;
int x,y;
while(m--)
{
oi::cin>>op>>x>>y;
if(op=='A')
{
if(x<=sq)
{
write(ans[x][y]);
}
else
{
int ans=0;
for(int i=y;i<=n;i+=x) ans+=val[i];
write(ans);
}
}
else
{
for(int i=1;i<=sq;i++)
{
ans[i][x%i]+=y-val[x];
}
val[x]=y;
}
}
return 0;
}
洛谷 P3396 哈希冲突的更多相关文章
- 洛谷P3396 哈希冲突 (分块)
洛谷P3396 哈希冲突 题目背景 此题约为NOIP提高组Day2T2难度. 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣. ...
- 洛谷 P3396 哈希冲突 解题报告
P3396 哈希冲突 题目背景 此题约为NOIP提高组Day2T2难度. 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣.他会 ...
- 洛谷P3396 哈希冲突
分块还真是应用广泛啊...... 题意:求 解:以n0.5为界. 当p小于n0.5的时候,直接用p²大小的数组储存答案. 预处理n1.5,修改n0.5. 当p大于n0.5的时候,直接按照定义计算,复杂 ...
- 洛谷P3396哈希冲突
传送门啦 非常神奇的分块大法. 这个题一看数据范围,觉得不小,但是如果我们以 $ \sqrt(x) $ 为界限,数据范围就降到了 $ x < 400 $ 我们设数组 $ f[i][j] $ 表示 ...
- 洛谷P3396 哈希冲突(分块)
传送门 题解在此,讲的蛮清楚的->这里 我就贴个代码 //minamoto #include<iostream> #include<cstdio> #include< ...
- P3396 哈希冲突(思维+方块)
题目 P3396 哈希冲突 做法 预处理模数\([1,\sqrt{n}]\)的内存池,\(O(n\sqrt{n})\) 查询模数在范围里则直接输出,否则模拟\(O(m\sqrt{n})\) 修改则遍历 ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- P3396 哈希冲突
很好的根号算法(这种思想好像叫根号分治?) 首先,暴力是Ο(n2)的 考虑预处理: for(p=1;p<=n;p++) //枚举模数 ans[p][i%p]+=value[i]; 看似很好但还是 ...
- p3396 哈希冲突(暴力)
想了好久,没想到优秀的解法,结果是个暴力大吃一静.jpg 分类讨论,预处理\(p\le \sqrt{n}\) 的情况,其他直接暴力,复杂度\(O(n \sqrt{n} )\) #include < ...
- 【洛谷3950】部落冲突(LCT维护连通性)
点此看题面 大致题意: 给你一棵树,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 有一道类似的题目:[BZOJ2049][SDOI2008] Cave 洞穴勘测. ...
随机推荐
- minikube搭建Kubernetes环境
前言 Kubernetes 一般都运行在大规模的计算集群上,管理很严格,Kubernetes 充分考虑到了这方面的需求,提供了一些快速搭建 Kubernetes 环境的工具. minikube 它是一 ...
- mac地址查询
打开命令提示符窗口(cmd程序) 快捷键 win+r 打开运行窗口,输入 cmd 命令打开 命令提示符窗口 或者点击开始菜单,在搜索程序和文件输入框,输入 cmd(会找到进入dos命令的cmd程序) ...
- composer 指定php版本
需要指定php和composer的位置,然后再去执行composer命令 ## 指定PHP版本 指定composer 指定载入包 /usr/local/php7/bin/php composer /u ...
- 表访问方法:PostgreSQL 中数据更新的处理方式
作者:Cary 前言 本文将详细探讨 PostgreSQL 如何处理更新操作.在 PostgreSQL 中,成功的更新可以被视为"插入一条新记录",同时"标记旧记录为不可 ...
- IvorySQL 4.0 之兼容 Oracle 包功能设计思路解读
日前,IvorySQL 4.0 发布,该版本新增了兼容 Oracle 包功能的新特性. 为了大家能够更好地理解和使用 IvorySQL 4.0,本文将简要介绍实现此功能时的设计思路. Oracle 的 ...
- ORA-01779: 无法修改与非键值保存表对应的列”中涉及的概念和解决方法
什么是键值保存表(Key-Preserved Table)? 在理解什么是键值保存表之前,首先要知道 可更新的联接视图 这个概念,键值保存表只是保存了允许更新的字段信息的一张表.为什么会出现这么一张表 ...
- 【Java】字符串常用操作
字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...
- study Rust-1【Rust的特点和应用场景】
Rust语言的特点 高性能 - Rust 速度惊人且内存利用率极高.由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成. 可靠性 - Rust ...
- FREERTOS_LWIP TcpServer 加快接收速度
刚开始调试时,关注点都在接收缓存等参数上,接受的间隔上限时钟在250ms左右. 后来发现是其中一个参数的设定决定了接收的速度,调整参数后,可以达到每80ms接收1024个字节. 发文留存,备忘.
- mybatis的输入参数类型
一.传递简单数据类型 二.传入一个bean对象 三.传入一个包装对象(对象中存放对象)