답안 #61925

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
61925 2018-07-27T05:32:46 Z Benq Nuclearia (CEOI15_nuclearia) C++11
0 / 100
1000 ms 890328 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001;

int W,H,N;

ll** create(int x, int y) {
    ll **a = new ll*[x+1];
    F0R(i,x+1) {
        a[i] = new ll[y+1];
        F0R(j,y+1) a[i][j] = 0;
    }
    return a;
}

struct cum {
    ll **tri[2][2];
    ll **rect;
    
    void init() {
        F0R(i,2) F0R(j,2) tri[i][j] = create(W,H);
        rect = create(W,H);
    }
    
    void updRect(int x0, int x1, int y0, int y1, ll val) {
        x0 = max(x0,1), x1 = min(x1,W), y0 = max(y0,1), y1 = min(y1,H);
        if (x0 > x1 || y0 > y1) return;
        rect[x0][y0] += val;
        if (x1 < W) rect[x1+1][y0] -= val;
        if (y1 < H) rect[x0][y1+1] -= val;
        if (x1 < W && y1 < H) rect[x1+1][y1+1] += val;
    }
    
    void upRight(int x, int y, int sz, ll val) {
        updRect(x,x+(y+sz-H-1),1,H,val);
        if (y+sz <= H) tri[0][0][x][y+sz] += val;
        else if (x+(y+sz-H) <= W) tri[0][0][x+(y+sz-H)][H] += val;
        if (x+sz+1 <= W) tri[0][0][x+sz+1][y-1] -= val;
        updRect(x,x+sz,1,y-1,-val);
    }
    
    void upLeft(int x, int y, int sz, ll val) {
        updRect(x-((y+sz)-H-1),x,1,H,val);
        if (y+sz <= H) tri[0][1][x][y+sz] += val;
        else if (x-(y+sz-H) >= 1) tri[0][1][x-(y+sz-H)][H] += val;
        if (x-sz-1 >= 1) tri[0][1][x-sz-1][y-1] -= val;
        updRect(x-sz,x,1,y-1,-val);
    }
    
    void downLeft(int x, int y, int sz, ll val) {
        updRect(x-(1-(y-sz)-1),x,1,H,val); // ??
        if (y-sz >= 1) tri[1][1][x][y-sz] += val;
        else if (x-(1-(y-sz)) >= 1) tri[1][1][x-(1-(y-sz))][1] += val;
        if (x-sz-1 >= 1 && y < H) tri[1][1][x-sz-1][y+1] -= val;
        updRect(x-sz,x,y+1,H,-val);
    }
    
    void downRight(int x, int y, int sz, ll val) {
        // cout << "AH " << x << " " << (x+(1-(y-sz)-1)) << "\n";
        updRect(x,x+(1-(y-sz)-1),1,H,val); // ??
        // tri[1][0][1][1] ++;
        if (y-sz >= 1) tri[1][0][x][y-sz] += val;
        else if (x+(1-(y-sz)) <= W) tri[1][0][x+(1-(y-sz))][1] += val;
        if (x+sz+1 <= W && y < H) tri[1][0][x+sz+1][y+1] -= val;
        updRect(x,x+sz,y+1,H,-val);
    }
    
    void prop() {
        FOR(i,1,W+1) FOR(j,1,H+1) {
            updRect(i,i,1,j,tri[0][0][i][j]);
            if (i != W) tri[0][0][i+1][j-1] += tri[0][0][i][j];
        }
        FORd(i,1,W+1) FOR(j,1,H+1) {
            updRect(i,i,1,j,tri[0][1][i][j]);
            tri[0][1][i-1][j-1] += tri[0][1][i][j];
        }
        FORd(i,1,W+1) FOR(j,1,H+1) {
            updRect(i,i,j,H,tri[1][1][i][j]);
            if (j != H) tri[1][1][i-1][j+1] += tri[1][1][i][j];
        }
        FOR(i,1,W+1) FOR(j,1,H+1) {
            updRect(i,i,j,H,tri[1][0][i][j]);
            if (i != W && j != H) tri[1][0][i+1][j+1] += tri[1][0][i][j];
        }
        FOR(i,1,W+1) FOR(j,1,H+1) rect[i][j] += rect[i-1][j]+rect[i][j-1]-rect[i-1][j-1];
    }
};

cum c, cx, cy;
ll **res;

void gen() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> W >> H >> N;
    c.init(), cx.init(), cy.init();
    res = create(W,H);
    F0R(i,N) {
        int x,y,a,b; cin >> x >> y >> a >> b;
        res[x][y] += a;
        int sz = a/b-1;
        if (sz >= 0) {
            c.upLeft(x+sz+1,y+1,sz,a+(ll)b*x); cx.upLeft(x+sz+1,y+1,sz,-b);
            c.upLeft(x,y-sz-1,sz,a-(ll)b*y); cy.upLeft(x,y-sz-1,sz,b);
            c.downRight(x,y+sz+1,sz,a+(ll)b*y); cy.downRight(x,y+sz+1,sz,-b);
            c.downRight(x-sz-1,y-1,sz,a-(ll)b*x); cx.downRight(x-sz-1,y-1,sz,b);
            c.upRight(x-sz-1,y,sz,a-(ll)b*x); cx.upRight(x-sz-1,y,sz,b);
            c.upRight(x+1,y-sz-1,sz,a-(ll)b*y); cy.upRight(x+1,y-sz-1,sz,b);
            c.downLeft(x+sz+1,y,sz,a+(ll)b*x); cx.downLeft(x+sz+1,y,sz,-b);
            c.downLeft(x-1,y+sz+1,sz,a+(ll)b*y); cy.downLeft(x-1,y+sz+1,sz,-b);
        }
    }
    c.prop(), cx.prop(), cy.prop();
    FOR(i,1,W+1) {
        FOR(j,1,H+1) {
            res[i][j] += c.rect[i][j]+cx.rect[i][j]*i+cy.rect[i][j]*j;
            // cout << res[i][j] << "\t";
            res[i][j] += res[i-1][j]+res[i][j-1]-res[i-1][j-1];
        }
        //cout << "\n";
    }
    //exit(0);
}

int main() {
    gen();
    int Q; cin >> Q;
    F0R(i,Q) {
        int x1,y1,x2,y2; cin >> x1 >> y1 >> x2 >> y2;
        cout << (ll)round(((ld)res[x2][y2]-res[x1-1][y2]-res[x2][y1-1]+res[x1-1][y1-1])/(x2-x1+1)/(y2-y1+1)) << "\n";
    }
}

/* Look for:
* the exact constraints (multiple sets are too slow for n=10^6 :( ) 
* special cases (n=1?)
* overflow (ll vs int?)
* array bounds
*/
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1104 ms 466160 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1115 ms 591340 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 809 ms 630972 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 798 ms 660876 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1139 ms 790716 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1134 ms 840576 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 813 ms 840576 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 868 ms 840576 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1103 ms 854432 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1119 ms 890328 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Runtime error 867 ms 890328 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1083 ms 890328 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 848 ms 890328 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 838 ms 890328 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -