ITPub博客

首页 > 应用开发 > > 请问我的CH4301有什么问题?

请问我的CH4301有什么问题?

作者:chinarocky 时间:2019-08-13 14:26:11 0 删除 编辑

答案错误,0分。蒟蒻嘤嘤嘤

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int Maxn=5e5+2;
int n,m;
ll a[Maxn],b[Maxn],c[Maxn],t[Maxn<<2];
inline ll gcd(ll x,ll y)
{
    if ((!x)||(!y)) return x^y;
    return y==0?x:gcd(y,x%y);
}
void build(int l,int r,int p)
{
    if (l==r)
    {
        t[p]=b[l];
        return;
    }
    int mid=(l+r)>>1,lson=p<<1,rson=p<<1|1;
    build(l,mid,lson);
    build(mid+1,r,rson);
    t[p]=gcd(t[lson],t[rson]);
}
void change(int l,int r,int p,int q,ll d)
{
    if (l==r)
    {
        t[p]+=d;
        return;
    }
    int mid=(l+r)>>1,lson=p<<1,rson=p<<1|1;
    if (q<=mid) change(l,mid,lson,q,d);
    else change(mid+1,r,rson,q,d);
    t[p]=gcd(t[lson],t[rson]);
}
ll ask(int lt,int rt,int l,int r,int p)
{
    if (lt<=l&&r<=rt)
        return abs(t[p]);
    int mid=(l+r)>>1,ansl=0,ansr=0;
    if (lt<=mid) ansl=ask(lt,rt,l,mid,p<<1);
    if (rt>mid) ansr=ask(lt,rt,mid+1,r,p<<1|1);
    return abs(gcd(ansl,ansr));
}
ll query(int x)
{
    ll sum=0;
    for(;x;x-=x&-x) sum+=c[x];
    return sum;
}
void add(int x,ll y)
{
    for(;x<=n;x+=x&-x) c[x]+=y;
}
int main()
{
    char ch[5];int L,R;ll d;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        scanf("%lld",&a[i]),b[i]=a[i]-a[i-1];
    build(1,n,1);
    for(int i=1;i<=m;++i)
    {
        scanf("%s%d%d",ch,&L,&R);
        if (ch[0]=='C')
        {
            scanf("%lld",&d);
            change(1,n,1,L,d);
            add(L,d);
            if (R<n)
                change(1,n,1,R+1,-d),add(R+1,-d);
        }
        else
            printf("%lld\n",abs(gcd(a[L]+query(L),ask(L+1,R,1,n,1))));
    }
    return 0;
}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4547/viewspace-3139800/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: java动态代理接口
请登录后发表评论 登录
全部评论

注册时间:2019-07-10

  • 博文量
    213
  • 访问量
    1690