Submission #1306990

#TimeUsernameProblemLanguageResultExecution timeMemory
1306990michael12Souvenirs (IOI25_souvenirs)C++20
39 / 100
13 ms404 KiB
#include "souvenirs.h"
#include<bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define sm pair<vector<int>, long long>
using namespace std;
const int maxn = 101;
long long tree[4 * maxn];
long long a[maxn];
void build(int node, int start, int end){
    if(start == end){
        tree[node] = a[start];
    }
    else{
        int mid = (start + end) / 2;
        build(2 * node, start, mid);
        build(2 * node + 1, mid + 1, end);
        tree[2 * node] = tree[2 * node + 1] + tree[2 * node + 2];
    }
}
int query(int node, int start, int end, int l, int r){
    if(start > r || end < l) return 0;
    if(start >= l && end <= r) return tree[node];
    int mid = (start + end) / 2;
    int l1 = query(2 * node, start, mid, l, r);
    int r1 = query(2 * node + 1, mid + 1, end, l, r);
    return l1 + r1;

}
void sub3(int n, long long P0){
   sm T = transaction(P0 - 1);
   if(T.ff.size() == 1){
      long long p1 = P0 - 1 - T.ss;
      transaction(p1 - 1);
      transaction(p1 - 1);
   }
   else{
     long long sm2 = P0 - 1 - T.ss;
     transaction(sm2 / 2);
   }
}
void buy_souvenirs(int N, long long P0){
     long long p = P0;
     if(N == 2){
     transaction(p - 1);
     return;
     }
     else if(N == 3){
        sub3(N, P0);
        return;
     }
     else if(P0 == N){
        for(int i = N - 1; i >= 1; i--){
            for(int j = 1; j <= N - i; j++){
                transaction(i);
            }
        }
        return;
     }
    else {
        long long k = 0, P = P0-1;
        sm m;
        for (int i = 1; i < N - 1; i++) {
            for (int j = 1; j <= i; j++) {
                m = transaction(P);
                if(m.ff.size() == 2) {
                    k++;
                    P--;
                }
                if (m.ss > 0) {
                    P--;
                }
            }
            P--;
        }
        for (int i = k + 1; i <= N - 1; i++) {
            m = transaction(P);
        }
        return;
    }

     return;
     
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...