1. 程式人生 > 其它 >LuoguP3396 雜湊衝突

LuoguP3396 雜湊衝突

題目連結

對資料進行操作,資料結構是沒跑了
但是之前接觸的資料結構基本是對連續的幾個數或者特定的一個區間進行操作
這個就很迷

考慮從暴力先開始入手

  for(int i=y;i<=N;i+=x) ans += a[i];

這樣單詞修改代價是O(N)
考慮優化暴力,也只有分塊了
也就是我們要讓這個代價變成根號
發現就是x大於根號N的時候

如果x小於根號N,就可以直接預處理出來

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define MAXN 150005

int a[MAXN],ans[400][400];
int N,M;

int main() {

    cin >> N >> M; int block = sqrt(N);
    for(int i=1;i<=N;++i) {
        cin >> a[i];
        for(int j=1;j<=block;++j) ans[j][i%j] += a[i];
    }

    char opt; int x,y;
    for(int i=1;i<=M;++i) {
        cin >> opt >> x >> y;
        if(opt=='A') {
            if(x<=block) cout << ans[x][y] << '\n';
            else {
                int an = 0;
                for(int j=y;j<=N;j+=x) an += a[j];
                cout << an << '\n';
            }
        }
        else {
            for(int j=1;j<=block;++j) ans[j][x%j] -= a[x];
            a[x] = y;
            for(int j=1;j<=block;++j) ans[j][x%j] += a[x];
        }
    }

    return 0;
}