zoukankan      html  css  js  c++  java
  • BZOJ3155: Preprefix sum

    题解:

    写过树状数组搞区间修改和区间求和的就可以秒出吧。。。

    代码:

      1 #include<cstdio>
      2 
      3 #include<cstdlib>
      4 
      5 #include<cmath>
      6 
      7 #include<cstring>
      8 
      9 #include<algorithm>
     10 
     11 #include<iostream>
     12 
     13 #include<vector>
     14 
     15 #include<map>
     16 
     17 #include<set>
     18 
     19 #include<queue>
     20 
     21 #include<string>
     22 
     23 #define inf 1000000000
     24 
     25 #define maxn 200000+5
     26 
     27 #define maxm 20000000+5
     28 
     29 #define eps 1e-10
     30 
     31 #define ll long long
     32 
     33 #define pa pair<int,int>
     34 
     35 #define for0(i,n) for(int i=0;i<=(n);i++)
     36 
     37 #define for1(i,n) for(int i=1;i<=(n);i++)
     38 
     39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
     40 
     41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
     42 
     43 #define mod 1000000007
     44 
     45 using namespace std;
     46 
     47 inline int read()
     48 
     49 {
     50 
     51     int x=0,f=1;char ch=getchar();
     52 
     53     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     54 
     55     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
     56 
     57     return x*f;
     58 
     59 }
     60 int n,m;
     61 ll a[maxn],s[maxn][2];
     62 inline void add(int k,int x,ll y)
     63 {
     64     for(;x<=n;x+=x&(-x))s[x][k]+=y;
     65 }
     66 inline ll sum(int k,int x)
     67 {
     68     ll t=0;
     69     for(;x;x-=x&(-x))t+=s[x][k];
     70     return t;
     71 }
     72 
     73 int main()
     74 
     75 {
     76 
     77     freopen("input.txt","r",stdin);
     78 
     79     freopen("output.txt","w",stdout);
     80 
     81     n=read();m=read();
     82     for1(i,n){ll x=a[i]=read();add(0,i,x);add(1,i,i*x);}
     83     char ch[10];
     84     while(m--)
     85     {
     86         scanf("%s",ch);
     87         if(ch[0]=='M')
     88         {
     89             ll x=read(),y=read();
     90             add(0,x,y-a[x]);add(1,x,x*(y-a[x]));
     91             a[x]=y;
     92         }else 
     93         {
     94             ll x=read();
     95             printf("%lld
    ",(x+1)*sum(0,x)-sum(1,x));
     96         }
     97     }
     98 
     99     return 0;
    100 
    101 }  
    View Code

    题目:http://ch.ezoj.tk/contest/Katharon%20%EF%BC%831/Preprefix%20Sum

    感觉bz上的题面怎么不一样。。。233

  • 相关阅读:
    sipp如何避免dead call
    6174问题
    笨小熊
    scanf 与 cin 的区别
    谁获得了最高奖学金
    _int64、long long 的区别
    小光棍数
    简单排序法
    La=LaULb (循环链表)
    删除重复的数(顺序有序表)
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4173390.html
Copyright © 2011-2022 走看看