提出 #44138124
ソースコード 拡げる
// clang-format off
#include <bits/stdc++.h>
using namespace std;
#if __has_include(<atcoder/all>)
#include <atcoder/all>
using namespace atcoder;
#endif
#define _overload3(_1,_2,_3,name,...) name
#define _REP(i,n) REPI(i,0,n)
#define REPI(i,a,b) for(int i=int(a);i<int(b);++i)
#define REP(...) _overload3(__VA_ARGS__,REPI,_REP,)(__VA_ARGS__)
#define _RREP(i,n) RREPI(i,n,0)
#define RREPI(i,a,b) for(int i=int(a);i>=int(b);--i)
#define RREP(...) _overload3(__VA_ARGS__,RREPI,_RREP,)(__VA_ARGS__)
#define ALL(a) (a).begin(),(a).end()
#define ALLR(a) (a).rbegin(),(a).rend()
typedef long long ll;
const int INF32 = 1001001001;
const long long INF64 = 1001001001001001001;
struct Init { Init() { ios::sync_with_stdio(0); cin.tie(0); cout << setprecision(15); }} init;
template<class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template<class T> bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; }
template<class T> T gcd(T x, T y){ return (x % y) ? gcd(y, x % y) : y; }
template<class T> T lcm(T x, T y){ return x / gcd(x, y) * y; }
template<class T, class... Ts> void output(const T& a, const Ts&... b) { cout << a; (cout << ... << (cout << ' ', b)); cout << '\n'; }
template<class T> void output(vector<T> v) { for (auto u : v) cout << u << ' '; cout << '\n'; };
void yesno(bool is_ok) { cout << (is_ok ? "yes" : "no") << '\n'; }
void YesNo(bool is_ok) { cout << (is_ok ? "Yes" : "No") << '\n'; }
void YESNO(bool is_ok) { cout << (is_ok ? "YES" : "NO") << '\n'; }
// clang-format on
template <class T> struct CumulativeSum2d {
public:
CumulativeSum2d(int h, int w)
: h(h), w(w), data(h + 1, vector<T>(w + 1, 0)){};
CumulativeSum2d(const vector<vector<T>> &v)
: h((int)v.size()), w((int)v[0].size()) {
data.resize(h + 1);
data[0].resize(w + 1, 0);
for (int i = 0; i < h; ++i) {
data[i + 1].resize(w + 1, 0);
for (int j = 0; j < w; ++j) {
data[i + 1][j + 1] = v[i][j];
}
}
};
void add(int i, int j, T x) {
assert(0 <= i && i < h);
assert(0 <= j && j < w);
data[i + 1][j + 1] += x;
}
void build() {
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
data[i + 1][j + 1] +=
data[i + 1][j] + data[i][j + 1] - data[i][j];
}
}
}
// [si, gi), [sj, gj)
T sum(int si, int sj, int gi, int gj) {
assert(0 <= si && si <= gi && gi <= h);
assert(0 <= sj && sj <= gj && gj <= w);
return data[gi][gj] - data[si][gj] - data[gi][sj] + data[si][sj];
}
private:
int h, w;
vector<vector<T>> data;
};
int main() {
int n;
cin >> n;
CumulativeSum2d<int> cs(1505, 1505);
REP(i, n) {
int x, y;
cin >> x >> y;
--x, --y;
cs.add(x, y, 1);
}
cs.build();
int q;
cin >> q;
vector<int> ans(q);
REP(i, q) {
int a, b, c, d;
cin >> a >> b >> c >> d;
--a, --b;
ans[i] = cs.sum(a, b, c, d);
}
output(ans);
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
1000 / 1000 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample01.txt |
| All |
max00.txt, random00.txt, random01.txt, random02.txt, random03.txt, random04.txt, sample01.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| max00.txt |
AC |
81 ms |
13004 KiB |
| random00.txt |
AC |
52 ms |
12524 KiB |
| random01.txt |
AC |
51 ms |
12632 KiB |
| random02.txt |
AC |
41 ms |
12668 KiB |
| random03.txt |
AC |
52 ms |
12740 KiB |
| random04.txt |
AC |
57 ms |
12956 KiB |
| sample01.txt |
AC |
13 ms |
12208 KiB |