欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

#6277. 数列分块入门 1——(分块)

程序员文章站 2022-03-10 23:05:32
总结学习莫队算法之前,屁颠屁颠跑来学习分块。第一次学习分块的思想,一种优雅的暴力思想,感觉还不错。时间复杂度(n+m√n)题量链接//#pragma GCC optimize(2)//#pragma GCC target ("sse4")#include//typedef long long ll;#define ull unsigned long long#define int long long#define F...

总结

学习莫队算法之前,屁颠屁颠跑来学习分块。
第一次学习分块的思想,一种优雅的暴力思想,感觉还不错。时间复杂度(n+m√n)

题量链接

//#pragma GCC optimize(2)
//#pragma GCC target ("sse4")
#include<bits/stdc++.h>
//typedef long long ll;
#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<<flush
#define eps         1e-6
#define base        131
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define ferma(a,b)  pow(a,b-2)
#define mod(x)      (x%mod+mod)%mod
#define pb          push_back
#define decimal(x)  cout << fixed << setprecision(x);
#define all(x)      x.begin(),x.end()
#define rall(x)      x.rbegin(),x.rend()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
template<typename T> inline T fetch(){T ret;cin >> ret;return ret;}
template<typename T> inline vector<T> fetch_vec(int sz){vector<T> ret(sz);for(auto& it: ret)cin >> it;return ret;}
template<typename T> inline void makeUnique(vector<T>& v){sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());}
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
    //  freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout);
#endif
}
const int N=5e4+5;
int a[N],n,m,num,block;
int l[N],r[N],belong[N],tag[N];
void init()
{
    block=sqrt(n);
    num=ceil(n*1.0/block);
    for(int i=1;i<=num;i++)
        l[i]=(i-1)*block+1,r[i]=i*block;
    r[num]=n;
    for(int i=1;i<=n;i++)
        belong[i]=(i-1)/block+1;
}
void add(int x,int y,int c)
{
    if(belong[x]==belong[y])
    {
        for(int i=x;i<=y;i++)
            a[i]+=c;
        return ;
    }
    for(int i=x;i<=r[belong[x]];i++)
        a[i]+=c;
    for(int i=belong[x]+1;i<=belong[y]-1;i++)
        tag[i]+=c;
    for(int i=l[belong[y]];i<=y;i++)
        a[i]+=c;
}
signed main()
{
    IOS;
    file();
    cin>>n;
    init();
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        int o,x,y,c;
        cin>>o>>x>>y>>c;
        if(o)
            cout<<a[y]+tag[belong[y]]<<endl;
        else
            add(x,y,c);
    }



    return 0;
}

本文地址:https://blog.csdn.net/weixin_44224825/article/details/107182288