首页 > 其他分享 >POJ 3468(树状数组+区间修改)

POJ 3468(树状数组+区间修改)

时间:2023-02-03 10:32:31浏览次数:48  
标签:树状 ll 3468 add POJ c2 c1 include lld


题目描述

给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:

1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。

2、“Q l r”,表示询问 数列中第 l~r 个数的和。

对于每个询问,输出一个整数表示答案。

输入格式

第一行两个整数N,M。

第二行N个整数A[i]。

接下来M行表示M条指令,每条指令的格式如题目描述所示。

输出格式

对于每个询问,输出一个整数表示答案。

每个答案占一行。

数据范围

1≤N,M≤10^5,
|d|≤10000|,
|A[i]|≤1000000000|

样例

输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 输出样例: 4 55 9 15


AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;
#define lowbit(x) x&(-x)
const int N=2e5+10;
ll c1[N],c2[N],n,m,a[N];
ll add(ll x,ll y)
{
for(ll i=x;i<=n;i+=lowbit(i))
{
c1[i]+=y;
c2[i]+=x*y;
}
}
ll ask(ll x)
{
ll ans=0;
for(ll i=x;i;i-=lowbit(i))
ans+=(x+1) *c1[i]-c2[i];
return ans;
}
int main()
{
scanf("%lld %lld\n",&n,&m);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
add(i,a[i]);
add(i+1,-a[i]);
}
getchar();
while(m--)
{
char ch=getchar();
if (ch=='Q')
{
ll x,y;
scanf("%lld %lld\n",&x,&y);
cout<<ask(y)-ask(x-1)<<endl;
}
if (ch=='C')
{
ll x,y,d;
scanf("%lld %lld %lld\n",&x,&y,&d);
add(x,d);
add(y+1,-d);
}
}
return 0;
}

另一种写法:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;
#define lowbit(x) x&(-x)
const int N=2e5+10;
ll c1[N],c2[N],n,m,q,i,a[N];
ll sum[N];


void add(ll x,ll d,ll *c)
{
for(;x<=n;x+=lowbit(x))
{
c[x]+=d;
}
}

ll ask(ll x,ll *c)
{
ll sum=0;
for(;x>0;x-=lowbit(x))
{
sum+=c[x];
}
return sum;
}

int main()
{
char op[3];
ll x,y,d;
scanf("%lld %lld",&n,&q);
memset(c1,0,sizeof c1);
memset(c2,0,sizeof c2);
for(i=1; i<=n; ++i)
{
scanf("%lld",sum+i);
sum[i]+=sum[i-1];
}
while(q--)
{
scanf("%s",op);
if(op[0] == 'C')
{
scanf("%lld%lld%lld",&x,&y,&d);
add(x,d,c1);
add(y+1,-d,c1);
add(x,x*d,c2);
add(y+1,-(y+1)*d,c2);
}
else
{
scanf("%lld %lld",&x,&y);
printf("%lld\n",sum[y]-sum[x-1]+ask(y,c1)*(y+1)-ask(x-1,c1)*x-ask(y,c2)+ask(x-1,c2));
}
}
return 0;
}

 


 

标签:树状,ll,3468,add,POJ,c2,c1,include,lld
From: https://blog.51cto.com/u_15952369/6035456

相关文章

  • SPOJ375--Query on a tree(树链剖分)
    Description:Youaregivenatree(anacyclicundirectedconnectedgraph)with N nodes,andedgesnumbered1,2,3...N-1.Wewillaskyoutoperfromsomeins......
  • POJ3468 A Simple Problem with Integers(SplayTree做法)
    DescriptionYouhave N integers, A1, A2,..., AN.Youneedtodealwithtwokindsofoperations.Onetypeofoperationistoaddsomegivennumbertoea......
  • POJ2761 Feed the dogs(Treap)
    DescriptionWindlovesprettydogsverymuch,andshehasnpetdogs.SoJiajiahastofeedthedogseverydayforWind.JiajialovesWind,butnotthedogs,......
  • Java里什么是POJO
    POJO(PlainOrdinaryJavaObject)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。POJO和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Pl......
  • POJ-1328-Radar Installation
    RadarInstallationTimeLimit:2000/1000ms(Java/Other)   MemoryLimit:20000/10000K(Java/Other)TotalSubmission(s):47   AcceptedSubmission(s):25......
  • POJ-2406-Power Strings
    PowerStringsTimeLimit:6000/3000ms(Java/Other)   MemoryLimit:131072/65536K(Java/Other)TotalSubmission(s):96   AcceptedSubmission(s):34Probl......
  • poj-1458-Common Subsequence
    CommonSubsequenceTimeLimit:1000MSMemoryLimit:10000KTotalSubmissions:43207Accepted:17522DescriptionAsubsequenceofagivensequenceisthegivenseq......
  • poj 3984 迷宫问题(BFS+输出路径)
    迷宫问题TimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 11323 Accepted: 6776Description定义一个二维数组: intmaze[5][5]={ 0,1,......
  • POJ-2752-Seek the Name, Seek the Fame
    SeektheName,SeektheFameTimeLimit:4000/2000ms(Java/Other)   MemoryLimit:131072/65536K(Java/Other)TotalSubmission(s):43   AcceptedSubmis......
  • DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势
    一、引言DO、DTO、BO、AO、VO、POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。通过各层POJO的使用,有助于提高代码的可读性和可维护性。----------......