分块——cf1207F

这么傻逼的题当时想了那么久

用a数组维护原序列,b[i][j]表示 pos%i=j 的 a[pos]之和

对于每个修改1 x y,先直接修改a[x],然后枚举i=1..700,修改b[i][x%i]

对于每个查询2 x y,如果x>700,那么我们直接去a数组里枚举i=kx+y,

如果x<700,b[x][y]就是答案

#include<bits/stdc++.h>
using namespace std;
#define N 500005
#define ll long long 
ll a[N],b[705][705];
int q;
int main(){
    cin>>q;
    while(q--){
        int op,x,y;
        scanf("%d%d%d",&op,&x,&y);
        if(op==1){
            a[x]+=y;
            for(int i=1;i<=700;i++)
                b[i][x%i]+=y;
        }
        if(op==2){
            ll ans=0;
            if(x>700){
                for(int i=y;i<=500000;i+=x)
                    ans+=a[i];
            }
            else ans=b[x][y];
            cout<<ans<<endl;
        }
    }
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/11511455.html
今日推荐