题意:给出n个数字,操作有修改(S)和输出区间和(M)。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <stack> #include <map> #include <algorithm> #include <set> using namespace std; typedef long long ll; typedef unsigned long long Ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int inf = 0x3f3f3f3f; const double pi=acos(-1); const int maxn=200000+5; int data[maxn],n,cnt=0; char a[5]; int lowbit(int i) { return i&(-i); } int sum(int i) { int ret=0; while(i>0) { ret+=data[i]; i-=lowbit(i); } return ret; } void update(int i,int j) { while(i<=n) { data[i]+=j; i+=lowbit(i); } } int main() { while(~scanf("%d",&n)&&n) { MM(data,0); for(int i=1;i<=n;i++) { int u; scanf("%d",&u); update(i,u); } if(cnt>=1) printf("\n"); printf("Case %d:\n",++cnt); while(~scanf("%s",a)) { if(a[0]==‘E‘) break; if(a[0]==‘M‘) { int l,r; scanf("%d %d",&l,&r); printf("%d\n",sum(r)-sum(l-1)); } else { int i,j; scanf("%d %d",&i,&j); int k=sum(i)-sum(i-1); update(i,j-k); } } } return 0; }
分析:BIT模版题,,就是单点更新要转换成区间更新(因为BIT的每个节点都是对应区间,而不是单独
一个节点),输入输出格式本来弄错了,,题目说的是在两个case之间输出一个空格
时间: 2024-12-28 08:01:00