| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1306989 | michael12 | 선물 (IOI25_souvenirs) | C++20 | 0 ms | 0 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.sss > 0) {
P--;
}
}
P--;
}
for (int i = k + 1; i <= N - 1; i++) {
m = transaction(P);
}
return;
}
return;
}
