제출 #1251096

#제출 시각아이디문제언어결과실행 시간메모리
1251096abcdxyz123Souvenirs (IOI25_souvenirs)C++17
100 / 100
12 ms420 KiB
#include "souvenirs.h" #include<bits/stdc++.h> using namespace std; #define ll long long #define vi vector<int> #define fi first #define se second vector<ll>p; vector<int>cnt; int Refresh(ll &sum,vector<int>&cur) { int old=cur.size(); set<int>s; for(int v:cur) { s.insert(v); } for(int v:cur) { if(p[v]!=-1) { sum-=p[v]; s.erase(v); } } cur.clear(); for(int v:s)cur.push_back(v); return (old>cur.size()); } void dfs(int u,ll sum,vector<int>cur) { /* cout<<"+>"<<u<<'\n'; cout<<sum<<'\n'; for(int x:cur)cout<<x<<' '; cout<<'\n'; */ if(cur.size()==1) { p[u]=sum; return ; } if(p[u]!=-1)return; Refresh(sum,cur); while(true) { if(cur.size()==1) { p[u]=sum; break; } ll nxt_sum=sum/cur.size(); for(int i=cur.back();i>=u;i--) { if(p[i]!=-1) { nxt_sum=p[i]-1; break; } } pair<vi,ll>nxt=transaction(nxt_sum); for(int v:nxt.fi)cnt[v]++; nxt_sum-=nxt.se; dfs(nxt.fi[0],nxt_sum,nxt.fi); //if( Refresh(sum,cur); //)break; //nxt_sum=p[nxt.fi[0]]-1; } } void buy_souvenirs(int n,ll p0) { p=vector<ll>(n,-1); p[0]=p0; cnt=vector<int>(n,0); for(int i=1;i<n;i++) { if(p[i]==-1) { ll nxt_sum=p[i-1]-1; pair<vi,ll>nxt=transaction(nxt_sum); for(int v:nxt.fi)cnt[v]++; nxt_sum-=nxt.se; Refresh(nxt_sum,nxt.fi); dfs(nxt.fi[0],nxt_sum,nxt.fi); } } for(int i=1;i<n;i++) { while(cnt[i]<i) { transaction(p[i]); cnt[i]++; } } }
#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...