zoukankan      html  css  js  c++  java
  • 【CSP模拟赛】天才绅士少女助手克里斯蒂娜(线段树&读入优化&输出优化)

    题面描述

      红莉栖想要弄清楚楼下天王寺大叔的显像管电视对电话微波炉(暂定)”的影响.选取显像管的任意一个平面,一开始平面内有个n电子,初始速度分别为vi,定义飘升系数

    $$sum_{1leqslant i < jleqslant n}|v_{i} imes v_{j}|^{2}$$

      由于电视会遭到大叔不同程度的暴击,电子的速度常常会发生变化.也就是说,有两种类型的操:

      1 p x yvp改为(x;y)

      2 l r询问[l,r]这段区间内的电子的飘升系数

      这么简单的问题红莉栖当然能解决,但是她需要一个人帮忙验证一下结果的正确性.由于唯一帮得上忙的桶子去找菲利斯了,于是只能拜托你来完成这个任务了.答案对20170927取模即可.

    输入描述

      第一行两个整数n;m表示电子个数和询问个数.

      接下来n,每行两个整数x;y表示vi.

      接下来m,每行形如1 p x y2 l r,分别表示两种操作.

    输出描述

      对于每个操作2,输出一行一个整数表示飘升系数对20170927取模的值.

    样例输入

      9 5
      13052925 5757314
      9968857 11135327
      13860145 3869873
      6912189 3461377
      2911603 7061332
      6334922 7708411
      5505379 5915686
      6806727 588727
      7603043 15687404
      2 1 6
      1 7 2602783 18398476
      1 8 8636316 19923037
      2 2 7
      2 2 4

    样例输出

      18529202
      963126
      19167545

    分析

      直接把式子拿过来化简(应该说是化成好维护的亚子)

    $$sum_{lleqslant i < jleqslant r}|v_i imes v_j|^{2}$$

    $$=sum_{lleqslant i < jleqslant r} (a_i imes b_j - a_j imes b_i)^{2}$$

    $$=left(sum_{k=l}^r a_k^2 ight)left(sum_{k=l}^r b_k^2 ight)-left(sum_{k=l}^r a_kb_k ight)^2$$

      于是就可以直接维护$sum_{k=l}^r a_k^2$,$sum_{k=l}^r b_k^2$,$sum_{k=l}^r a_kb_k$,这些都可以用线段树区间合并维护

      然而考场上我多维护了一个$sum_{k=l}^r a_k^2b_k^2$,还没发现白维护了

      以后还是要先拿纸和笔算算小范围的情况找规律再推大的情况。

      而且这个题卡常,要写读入和输出优化(好像树状数组不需要来着?

      Code

    #include<cstdio>
    const int mod=20170927;
    const int maxn=1000005;
    int n,m;
    int sum[5][maxn<<3];
    void print(int x){if(x>9)print(x/10);putchar(x%10+'0');}
    int rd()
    {
        int f=1,x=0;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}return x*=f;
    }
    inline void fix(int id,int l,int r,int k,int x,int y)
    {
        if(l==r)
        {
            sum[1][id]=1ll*x*x%mod,sum[2][id]=1ll*y*y%mod,
            sum[3][id]=1ll*x*y%mod,sum[4][id]=1ll*sum[1][id]*sum[2][id]%mod;return;
        }
        int mid=(l+r)/2;k<=mid?fix(id*2,l,mid,k,x,y):fix(id*2+1,mid+1,r,k,x,y);
        sum[1][id]=(sum[1][id*2]+sum[1][id*2+1])%mod;
        sum[2][id]=(sum[2][id*2]+sum[2][id*2+1])%mod;
        sum[3][id]=(sum[3][id*2]+sum[3][id*2+1])%mod;
        sum[4][id]=(sum[4][id*2]+sum[4][id*2+1])%mod;
    }
    inline int que(int id,int l,int r,int l1,int r1,int tp)
    {
        if(r1<l||r<l1)return 0;
        if(l1<=l&&r<=r1)return sum[tp][id];
        int mid=(l+r)/2;return (que(id*2,l,mid,l1,r1,tp)+que(id*2+1,mid+1,r,l1,r1,tp))%mod;
    }
    int main()
    {
        n=rd();m=rd();
        for(int i=1,v1,v2;i<=n;i++)v1=rd(),v2=rd(),fix(1,1,n,i,v1,v2);
        for(int i=1,opt,l,r,x,y,k;i<=m;i++)
        {
            opt=rd();
            if(opt==1)k=rd(),x=rd(),y=rd(),fix(1,1,n,k,x,y);
            if(opt==2)
            {
                l=rd();r=rd();
                int sum1=que(1,1,n,l,r,1),sum2=que(1,1,n,l,r,2),sum3=que(1,1,n,l,r,3),sum4=que(1,1,n,l,r,4);
                int ans1=(1ll*sum1*sum2%mod-sum4+mod)%mod,ans2=(1ll*sum3*sum3%mod-sum4+mod)%mod;
                print(((ans1-ans2)%mod+mod)%mod);puts("");
            }
        }
    }
  • 相关阅读:
    django模板导入外部js和css等文件
    django 快速搭建blog
    JS定时器的使用--延时提示框
    JS定时器的使用--数码时钟
    JS定时器的使用--无缝滚动
    初探JavaScript魅力(五)
    初探JavaScript魅力(四)
    初探JavaScript魅力(三)
    初探JavaScript魅力(二)
    PHP正则表达式
  • 原文地址:https://www.cnblogs.com/firecrazy/p/11735069.html
Copyright © 2011-2022 走看看