Editorial for 串一串脆薯4


記住 在沒有思路時使用題解,不要複製貼上代碼。請尊重題目和題解的作者。
在真正親自解開題目前提交官方題解的代碼是可以封禁的罪行。

作者: koukirocks

僅供參考

#include <bits/stdc++.h>
#define speed ios_base::sync_with_stdio(0); cin.tie(0)
#define all(x) (x).begin(),(x).end()
#define F first
#define S second
// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx,avx2")
// #pragma GCC target("popcnt")

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const ll MAX=2e5+10,P=1e9+7;
const ll INF=0x3f3f3f3f,oo=0x3f3f3f3f3f3f3f3f;
const ldb eps=1e-9;
const ldb PI=acos(-1.0);
const int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
template<typename T>
using vvector = vector<vector<T>>;

struct query {
    ll id,d,r,c;
};

int main(int argc,char* argt[]) {
    speed;
    // string fin=argt[1];
    // freopen((fin+".in").c_str(),"r+",stdin);
    // freopen((fin+".out").c_str(),"w+",stdout);
    int n,q;
    cin>>n>>q;
    int sq=sqrt(n)+eps;
    vector<query> E;
    vector<ll> a(n+1);
    for (int i=0;i<q;i++) {
        ll l,r,k,c;
        cin>>l>>r>>k>>c;
        if (k<=sq) {
            int rem=l%k;
            int cnt=(r-l)/k+1;
            E.push_back({l,k,rem,c});
            E.push_back({l+cnt*k,k,rem,-c});
        } else {
            for (int j=l;j<=r;j+=k) a[j]+=c;
        }
    }
    sort(all(E),[&](query a,query b) {
        return a.id<b.id;
    });
    // cerr<<"fjdnbgkjfdgdsf\n"<<flush;
    vvector<ll> add(sq+1,vector<ll>(sq));
    int eid=0;
    for (int i=1;i<=n;i++) {
        while (eid<E.size() and E[eid].id==i) {
            // cout<<E[eid].id<<" "<<E[eid].d<<" "<<E[eid].r<<" "<<E[eid].c<<"\n";
            add[E[eid].d][E[eid].r]+=E[eid].c;
            eid++;
        }
        a[i]+=add[1][0];
        for (int j=2;j<=sq;j++) {
            a[i]+=add[j][i%j];
        }
    }
    for (int i=1;i<=n;i++) {
        cout<<a[i]<<" ";
    }
    cout<<"\n";
    return 0;
}

留言

目前沒有評論。