码迷,mamicode.com
首页 > 其他好文 > 详细

「题解」:天才绅士少女助手克里斯蒂娜

时间:2019-10-06 09:16:22      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:时间   limits   ret   lin   ==   none   span   gis   namespace   

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

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

题面


题面谢绝公开。

题解


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

$\sum\limits_{i=l}^r \sum\limits_{j=l}^r x_i^2 y_j^2 - x_i y_i x_j y_j$

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

$(\sum\limits_{i=l}^{r}x_i^2)\times(\sum\limits_{i=l}^{r}y_i^2) - (\sum\limits_{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\n",((ux*uy%mod-uxy*uxy%mod)%mod+mod)%mod);
        }
    }
    return 0;
}
View Code

「题解」:天才绅士少女助手克里斯蒂娜

标签:时间   limits   ret   lin   ==   none   span   gis   namespace   

原文地址:https://www.cnblogs.com/xingmi-weiyouni/p/11626375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!