HDOJ 1892 HDU 1892 See you~ ACM 1892 IN HDU
2010-08-26 11:48
369 查看
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 代码See you~
Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 921 Accepted Submission(s): 291
Problem Description
Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algorithm and Programming, and I met so many good friends. I want to say sorry to Mr, Yin, I must leave now ~~>.<~~. I am very sorry, we could not advanced to the World Finals last year.
When coming into our training room, a lot of books are in my eyes. And every time the books are moving from one place to another one. Now give you the position of the books at the early of the day. And the moving information of the books the day, your work is to tell me how many books are stayed in some rectangles.
To make the problem easier, we divide the room into different grids and a book can only stayed in one grid. The length and the width of the room are less than 1000. I can move one book from one position to another position, take away one book from a position or bring in one book and put it on one position.
Input
In the first line of the input file there is an Integer T(1<=T<=10), which means the number of test cases in the input file. Then N test cases are followed.
For each test case, in the first line there is an Integer Q(1<Q<=100,000), means the queries of the case. Then followed by Q queries.
There are 4 kind of queries, sum, add, delete and move.
For example:
S x1 y1 x2 y2 means you should tell me the total books of the rectangle used (x1,y1)-(x2,y2) as the diagonal, including the two points.
A x1 y1 n1 means I put n1 books on the position (x1,y1)
D x1 y1 n1 means I move away n1 books on the position (x1,y1), if less than n1 books at that position, move away all of them.
M x1 y1 x2 y2 n1 means you move n1 books from (x1,y1) to (x2,y2), if less than n1 books at that position, move away all of them.
Make sure that at first, there is one book on every grid and 0<=x1,y1,x2,y2<=1000,1<=n1<=100.
Output
At the beginning of each case, output "Case X:" where X is the index of the test case, then followed by the "S" queries.
For each "S" query, just print out the total number of books in that area.
Sample Input
2
3
S 1 1 1 1
A 1 1 2
S 1 1 1 1
3
S 1 1 1 1
A 1 1 2
S 1 1 1 2
Sample Output
Case 1:
1
3
Case 2:
1
4
题目分析 : 一道二维树状数组 的裸题, 只是需要对坐标做些处理即可, 另外, 初始化的时候 原来 com[i][j] = lowbit (i) * lowbit (j);
WA 好多次, 直接用的modify(i,j,1)
好了, 直接代码吧, 代码过长, 内存多了一点点 , HDU 第二
/*
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋
http://www.cnblog.com/MiYu
Author By : MiYu
Test : 1
Program : 1892
*/
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define lowbit(x) (x&(-x))
int T,N;
const int MAX = 1001;
int mat[1002][1002];
int com[1002][1002];
void modify ( int x,int y, int n )
{
while ( x <= MAX ){
int t = y;
while ( t <= MAX ){
com[x][t] += n;
t += lowbit(t);
}
x += lowbit(x);
}
}
int quy ( int x, int y )
{
int sum = 0;
while ( x > 0 ){
int t = y;
while ( t > 0 ){
sum += com[x][t];
t -= lowbit(t);
}
x -= lowbit(x);
}
return sum;
}
inline bool scan_d(int &num)
{
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-'){ IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
if(IsN) num=-num;
return true;
}
int main ()
{
scan_d(T);{
int ca = 1;
while ( T -- ){
printf ( "Case %d:\n",ca++ );
scan_d(N); char s[5]; int a,b,x,y,m,res,maxx,maxy,minx,miny;
for ( int i = 1; i <= MAX; ++ i )
for ( int j = 1; j <= MAX; ++ j )
com[i][j] = lowbit(i) * lowbit(j), mat[i][j] = 1;
for ( int i = 1; i <= N; ++ i ){
scanf ( "%s",s );
switch ( s[0] ){
case 'S' : scan_d(a);scan_d(b);scan_d(x);scan_d(y); minx = min ( a,x );miny=min(b,y);maxx=max(a,x)+1;maxy=max(b,y)+1;
res = 0; res += quy( maxx,maxy ); res -= quy (maxx,miny); res -= quy(minx,maxy); res += quy(minx,miny);
printf ( "%d\n",res ); break;
case 'A' : scan_d(x);scan_d(y);scan_d(a);x++;y++; modify ( x,y,a ); mat[x][y] += a; break;
case 'D' : scan_d(x);scan_d(y);scan_d(a);x++;y++; if ( mat[x][y] >= a ) { modify ( x,y,-a ); mat[x][y] -= a; }
else { modify ( x,y,-mat[x][y] ); mat[x][y] = 0; } break;
case 'M' : scan_d(a);scan_d(b);scan_d(x);scan_d(y);scan_d(m);a++;b++;x++;y++; if ( mat[a][b] >= m )
{ mat[a][b] -= m; mat[x][y] += m; modify ( a,b,-m ); modify ( x,y,m ); }
else { modify ( a,b,-mat[a][b] ); modify ( x,y,mat[a][b] ); mat[x][y] += mat[a][b]; mat[a][b] = 0; } break;
}
}
}
}
return 0;
}
Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 921 Accepted Submission(s): 291
Problem Description
Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algorithm and Programming, and I met so many good friends. I want to say sorry to Mr, Yin, I must leave now ~~>.<~~. I am very sorry, we could not advanced to the World Finals last year.
When coming into our training room, a lot of books are in my eyes. And every time the books are moving from one place to another one. Now give you the position of the books at the early of the day. And the moving information of the books the day, your work is to tell me how many books are stayed in some rectangles.
To make the problem easier, we divide the room into different grids and a book can only stayed in one grid. The length and the width of the room are less than 1000. I can move one book from one position to another position, take away one book from a position or bring in one book and put it on one position.
Input
In the first line of the input file there is an Integer T(1<=T<=10), which means the number of test cases in the input file. Then N test cases are followed.
For each test case, in the first line there is an Integer Q(1<Q<=100,000), means the queries of the case. Then followed by Q queries.
There are 4 kind of queries, sum, add, delete and move.
For example:
S x1 y1 x2 y2 means you should tell me the total books of the rectangle used (x1,y1)-(x2,y2) as the diagonal, including the two points.
A x1 y1 n1 means I put n1 books on the position (x1,y1)
D x1 y1 n1 means I move away n1 books on the position (x1,y1), if less than n1 books at that position, move away all of them.
M x1 y1 x2 y2 n1 means you move n1 books from (x1,y1) to (x2,y2), if less than n1 books at that position, move away all of them.
Make sure that at first, there is one book on every grid and 0<=x1,y1,x2,y2<=1000,1<=n1<=100.
Output
At the beginning of each case, output "Case X:" where X is the index of the test case, then followed by the "S" queries.
For each "S" query, just print out the total number of books in that area.
Sample Input
2
3
S 1 1 1 1
A 1 1 2
S 1 1 1 1
3
S 1 1 1 1
A 1 1 2
S 1 1 1 2
Sample Output
Case 1:
1
3
Case 2:
1
4
题目分析 : 一道二维树状数组 的裸题, 只是需要对坐标做些处理即可, 另外, 初始化的时候 原来 com[i][j] = lowbit (i) * lowbit (j);
WA 好多次, 直接用的modify(i,j,1)
好了, 直接代码吧, 代码过长, 内存多了一点点 , HDU 第二
2 | HUT-MiYu | 156MS | 8044K | 3172B | C++ |
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋
http://www.cnblog.com/MiYu
Author By : MiYu
Test : 1
Program : 1892
*/
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define lowbit(x) (x&(-x))
int T,N;
const int MAX = 1001;
int mat[1002][1002];
int com[1002][1002];
void modify ( int x,int y, int n )
{
while ( x <= MAX ){
int t = y;
while ( t <= MAX ){
com[x][t] += n;
t += lowbit(t);
}
x += lowbit(x);
}
}
int quy ( int x, int y )
{
int sum = 0;
while ( x > 0 ){
int t = y;
while ( t > 0 ){
sum += com[x][t];
t -= lowbit(t);
}
x -= lowbit(x);
}
return sum;
}
inline bool scan_d(int &num)
{
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-'){ IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
if(IsN) num=-num;
return true;
}
int main ()
{
scan_d(T);{
int ca = 1;
while ( T -- ){
printf ( "Case %d:\n",ca++ );
scan_d(N); char s[5]; int a,b,x,y,m,res,maxx,maxy,minx,miny;
for ( int i = 1; i <= MAX; ++ i )
for ( int j = 1; j <= MAX; ++ j )
com[i][j] = lowbit(i) * lowbit(j), mat[i][j] = 1;
for ( int i = 1; i <= N; ++ i ){
scanf ( "%s",s );
switch ( s[0] ){
case 'S' : scan_d(a);scan_d(b);scan_d(x);scan_d(y); minx = min ( a,x );miny=min(b,y);maxx=max(a,x)+1;maxy=max(b,y)+1;
res = 0; res += quy( maxx,maxy ); res -= quy (maxx,miny); res -= quy(minx,maxy); res += quy(minx,miny);
printf ( "%d\n",res ); break;
case 'A' : scan_d(x);scan_d(y);scan_d(a);x++;y++; modify ( x,y,a ); mat[x][y] += a; break;
case 'D' : scan_d(x);scan_d(y);scan_d(a);x++;y++; if ( mat[x][y] >= a ) { modify ( x,y,-a ); mat[x][y] -= a; }
else { modify ( x,y,-mat[x][y] ); mat[x][y] = 0; } break;
case 'M' : scan_d(a);scan_d(b);scan_d(x);scan_d(y);scan_d(m);a++;b++;x++;y++; if ( mat[a][b] >= m )
{ mat[a][b] -= m; mat[x][y] += m; modify ( a,b,-m ); modify ( x,y,m ); }
else { modify ( a,b,-mat[a][b] ); modify ( x,y,mat[a][b] ); mat[x][y] += mat[a][b]; mat[a][b] = 0; } break;
}
}
}
}
return 0;
}
相关文章推荐
- HDOJ HDU 2068 RPG的错排 ACM 2068 IN HDU
- HDOJ HDU 1133 Buy the Ticket ACM 1133 IN HDU
- HDU 1698 HDOJ 1698 Just a Hook ACM 1698 IN HDU
- HDOJ HDU 1171 Big Event ACM 1171 IN HDU
- HDOJ HDU 2086 A1 = ? ACM 2086 IN HDU
- HDOJ HDU 1202 The calculation of GPA ACM 202 IN HDU
- HDOJ HDU 1272 小希的迷宫 ACM 1272 IN HDU
- HDOJ 1286 HDU 1286 找新朋友 ACM 1286 IN HDU
- HDOJ 2227 HDU 2227 Find the nondecreasing subsequences ACM 2227 IN HDU
- HDOJ HDU 1856 More is better ACM 1856 IN HDU
- HDOJ 2544 HDU 2544 最短路 ACM 2544 IN HDU
- HDU 2689 HDOJ 2689 Sort it ACM 2689 IN HDU
- HDOJ HDU 1028 Ignatius and the Princess III ACM 1028 IN HDU
- HDOJ 1213 HDU 1213 How Many Tables ACM 1213 IN HDU
- HDOJ 2066 HDU 2066 一个人的旅行 ACM 2066 IN HDU
- HDOJ 1247 HDU 1247 Hat’s Words ACM 1247 IN HDU
- HDU 1512 HDOJ 1512 Monkey King ( 左偏树 ) ACM 1512 IN HDU
- HDOJ HDU 1008 Elevator ACM 1008 IN HDU
- HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU
- HDOJ 1166 HDU 1166 敌兵布阵 ACM 1166 IN HDU