BZOJ 3155 Preprefix sum

两个BIT。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100050
using namespace std;
long long n,m,x,y,t[maxn][3],a[maxn];
char s[12];
long long lowbit(long long x) {return (x&(-x));}
void modify(long long x,long long val,long long type)
{
    for (long long i=x;i<=n;i+=lowbit(i))
        t[i][type]+=val;
}
long long ask(long long x,long long type)
{
    long long ret=0;
    for (long long i=x;i>=1;i-=lowbit(i))
        ret+=t[i][type];
    return ret;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for (long long i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        modify(i,a[i],1);modify(i,i*a[i],2);
    }
    for (long long i=1;i<=m;i++)
    {
        scanf("%s",s);
        if (s[0]==‘M‘)
        {
            scanf("%lld%lld",&x,&y);
            modify(x,y-a[x],1);modify(x,x*(y-a[x]),2);
            a[x]=y;
        }
        else
        {
            scanf("%lld",&x);
            printf("%lld\n",(x+1)*ask(x,1)-ask(x,2));
        }
    }
    return 0;
}
时间: 2024-08-06 14:06:43

BZOJ 3155 Preprefix sum的相关文章

3155: Preprefix sum

3155: Preprefix sum https://www.lydsy.com/JudgeOnline/problem.php?id=3155 分析: 区间修改,区间查询,线段树就好了. 然后,这题有树状数组! 代码: 线段树620ms 1 /* 2 一个数修改影响后面的数,使后面的数都增加或者减少多少,所以线段树维护区间和,区间修改 3 */ 4 #include<bits/stdc++.h> 5 using namespace std; 6 typedef long long LL;

[bzoj3155]Preprefix sum(树状数组)

3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 1183  Solved: 546[Submit][Status][Discuss] Description Input 第一行给出两个整数N,M.分别表示序列长度和操作个数 接下来一行有N个数,即给定的序列a1,a2,....an 接下来M行,每行对应一个操作,格式见题目描述 Output 对于每个询问操作,输出一行,表示所询问的SSi的值. Sample In

差分+树状数组【p4868】Preprefix sum

Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前缀和第i个是\(SS_i\) 给一个长度n的序列\(a_1, a_2, \cdots, a_n\)有两种操作: Modify i x:把\(a_i\)改成\(x\): Query i:查询\(SS_i\) Input 第一行给出两个整数N,M.分别表示序列长度和操作个数 接下来一行有N个数,即给定的

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&g

BZOJ3155Preprefix sum

3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 1288  Solved: 588 Description Input 第一行给出两个整数N,M.分别表示序列长度和操作个数 接下来一行有N个数,即给定的序列a1,a2,....an 接下来M行,每行对应一个操作,格式见题目描述 Output 对于每个询问操作,输出一行,表示所询问的SSi的值. Sample Input 5 3 1 2 3 4 5 Query 5

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

树状数组(下)

树状数组(下) 目录 树状数组(下) 应用 逆序对 康托展开 逆康托展开 RMQ问题树状数组解法 查询第k小 习题 Preprefix sum 在树状数组(上)中我提到了树状数组的基本操作与变式,现在来看看它的实际应用和一些题目. 应用 逆序对 设\(a\)为一个有\(n\)个数字的有序集(\(n>1\)),其中所有数字各不相同. 如果存在正整数\(i\),\(j\)使得\(1\leqslant i<j\leqslant n\)且\(a[i]>a[j]\), 则有序对\((a[i],a[

●杜教筛入门(BZOJ 3944 Sum)

入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\frac{3}{4}})$的复杂度内解决求某些数论函数f(n)(或f的前缀和S(n)$)的值. 先来看看原理是什么.(接下来推导如何求数论函数f(n)的前缀和S(n)) 现在有两个数论函数$f( )和g( )$ (同时定义f的前缀和函数$S(n)=\sum_{i=1}^{n}f(i)$) 有狄利克雷乘

BZOJ.3944.Sum(杜教筛)

题目链接 又写个模板题用了半晚上.. 卡常写法 还非常短.. //35332 kb 7608 ms //跟Kelin dalao学一波卡常.怎么还是很慢QAQ //phi[]要longlong! #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; const int N=2e6; int cnt,Max,P[N>>3]; LL phi[N],mu[N]