답안 #98650

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
98650 2019-02-25T02:35:55 Z Tieuphong Relativnost (COCI15_relativnost) C++11
126 / 140
4000 ms 25180 KB
/***************************************************************************/
/**********************  LANG TU HAO HOA  **********************************/
/***************************************************************************/
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for (int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define sz(x) ((int) x.size())
#define PB push_back
#define PF push_front
#define MP make_pair
#define ll long long
#define F first
#define S second
#define maxc 1000000007
#define MOD 10007
#define base 107
#define eps 1e-6
#define pi acos(-1)
#define N 100005
#define C 22
#define task ""
#define remain(x) ((x > MOD) ? (x - MOD) : x)

using namespace std;

int n, c, a[N], b[N], q;

struct IT
{
    int t[N<<2][C], total[N<<2];

    void Upd(int l, int r, int id, int x)
    {
        if (l > x || r < x) return;
        if (l == r)
        {
            t[id][0] = b[x];
            t[id][1] = a[x];
            total[id] = (a[x]+b[x]) % MOD;
            return;
        }
        int mid = (l + r) >> 1;
        Upd(l, mid, id*2, x);
        Upd(mid+1, r, id*2+1, x);
        FOR(i, 0, c-1) t[id][i] = 0;
        FOR(i, 0, c-1)
            FOR(j, 0, c-1)
                if (i+j < c) t[id][i+j] = (1ll*t[id][i+j] + ((1ll*t[id*2][i] * t[id*2+1][j]) % MOD)) % MOD;
        total[id] = (1ll*total[id*2] * total[id*2+1]) % MOD;
    }

    int Get()
    {
        int res = total[1];
        FOR(i, 0, c-1)
             res = (1ll*res - t[1][i] + 1ll*MOD*MOD) % MOD;
        return res;
    }
} Tree;

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
    //freopen(task".inp", "r", stdin);
    //freopen(task".out", "w", stdout);
    cin >> n >> c;
    FOR(i, 1, n) cin >> a[i];
    FOR(i, 1, n) cin >> b[i];
    FOR(i, 1, n) Tree.Upd(1, n, 1, i);
    cin >> q;
    while (q--)
    {
        int pos, x, y;
        cin >> pos >> x >> y;
        a[pos] = x;
        b[pos] = y;
        Tree.Upd(1, n, 1, pos);
        cout << Tree.Get() << '\n';
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 640 KB Output is correct
2 Correct 16 ms 512 KB Output is correct
3 Correct 48 ms 512 KB Output is correct
4 Correct 558 ms 12904 KB Output is correct
5 Correct 2218 ms 25176 KB Output is correct
6 Correct 3674 ms 25136 KB Output is correct
7 Correct 1482 ms 13204 KB Output is correct
8 Correct 788 ms 24924 KB Output is correct
9 Correct 1146 ms 25180 KB Output is correct
10 Execution timed out 4067 ms 25048 KB Time limit exceeded