P3396 哈希冲突 根号分治模板题
Posted kaka0010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3396 哈希冲突 根号分治模板题相关的知识,希望对你有一定的参考价值。
原题链接:https://www.luogu.com.cn/problem/P3396
不过多介绍了,基础的分块技巧
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int ul;
typedef pair<int, int> PII;
const ll inf = 2e18;
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const ll mod = 1e9 + 7;
const double eps = 1e-8;
#define lowbit(i) (i & -i)
#define Debug(x) cout << (x) << endl
#define fi first
#define se second
#define mem memset
#define endl '\\n'
int a[N], n, m;
int sum[405][405];
int ask(int x, int y) //y池,模x
int ans = 0;
for (int i = y; i <= n; i += x) ans += a[i];
return ans;
void add(int x, int val) //x位置,加val
for (int i = 1; i <= 400; i++)
sum[x%i][i] += val;
inline void solve()
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int p = 1; p <= 400; p++)
for (int i = 0; i < p; i++)
for (int j = i; j <= n; j += p)
sum[i][p] += a[j];
while (m--)
char op; cin >> op;
int x, y; cin >> x >> y;
if (op == 'A')
if (x <= 400)
printf("%d\\n", sum[y][x]);
else
printf("%d\\n", ask(x, y));
else
add(x, -a[x]);
add(x, y);
a[x] = y;
signed main()
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#ifdef ACM_LOCAL
freopen("input", "r", stdin);
freopen("output", "w", stdout);
signed test_index_for_debug = 1;
char acm_local_for_debug = 0;
do
if (acm_local_for_debug == '$') exit(0);
if (test_index_for_debug > 20)
throw runtime_error("Check the stdin!!!");
auto start_clock_for_debug = clock();
solve();
auto end_clock_for_debug = clock();
cout << "Test " << test_index_for_debug << " successful" << endl;
cerr << "Test " << test_index_for_debug++ << " Run Time: "
<< double(end_clock_for_debug - start_clock_for_debug) / CLOCKS_PER_SEC << "s" << endl;
cout << "--------------------------------------------------" << endl;
while (cin >> acm_local_for_debug && cin.putback(acm_local_for_debug));
#else
solve();
#endif
return 0;
以上是关于P3396 哈希冲突 根号分治模板题的主要内容,如果未能解决你的问题,请参考以下文章