QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#779532#7787. Maximum RatingLxReyWA 2ms9636kbC++173.5kb2024-11-24 19:39:422024-11-24 19:39:42

Judging History

你现在查看的是最新测评结果

  • [2024-11-24 19:39:42]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:9636kb
  • [2024-11-24 19:39:42]
  • 提交

answer

#include "bits/stdc++.h"

using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
#define endl "\n"

const int N = 4e5 + 10;
const ll INF = 0x3f3f3f3f3f3f3f;

ll n, m;
ll q;
vector<ll> a(N), tmp(N);
map<ll, ll> mp;
struct node
{
    int l, r;
    ll cnt;
    ll sum;
} t[N << 2];
#define lu u << 1
#define ru u << 1 | 1

void build(int u, int l, int r)
{
    t[u] = {l, r, 0, 0};
    if (l == r)
        return;
    int mid = (l + r) >> 1;
    build(lu, l, mid);
    build(ru, mid + 1, r);
}

void upd(int u, int pos, ll val)
{
    if (t[u].l == t[u].r)
    {
        t[u].cnt++;
        t[u].sum += val;
        return;
    }
    int mid = (t[u].l + t[u].r) >> 1;
    if (pos <= mid)
        upd(lu, pos, val);
    else
        upd(ru, pos, val);
    t[u].cnt = t[lu].cnt + t[ru].cnt;
    t[u].sum = t[lu].sum + t[ru].sum;
}

void del(int u, int pos, ll val)
{
    if (t[u].l == t[u].r)
    {
        t[u].cnt--;
        t[u].sum -= val;
        return;
    }
    int mid = (t[u].l + t[u].r) >> 1;
    if (pos <= mid)
        del(lu, pos, val);
    else
        del(ru, pos, val);
    t[u].cnt = t[lu].cnt + t[ru].cnt;
    t[u].sum = t[lu].sum + t[ru].sum;
}

int bs(int u, ll tar)
{
    if (t[u].sum <= tar)
        return t[u].r;
    if (t[u].l == t[u].r)
    {
        if (t[u].sum <= tar)
            return t[u].r;
        return t[u].l - 1;
    }
    if (t[lu].sum >= tar)
        return bs(lu, tar);
    return bs(ru, tar - t[lu].sum);
}

ll ask(int u, int l, int r)
{
    if (t[u].l >= l && t[u].r <= r)
        return t[u].cnt;
    int mid = (t[u].l + t[u].r) >> 1;
    ll res = 0;
    if (r > mid)
        res += ask(ru, l, r);
    if (l <= mid)
        res += ask(lu, l, r);
    return res;
}
ll askpre(int u, int l, int r)
{
    if (t[u].l >= l && t[u].r <= r)
        return t[u].sum;
    int mid = (t[u].l + t[u].r) >> 1;
    ll res = 0;
    if (r > mid)
        res += askpre(ru, l, r);
    if (l <= mid)
        res += askpre(lu, l, r);
    return res;
}
void solve()
{
    cin >> n >> q;
    set<ll> st;
    ll fu = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (a[i] < 0)
            fu++;
        if(a[i]==0)continue;
        st.insert(a[i]);
    }
    vector<pll> qry(q + 5);
    for (int i = 1; i <= q; i++)
    {
        cin >> qry[i].first >> qry[i].second;
        if(qry[i].second)st.insert(qry[i].second);
    }
    int tt = 1;
    for (auto e : st)
    {
        tmp[tt] = e;
        mp[e] = tt++;
    }
    build(1, 1, tt);
    for (int i = 1; i <= n; i++)
    {
        if(a[i])
            upd(1, mp[a[i]], a[i]);
    }
    for (int i = 1; i <= q; i++)
    {
        if(a[qry[i].first])del(1, mp[a[qry[i].first]], a[qry[i].first]);
        if(qry[i].second)upd(1, mp[qry[i].second], qry[i].second);
        if (a[qry[i].first] < 0)
            fu--;
        if (qry[i].second < 0)
            fu++;
        a[qry[i].first] = qry[i].second;
        int pos = bs(1, 0);
        ll pre=askpre(1,1,pos);
        ll ans = ask(1, 1, pos);
        if(pre<0&&pos<tt-1){
            ll qwq=tmp[pos+1];
            ans+=(-pre)/qwq;
        }
        // cout << "pos: " << pos << endl;
        // cout << "cnt: "<<ans<<endl;
        cout << ans - fu + 1 << endl;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int _ = 1;
    // cin>>_;
    while (_--)
        solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 9112kb

input:

3 5
1 2 3
3 4
2 -2
1 -3
3 1
2 1

output:

1
2
2
2
3

result:

ok 5 number(s): "1 2 2 2 3"

Test #2:

score: 0
Accepted
time: 2ms
memory: 9284kb

input:

3 5
1 2 3
3 4
2 -2
1 3
3 1
2 1

output:

1
2
1
2
1

result:

ok 5 number(s): "1 2 1 2 1"

Test #3:

score: 0
Accepted
time: 2ms
memory: 9376kb

input:

1 1
1000000000
1 1000000000

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 9272kb

input:

1 1
-1000000000
1 -1000000000

output:

1

result:

ok 1 number(s): "1"

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 9636kb

input:

1000 1000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

output:

946
0
0
0
915
592
983
0
0
899
809
0
586
587
0
0
804
0
0
699
504
0
579
0
0
856
545
0
0
657
568
509
0
710
873
0
537
879
0
1
0
970
923
510
984
642
0
879
941
0
0
788
917
994
571
610
491
0
926
0
986
840
624
613
0
0
816
0
0
0
0
0
0
0
0
0
498
929
511
588
0
608
678
0
970
911
0
579
0
0
918
0
0
0
0
968
0
0
0
...

result:

wrong answer 2nd numbers differ - expected: '65', found: '0'