LOJ P10118 打鼹鼠 题解

每日一题 day17 打卡

Analysis

二维树状数组的单点修改和区间查询,和一维的差不多

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #define int long long
 7 #define maxn 4096+10
 8 #define INF 2147483647/2-1
 9 using namespace std;
10 inline int read()
11 {
12     int x=0;
13     bool f=1;
14     char c=getchar();
15     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
16     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
17     if(f) return x;
18     return 0-x;
19 }
20 inline void write(int x)
21 {
22     if(x<0){putchar('-');x=-x;}
23     if(x>9)write(x/10);
24     putchar(x%10+'0');
25 }
26 int n,m;
27 int tree[maxn][maxn];
28 inline int lowbit(int num)
29 {
30     return num&-num;
31 }
32 inline void build(int sx,int sy,int num)
33 {
34     for(int i=sx;i<=n;i+=lowbit(i))
35         for(int j=sy;j<=m;j+=lowbit(j))
36             tree[i][j]+=num;
37 }
38 inline int ask(int sx,int sy)
39 {
40     int ans=0;
41     for(int i=sx;i>=1;i-=lowbit(i))
42         for(int j=sy;j>=1;j-=lowbit(j))
43             ans+=tree[i][j];
44     return ans;
45 }
46 signed main()
47 {
48     n=read();m=read();
49     int in=0;
50     while(scanf("%d",&in)!=EOF)
51     {
52         if(in==1)
53         {
54             int x=read(),y=read(),k=read();
55             build(x,y,k);
56         }
57         if(in==2)
58         {
59             int a=read(),b=read(),c=read(),d=read();
60             write(ask(c,d)-ask(a-1,b-1));
61             printf("\n");
62         }
63     }
64     return 0;
65 }

请各位大佬斧正(反正我不认识斧正是什么意思)

 

posted @ 2019-09-18 19:48  handsome_zyc  阅读(236)  评论(0)    收藏  举报