标签:else time 题解 str tab ogr oid epo maximum
Input
Output
Sample Input
0 4 1 1 2 3 2 0 0 2 2 1 1 1 2 1 1 2 -1 2 1 1 2 3 3
Sample Output
3 4
题意:1的话就是把x,y的位置+v,2的话就是求(x1,y1)到(x2,y2)之间的和
题解:二维树状数组,求和时用sum(x2+2,y2+2)-sum(x1+1,y2+2)-sum(x2+2,y1+1)+sum(x1+1,y1+1)即可
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-9; const int N=1100+5,maxn=32000+5,inf=0x3f3f3f3f; int c[N][N]; void add(int x,int y,int v) { for(int i=x;i<N;i+=i&(-i)) for(int j=y;j<N;j+=j&(-j)) c[i][j]+=v; } ll sum(int x,int y) { ll ans=0; for(int i=x;i>0;i-=i&(-i)) for(int j=y;j>0;j-=j&(-j)) ans+=c[i][j]; return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); // cout<<setiosflags(ios::fixed)<<setprecision(2); int n,k,a; while(cin>>a>>n){ memset(c,0,sizeof c); while(cin>>a){ if(a==3)break; if(a==1) { int x,y,v; cin>>x>>y>>v; add(x+2,y+2,v); } else { int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; cout<<sum(x2+2,y2+2)-sum(x1+1,y2+2)-sum(x2+2,y1+1)+sum(x1+1,y1+1)<<endl; } } } return 0; }
标签:else time 题解 str tab ogr oid epo maximum
原文地址:http://www.cnblogs.com/acjiumeng/p/6801133.html