結果
問題 | No.60 魔法少女 |
ユーザー | yaoshimax |
提出日時 | 2015-02-22 20:26:04 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 830 ms / 5,000 ms |
コード長 | 3,304 bytes |
コンパイル時間 | 929 ms |
コンパイル使用メモリ | 96,896 KB |
実行使用メモリ | 35,072 KB |
最終ジャッジ日時 | 2024-06-23 21:52:57 |
合計ジャッジ時間 | 10,046 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 354 ms
34,816 KB |
testcase_01 | AC | 354 ms
34,944 KB |
testcase_02 | AC | 352 ms
34,816 KB |
testcase_03 | AC | 353 ms
34,944 KB |
testcase_04 | AC | 593 ms
35,072 KB |
testcase_05 | AC | 653 ms
34,944 KB |
testcase_06 | AC | 820 ms
34,944 KB |
testcase_07 | AC | 707 ms
34,944 KB |
testcase_08 | AC | 578 ms
34,944 KB |
testcase_09 | AC | 444 ms
34,944 KB |
testcase_10 | AC | 789 ms
34,944 KB |
testcase_11 | AC | 403 ms
34,816 KB |
testcase_12 | AC | 552 ms
34,944 KB |
testcase_13 | AC | 830 ms
35,072 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:107:9: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 107 | scanf("%d%d",&N,&K); | ~~~~~^~~~~~~~~~~~~~ main.cpp:111:12: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 111 | scanf("%d%d%d",&X,&Y,&H); | ~~~~~^~~~~~~~~~~~~~~~~~~ main.cpp:118:12: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 118 | scanf("%d%d%d%d%d",&X,&Y,&W,&H,&D); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <cstdio> #include <cstdlib> #include <cmath> #include <climits> #include <cfloat> #include <map> #include <utility> #include <set> #include <iostream> #include <memory> #include <string> #include <vector> #include <algorithm> #include <functional> #include <sstream> #include <complex> #include <stack> #include <queue> #include <cstring> using namespace std; class BIT2D{ /*binary indexed tree 2d*/ private: vector< vector<long long> > data; int xsize; int ysize; public: BIT2D(int n, int m ): data(n+1,vector<long long>((m+1),0)),xsize(n),ysize(m){ return; } long long getSum( int x1, int y1, int x2, int y2 ){ // return getSum ((x1,y1), (x2,y2)] ... means [(x1+1,y1+1),(x,y)] return getSum_(x2,y2)-getSum_(x1,y2)-getSum_(x2,y1)+getSum_(x1,y1); } long long getSum_(int x, int y){ // return getSum ((0,0), (x,y)] ... means [(1,1),(x,y)] long long ans = 0; for( int i = x ; 0 < i; i -=i&-i ){ for( int j = y; 0 < j; j -= j&-j ){ ans += data[i][j]; } } return ans; } void add(int x, int y, int v){ // add v to (x,y) for( int i = x ; i <= xsize; i += i&-i ){ for( int j = y ; j <= ysize; j+= j&-j ){ data[i][j] += v; } } return; } }; class BIT2DFILL{ /*2 dimensional binary indexed tree, with filling 2d field */ private: BIT2D bxy; BIT2D bx; BIT2D by; BIT2D bc; public: BIT2DFILL(int n,int m): bxy(n,m),bx(n,m),by(n,m),bc(n,m){ return; } long long getSum_( int x, int y ){ // return getSum of first l factors, ((0,0),(x,y)] //cout << bxy.getSum_(x,y) <<"*"<<x<<"*"<<y<<"+" <<bx.getSum_(x,y) <<"*"<<x<<"+" << by.getSum_(x,y) <<"*"<<y<< "+" << bc.getSum_(x,y)<<"="; return x*y*bxy.getSum_(x,y)+x*bx.getSum_(x,y)+y*by.getSum_(x,y)+bc.getSum_(x,y);; } long long getSum( int x1,int y1, int x2, int y2 ){ // return getSum of ((x1,y1),(x2,y2)] return getSum_(x2,y2)-getSum_(x1,y2)-getSum_(x2,y1)+getSum_(x1,y1); } void add( int x1,int y1, int x2, int y2, int v){ // add v in ((x1,y1),(x2,y2)] bxy.add(x1+1,y1+1,v); bxy.add(x1+1,y2+1,-v); bxy.add(x2+1,y1+1,-v); bxy.add(x2+1,y2+1,v); bx.add(x1+1,y1+1,-v*y1); bx.add(x1+1,y2+1,+v*y2); bx.add(x2+1,y1+1,+v*y1); bx.add(x2+1,y2+1,-v*y2); by.add(x1+1,y1+1,-v*x1); by.add(x1+1,y2+1,+v*x1); by.add(x2+1,y1+1,+v*x2); by.add(x2+1,y2+1,-v*x2); bc.add(x1+1,y1+1,v*x1*y1); bc.add(x1+1,y2+1,-v*x1*y2); bc.add(x2+1,y1+1,-v*x2*y1); bc.add(x2+1,y2+1,+v*x2*y2); } }; int main(){ int N,K; scanf("%d%d",&N,&K); BIT2DFILL b(1003,1003); for( int i = 0 ; i < N ; i++){ int X,Y,H; scanf("%d%d%d",&X,&Y,&H); X+=501; Y+=501; b.add( X-1,Y-1,X,Y,H); } for( int i = 0 ; i < K ; i++ ){ int X,Y,W,H,D; scanf("%d%d%d%d%d",&X,&Y,&W,&H,&D); X+=501; Y+=501; b.add(X-1,Y-1,X+W,Y+H,-D); } int ans=0; for( int i = 1; i <= 1002; i++ ){ for( int j = 1; j <= 1002; j++ ){ int p=b.getSum(i-1,j-1,i,j); if(p>0) ans+=p; } } printf("%d\n",ans); return 0; }