답안 #782945

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
782945 2023-07-14T11:53:13 Z HoriaHaivas Fountain (eJOI20_fountain) C++14
100 / 100
145 ms 10204 KB
/*
    "TLE is like the wind, always by my side"
    - Yasuo - 2022 -
*/
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")

using namespace std;

struct qq
{
    int r;
    int v;
    int pos;
    int ans;
};

bool cmp(qq a, qq b)
{
     return a.r>b.r;
}

bool cmp2(qq a, qq b)
{
     return a.pos<b.pos;
}

qq query[200001];
int d[100001];
int c[100001];
int aib[100001];
int st[100001];
int t;

void update(int index, int delta)
{
     while (index>0)
     {
           aib[index]+=delta;
           index-=index&(-index);
     }
}

int prefsum(int index)
{
    int sum;
    sum=0;
    while (index<=t)
    {
         sum+=aib[index];
         index+=index&(-index);
    }
    return sum;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,q,i,j,cnt,pas,ree;
    cin >> n >> q;
    for (i=1;i<=n;i++)
    {
         cin >> d[i] >> c[i];
    }
    for (i=1;i<=q;i++)
    {
         cin >> query[i].r >> query[i].v;
         query[i].pos=i;
    }
    sort(query+1,query+1+q,cmp);
    t=0;
    cnt=1;
    for (i=n;i>=1;i--)
    {
         if (t==0 || d[i]<d[st[t]])
         {
             t++;
             st[t]=i;
             update(t,c[i]);
         }
         else
         {
             while (d[i]>=d[st[t]] && t>0)
             {
                  update(t,-c[st[t]]);
                  t--;
             }
             t++;
             st[t]=i;
             update(t,c[i]);
         }
         while (query[cnt].r==i)
         {
                ree=t+1;
                pas=(1<<16);
                while (pas)
                {
                    if (ree-pas>0 && prefsum(ree-pas)<query[cnt].v)
                        ree-=pas;
                    pas=pas/2;
                }
                ree--;
                query[cnt].ans=st[ree];
                cnt++;
         }
    }
    sort(query+1,query+1+q,cmp2);
    for (i=1;i<=q;i++)
    {
         cout << query[i].ans << "\n";
    }
}

Compilation message

fountain.cpp: In function 'int main()':
fountain.cpp:63:15: warning: unused variable 'j' [-Wunused-variable]
   63 |     int n,q,i,j,cnt,pas,ree;
      |               ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 2 ms 340 KB Output is correct
6 Correct 1 ms 344 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 93 ms 7348 KB Output is correct
2 Correct 106 ms 7868 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 2 ms 340 KB Output is correct
6 Correct 1 ms 344 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 93 ms 7348 KB Output is correct
9 Correct 106 ms 7868 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 58 ms 4556 KB Output is correct
12 Correct 145 ms 10204 KB Output is correct
13 Correct 137 ms 9124 KB Output is correct
14 Correct 92 ms 8328 KB Output is correct
15 Correct 98 ms 8592 KB Output is correct