P3396 哈希冲突

7人阅读 评论(0) 收藏 举报
分类:

一开始看着题目毫无思路…
只有一个暴力才能维持的了10分的样子…
想着打开时的标签:分块….
死活不会统计…
然后弃疗…
换了一个方向思考,,,
首先如果查询x>y肯定都不用管..直接输出0
考虑模数在n范围以内,那么对于模数特别大的情况,发现每个池子的数很少,可以暴力统计。
对于模数小的情况,发现他的预处理很简单的样子…
然后就发现,,,把大于sqrt(n)的数暴力处理是在O(n) 的,把小于n的数更新也是O(n)
发现这样处理时间O(nn)

c++代码如下:

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x; i <= y ; ++ i)
#define repd(i,x,y) for(register int i = x; i >= y ; -- i)
using namespace std;
template<typename T>inline void read(T&x)
{
    char c;int sign = 1;x = 0;
    do { c = getchar(); if( c == '-' ) sign = -1; }while(!isdigit(c));
    do { x = x * 10 + c - '0'; c =getchar(); } while(isdigit(c));
    x *= sign;
}

const int N = 400;
int pre[N][N],a[N*N];
int n,m,d;

inline void PRE()
{
    rep(j,1,n)
        rep(i,1,d)
            pre[i][j%i] += a[j];
}

inline void solve(int x,int y)
{
    if(y >= x) return void(puts("0"));
    if(x > d)
    {
        int ans = 0,now = y;
        while(now <= n)
        {
            ans += a[now];
            now += x;
        }
        printf("%d\n",ans);
    }
    else printf("%d\n",pre[x][y]);
}

inline void update(int x,int y)
{
    rep(i,1,d)
        pre[i][x % i] += y - a[x];
    a[x] = y;
}

char op[2];
int x,y;
int main()
{
    read(n); read(m);
    d = sqrt(n);
    rep(i,1,n) read(a[i]);
    PRE();
    rep(i,1,m)
    {
        scanf("%s",op);
        if( op[0] == 'A' ) 
        {
            read(x); read(y);
            solve(x,y);
        }
        else 
        {
            read(x); read(y);
            update(x,y);
        }
    }
    return 0;
}
查看评论

洛谷-P3396 哈希冲突 分块

题目 题目链接 题意 给你个数列,编号为1…n1…n1…n。 给出两种操作: 查询操作:查询所有编号模xxx得yyy的对应数字之和。 修改操作:把编号为xxx的数字,修改为yyy。 ...
  • weixin_37517391
  • weixin_37517391
  • 2018-04-02 19:55:15
  • 33

洛谷 P3396 哈希冲突 分块

题目: 洛谷P3396大意:一个序列,两种操作,单点修改和查询sum(a[xk+y]),给出x和y,k为任意一个满足xk+ysqrt(n)时,一次查询就是O(sqrt(n))的,这又不会TLE。问题...
  • liangzihao1
  • liangzihao1
  • 2018-03-03 14:49:33
  • 25

链地址处理哈希冲突方法

基本原理就是:将地址冲突的一些不同的值,挂在同一条链表上。 举例代码如下: //哈希表 /* 链地址发处理哈希冲突 2015年8月24日09:19:49 */ #include #include...
  • qq_21063873
  • qq_21063873
  • 2015-08-24 10:32:44
  • 2276

Hash算法解决冲突的方法一般有以下几种常用的解决方法

Hash算法解决冲突的方法一般有以下几种常用的解决方法  1, 开放定址法:  所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入...
  • seulzz
  • seulzz
  • 2017-08-14 17:05:49
  • 447

PHP核心技术与最佳实践之Hash表冲突

PHP核心技术与最佳实践之Hash表冲突 接着上一篇文章,测试后输出value1value2.当 $ht->insert(‘key12’,’value12’); Echo $ht ->find(‘ke...
  • u012675743
  • u012675743
  • 2015-04-14 21:55:01
  • 600

解决哈希(Hash)冲突的主要方法

1.hash表简介:把任意长度的输入编程固定长度的输出,压缩映射。 2.解决哈希冲突的主要方法。...
  • qiyejunlintian
  • qiyejunlintian
  • 2015-08-25 16:00:22
  • 2546

哈希冲突

提高hash表查找性能,除了考虑选择合适的hash表表长和完美的hash函数外,还必须考虑hash表处理冲突的能力。当hash函数对两个不同的数据项产生了相同的hash值时,冲突就产生了。对于冲突的处...
  • zoomtech
  • zoomtech
  • 2014-09-11 09:30:48
  • 191

数据结构之解决哈希冲突的四种方法

哈希表是存储数据的一种结构,增加的数据对应哈希表的特定地址,一个地址只允许有一个数据。要增加的数据应该存放在哪个地址是由散列函数确定的,但是不管散列函数如何取,总是避免不了计算的结果是同一个地址的情况...
  • Iamthedoctor123
  • Iamthedoctor123
  • 2018-02-18 16:21:24
  • 51

哈希算法以及解决哈希冲突

散列表,它是基于高速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构能够理解为一个线性表,可是当中的元素不是紧密排列的,而是可能存在空隙。 散列表(Hash table...
  • sinat_28603977
  • sinat_28603977
  • 2016-12-06 11:15:34
  • 583

解决哈希冲突的几种方法

虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的。当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时。冲突就难免会发 生。另外,当关键字的实际取值大于哈希表的长度时,而且表中...
  • HEYUTAO007
  • HEYUTAO007
  • 2014-09-02 22:13:30
  • 1979
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1978
    积分: 775
    排名: 6万+
    博客专栏
    文章分类
    文章存档