標籤:矩陣 char upd etc 答案 nbsp cell 簡單 應該
1532. [IOI2001]行動電話
★☆ 輸入檔案:mobilephones.in 輸出檔案:mobilephones.out 簡單對比
時間限制:5 s 記憶體限制:256 MB
【題目描述】
假設Tampere地區的4G移動通訊基站以如下方式運行。整個地區被劃分成若干正方形格子。這些格子構成一個S*S的矩陣,它們的行,列編號都是從0到S-1.每一個格子中都有一個基站。每個格子中啟用的手機數量可能改變,因為一部手機可能從一個格子移動到另一個格子,開啟或者關閉。有時,某一座基站會向總站報告自己的行列座標,以及該格中啟用手機數目的變化。
【輸入格式】
輸入指令編碼如下。
每個指令佔一行,包含一個指令碼和一些參數,見下表。
| 指令碼 |
參數 |
意義 |
| 0 |
S |
初始化一個S*S的全零矩陣。這個指令只會出現一次,即第一條指令。 |
| 1 |
X Y A |
將格子(X,Y)中啟用的手機數量增加A。A有可能是正數或負數。 |
| 2 |
L B R T |
詢問當前所有座標(X,Y)滿足:L<=X<=R,B<=Y<=T的格子中啟用的手機數量之和。 |
| 3 |
|
結束程式。這個指令只會出現一次,即最後一條指令。 |
【輸出格式】
你的程式不應該對指令2外的所有指令進行回答。對於每個指令2,你的程式需要輸出一行一個正整數,即該指令的答案。
【範例輸入】
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
【範例
3
4
【提示】
矩陣大小:1<=S<=1024
任意時刻,每個格子中的啟用手機數量V:0<=V<=32767
格子中啟用手機數量的變化值:-32768<=A<=32767
輸入的指令數目:3<=U<=60002
整個矩陣中的最大手機數量:M=2^30
【來源】
IOI 2001
二維BIT維護區間和
#include<cstdio>const int N=3005;int opt,n,c[N][N];int read(){ int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f;}int lowbit(int x){ return x&-x;}void updata(int x,int y,int val){ for(int i=x;i<=n;i+=lowbit(i)){ for(int j=y;j<=n;j+=lowbit(j)){ c[i][j]+=val; } }}int query(int x,int y){ int res=0; for(int i=x;i>=1;i-=lowbit(i)){ for(int j=y;j>=1;j-=lowbit(j)){ res+=c[i][j]; } } return res;}int main(){ freopen("mobilephones.in","r",stdin); freopen("mobilephones.out","w",stdout); opt=read();n=read(); for(int x1,x2,y1,y2,val;(opt=read())!=3;){ if(opt==1){ x1=read();y1=read();val=read();x1++;y1++; updata(x1,y1,val); } else{ x1=read();y1=read();x1++;y1++; x2=read();y2=read();x2++;y2++; printf("%d\n",query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1)); } } return 0;}
COGS1532. [IOI2001]行動電話