1. 程式人生 > >See you~ HDU1892

See you~ HDU1892

關系 print 樹狀數組 aps name \n nbsp closed gif

一開始還離散化弄了好久 離散化細節弄得好差

這題用二維樹狀數組做很快 因為樹狀數組下標不為0 所以所有下標要加一處理

還有就是算矩陣的時候要處理兩個坐標的大小關系

個人感覺樹狀數組用for語句寫更加簡潔

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
int c[1010][1010];
int n;
int lowbit(int i)
{
    return i&-i;
}
void update(int x,int y,int v)
{
    for(int i=x;i<n;i+=lowbit(i))
        
for(int j=y;j<n;j+=lowbit(j)) c[i][j]+=v; } long long sum(int x,int y) { long long ans=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) ans+=c[i][j]; return ans; } int main() { int cas; scanf("%d",&cas); n=1005; for(int i=1
;i<=cas;i++) { printf("Case %d:\n",i); memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) update(i,j,1); int q; scanf("%d",&q); char s[10]; int x1,x2,y1,y2,n1; while(q--) { scanf(
"%s",s); if(s[0]==A) { scanf("%d%d%d",&x1,&y1,&n1); update(x1+1,y1+1,n1); } else if(s[0]==D) { scanf("%d%d%d",&x1,&y1,&n1); x1++;y1++; int w=sum(x1,y1)-sum(x1,y1-1)-sum(x1-1,y1)+sum(x1-1,y1-1); if(w-n1>=0) update(x1,y1,-n1); else update(x1,y1,-w); } else if (s[0]==S) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1++;y1++;x2++;y2++; if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2); printf("%d\n", sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1) ); } else if(s[0]==M) { scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1); x1++;y1++;x2++;y2++; int w=sum(x1,y1)-sum(x1,y1-1)-sum(x1-1,y1)+sum(x1-1,y1-1); if(w>=n1){ update(x1,y1,-n1);update(x2,y2,n1); } else {update(x1,y1,-w);update(x2,y2,w);} } } } return 0; }
View Code

See you~ HDU1892