QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#779712#7787. Maximum RatingKokomiWA 2ms9632kbC++143.3kb2024-11-24 21:21:242024-11-24 21:21:30

Judging History

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

  • [2024-11-24 21:21:30]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:9632kb
  • [2024-11-24 21:21:24]
  • 提交

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, 0);
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;
}

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;
}

int bs(int u,ll tar){
  if(t[u].l==t[u].r)return t[u].l;
  if(t[lu].sum>=tar)return bs(lu,tar);
  return bs(ru,tar-t[lu].sum);
}
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 l=1,r=tt;
    while(l<=r){
      int mid=(l+r)>>1;
      if(askpre(1,1,mid)>0){
        r=mid-1;
      }
      else l=mid+1;
    }
    // int pos=r;
    int pos=bs(1,0);
    ll pre = askpre(1, 1, pos);
    ll ans = ask(1, 1, pos);
    // cout<<"pos:"<<pos<<endl;
    // cout<<"pre:"<<pre<<endl;
    // cout<<"ans:"<<ans<<endl;
    if (pre > 0)
    {
      ll qwq = tmp[pos];
      ans-=(pre+qwq-1)/qwq;
    }
    if (pre < 0 && pos < tt - 1)
    {
      ll qwq = tmp[pos + 1];
      ans += (-pre) / qwq;
    }
    cout << ans - fu + 1 << endl;
  }
}

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

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 9236kb

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: 9196kb

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: 0ms
memory: 9264kb

input:

1 1
1000000000
1 1000000000

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

input:

1 1
-1000000000
1 -1000000000

output:

1

result:

ok 1 number(s): "1"

Test #5:

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

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'