zoukankan      html  css  js  c++  java
  • 「题解」:天才绅士少女助手克里斯蒂娜

    问题 B:天才绅士少女助手克里斯蒂娜

    时间限制: 2 Sec  内存限制: 512 MB

    题面


    题面谢绝公开。

    题解


    化一批柿子就能线段树维护了……以下抄迪哥柿子

    $sumlimits_{i=l}^r sumlimits_{j=l}^r x_i^2 y_j^2 - x_i y_i x_j y_j$

    经过一系列复杂神奇的物理生物化学傅立叶变化这个柿子变成了这样(其实就是乘法分配律……)

    $(sumlimits_{i=l}^{r}x_i^2) imes(sumlimits_{i=l}^{r}y_i^2) - (sumlimits_{i=l}^{r}x_iy_i)^2$

    线段树维护$x_i^2、y_i^2、x_iy_i$的区间和即可。

    #include<bits/stdc++.h>
    #define int long long
    #define mod 20170927
    #define read(A) A=init()
    #define rint register int
    using namespace std;
    inline int init()
    {
        int a=0,b=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')b=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){a=(a<<3)+(a<<1)+ch-'0';ch=getchar();}
        return a*b;
    }
    int n,m,x[1000006],y[1000006];
    struct node{int x,y,k;}t[1000006<<2];
    inline void update(int k)
    {
        t[k].x=(t[k<<1].x+t[k<<1|1].x)%mod;
        t[k].y=(t[k<<1].y+t[k<<1|1].y)%mod;
        t[k].k=(t[k<<1].k+t[k<<1|1].k)%mod;
    }
    inline void build(int k,int l,int r)
    {
        if(l==r)
        {
            int in_x,in_y;
            read(in_x),read(in_y);in_x%=mod,in_y%=mod;
            t[k].x=in_x*in_x%mod;t[k].y=in_y*in_y%mod;
            t[k].k=in_x*in_y%mod;
            return ;
        }
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        update(k);
        return ;
    }
    inline void change(int k,int l,int r,int p,int dx,int dy)
    {
        if(l==r)
        {
            t[k].x=dx*dx;t[k].y=dy*dy;
            t[k].k=dx*dy;return ;
        }
        int mid=(l+r)>>1;
        if(p<=mid)change(k<<1,l,mid,p,dx,dy);
        else change(k<<1|1,mid+1,r,p,dx,dy);
        update(k);
        return ;
    }
    inline void query(int k,int l,int r,int L,int R,int &dx,int &dy,int &dxy)
    {
        if(L<=l&&r<=R)
        {
            dx=(dx+t[k].x)%mod,dy=(dy+t[k].y)%mod;
            dxy=(dxy+t[k].k)%mod;return ;
        }
        int mid=(l+r)>>1,linx=0,liny=0,linxy=0;
        if(L<=mid)query(k<<1,l,mid,L,R,linx,liny,linxy);
        if(R>mid)query(k<<1|1,mid+1,r,L,R,linx,liny,linxy);
        dx=(dx+linx)%mod,dy=(dy+liny)%mod;
        dxy=(dxy+linxy)%mod;return ;
    }
    signed main()
    {
        read(n),read(m);
        build(1,1,n);
        for(rint i=1,Q,P,X,Y;i<=m;++i)
        {
            read(Q);
            if(Q==1)
            {
                read(P),read(X),read(Y);
                change(1,1,n,P,X,Y);
            }
            else
            {
                read(X),read(Y);
                int ux=0,uy=0,uxy=0;
                query(1,1,n,X,Y,ux,uy,uxy);
                printf("%lld
    ",((ux*uy%mod-uxy*uxy%mod)%mod+mod)%mod);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    20172306 2018-2019-2 《Java程序设计与数据结构》第七周学习总结
    20172306 2018-2019-2 《Java程序设计与数据结构》第六周学习总结
    网页图片
    20172302 2018-2019-1《程序设计与数据结构》课程总结
    Do-Now—团队Scrum 冲刺博客五
    Do-Now—团队Scrum 冲刺博客二
    哈夫曼编码测试
    20172302 《Java软件结构与数据结构》实验三:查找与排序实验报告
    团队作业第一周
    20172302 《Java软件结构与数据结构》第九周学习总结
  • 原文地址:https://www.cnblogs.com/xingmi-weiyouni/p/11626375.html
Copyright © 2011-2022 走看看