Submission #1341621

#TimeUsernameProblemLanguageResultExecution timeMemory
1341621hyyh선물 (IOI25_souvenirs)C++20
3 / 100
13 ms412 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <map>
#include <iostream>

using namespace std;
using ll = long long;
#define endl '\n'
#define f first
#define s second

void buy_souvenirs(int N, long long P0) {
  vector<int> minP(N);
  vector<int> maxP(N);
  vector<int> cnt(N);
  map<int,vector<int>> wait;
  vector<pair<int,pair<vector<int>,ll>>> query;
  int cur = N-1;
  minP[0] = P0;
  maxP[0] = P0;
  for(int i{1};i < N;i++){
    maxP[i] = maxP[i-1]-1;
    minP[i] = N-i;
  }
  while(cur != 0){
    // cout << "Max : ";
    // for(auto k:maxP) cout << k << " ";
    // cout << endl;
    // cout << "Min : ";
    // for(auto k:minP) cout << k << " ";
    // cout << endl;
    pair<vector<int>,ll> ret = transaction(maxP[cur]);
    int use = maxP[cur]-ret.s;
    query.push_back({ret.f.size(),{ret.f,use}});
    for(auto k:ret.f){
      wait[k].emplace_back(query.size()-1);
      use -= minP[k];
      cnt[k]++;
    }
    //cout << use << endl;
    for(auto k:ret.f){
      maxP[k] = use+minP[k];
    }
    for(int i{1};i < N;i++){
      maxP[i] = min(maxP[i],maxP[i-1]-1);
    }
    for(int i{1};i < N-1;i++){
      minP[i] = max(minP[i],minP[i+1]+1);
    }
    for(auto [a,b]:query){
      if(a == 1){
        int val = b.s;
        int notf = -1;
        for(auto k:b.f){
          if(minP[k] == maxP[k]){
            val -= minP[k];
          }
          else notf = k;
        }
        if(notf != -1){
          minP[notf] = val;
          maxP[notf] = val;
        }
      }
    }
    cur = 0;
    for(int i{1};i < N;i++){
      if(minP[i] != maxP[i]) cur = max(cur,i);
      else{
        for(auto k:wait[i]){
          query[k].f--;
        }
        wait[i].clear();
      }
    }
    for(int i{1};i < N-1;i++){
      minP[i] = max(minP[i],minP[i+1]+1);
    }
  }
  for(int i{};i < N;i++){
    while(cnt[i] < i){
      transaction(maxP[i]);
      cnt[i]++;
    }
  }
  return;
}

Compilation message (stderr)

souvenirs.cpp: In function 'void buy_souvenirs(int, long long int)':
souvenirs.cpp:35:32: warning: narrowing conversion of 'ret.std::pair<std::vector<int>, long long int>::first.std::vector<int>::size()' from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' [-Wnarrowing]
   35 |     query.push_back({ret.f.size(),{ret.f,use}});
      |                      ~~~~~~~~~~^~
#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...