Submission #164584

# Submission time Handle Problem Language Result Execution time Memory
164584 2019-11-21T17:12:03 Z arnold518 Cake (CEOI14_cake) C++14
0 / 100
2000 ms 23140 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 250000;
const int MAXQ = 500000;

int N, Q, A, D[MAXN+10];
set<pii, greater<pii>> S;

int tree[4*MAXN+10];

void init(int node, int tl, int tr)
{
    if(tl==tr)
    {
        tree[node]=D[tl];
        return;
    }
    int mid=tl+tr>>1;
    init(node*2, tl, mid);
    init(node*2+1, mid+1, tr);
    tree[node]=max(tree[node*2], tree[node*2+1]);
}

void update(int node, int tl, int tr, int pos, int val)
{
    if(tl==tr)
    {
        tree[node]=val;
        return;
    }
    int mid=tl+tr>>1;
    if(pos<=mid) update(node*2, tl, mid, pos, val);
    else update(node*2+1, mid+1, tr, pos, val);
    tree[node]=max(tree[node*2], tree[node*2+1]);
}

int query(int node, int tl, int tr, int l, int r)
{
    if(l<=tl && tr<=r) return tree[node];
    if(r<tl || tr<l) return 0;
    int mid=tl+tr>>1;
    return max(query(node*2, tl, mid, l, r), query(node*2+1, mid+1, tr, l, r));
}

int main()
{
    int i, j;

    scanf("%d%d", &N, &A);
    for(i=1; i<=N; i++) scanf("%d", &D[i]), S.insert({D[i], i});
    D[0]=D[N+1]=987654321;

    init(1, 0, N+1);

    scanf("%d", &Q);
    while(Q--)
    {
        char t;
        scanf(" %c", &t);
        if(t=='F')
        {
            int x;
            scanf("%d", &x);
            if(x==A) printf("0\n");
            else if(x<A)
            {
                int lo=A, hi=N+1;
                int val=query(1, 0, N+1, x, A);
                while(lo+1<hi)
                {
                    int mid=lo+hi>>1;
                    if(query(1, 0, N+1, A+1, mid)>val) hi=mid;
                    else lo=mid;
                }
                printf("%d\n", hi-x-1);
            }
            else
            {
                int lo=0, hi=A;
                int val=query(1, 0, N+1, A, x);
                while(lo+1<hi)
                {
                    int mid=lo+hi>>1;
                    if(query(1, 0, N+1, mid, A-1)>val) lo=mid;
                    else hi=mid;
                }
                printf("%d\n", x-lo-1);
            }
        }
        else
        {
            int a, b;
            scanf("%d%d", &a, &b); b--;
            S.erase({D[a], a});
            vector<pii> T;
            auto it=S.begin();
            for(i=0; i<b; i++, it++) T.push_back(*it);
            int val=S.begin()->first+2;
            for(auto it : T)
            {
                S.erase(it);
                D[it.second]++;
                S.insert({D[it.second], it.second});
                update(1, 0, N+1, it.second, D[it.second]);
                val=min(val, D[it.second]);
            }
            val--;
            D[a]=val;
            S.insert({D[a], a});
            update(1, 0, N+1, a, D[a]);
        }
    }
}

Compilation message

cake.cpp: In function 'void init(int, int, int)':
cake.cpp:23:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid=tl+tr>>1;
             ~~^~~
cake.cpp: In function 'void update(int, int, int, int, int)':
cake.cpp:36:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid=tl+tr>>1;
             ~~^~~
cake.cpp: In function 'int query(int, int, int, int, int)':
cake.cpp:46:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid=tl+tr>>1;
             ~~^~~
cake.cpp: In function 'int main()':
cake.cpp:76:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     int mid=lo+hi>>1;
                             ~~^~~
cake.cpp:88:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
                     int mid=lo+hi>>1;
                             ~~^~~
cake.cpp:52:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
cake.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &N, &A);
     ~~~~~^~~~~~~~~~~~~~~~
cake.cpp:55:43: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(i=1; i<=N; i++) scanf("%d", &D[i]), S.insert({D[i], i});
                         ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
cake.cpp:60:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &Q);
     ~~~~~^~~~~~~~~~
cake.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %c", &t);
         ~~~~~^~~~~~~~~~~
cake.cpp:68:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &x);
             ~~~~~^~~~~~~~~~
cake.cpp:98:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d%d", &a, &b); b--;
             ~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 12 ms 404 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 763 ms 5428 KB Output is correct
2 Incorrect 411 ms 5368 KB Output isn't correct
3 Correct 510 ms 5348 KB Output is correct
4 Correct 249 ms 5368 KB Output is correct
5 Correct 875 ms 6472 KB Output is correct
6 Incorrect 709 ms 6868 KB Output isn't correct
7 Correct 567 ms 6744 KB Output is correct
8 Correct 340 ms 6908 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 506 ms 6984 KB Output is correct
2 Incorrect 364 ms 7124 KB Output isn't correct
3 Incorrect 387 ms 7064 KB Output isn't correct
4 Incorrect 1 ms 256 KB Output isn't correct
5 Correct 617 ms 15720 KB Output is correct
6 Correct 738 ms 15792 KB Output is correct
7 Incorrect 597 ms 15896 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Incorrect 114 ms 1016 KB Output isn't correct
2 Incorrect 96 ms 1188 KB Output isn't correct
3 Incorrect 251 ms 4604 KB Output isn't correct
4 Incorrect 272 ms 4472 KB Output isn't correct
5 Incorrect 287 ms 1912 KB Output isn't correct
6 Incorrect 610 ms 6384 KB Output isn't correct
7 Incorrect 348 ms 3192 KB Output isn't correct
8 Correct 361 ms 8904 KB Output is correct
9 Execution timed out 2049 ms 21592 KB Time limit exceeded
10 Incorrect 966 ms 5228 KB Output isn't correct
11 Incorrect 1370 ms 7320 KB Output isn't correct
12 Execution timed out 2037 ms 19092 KB Time limit exceeded
13 Execution timed out 2070 ms 23140 KB Time limit exceeded