Submission #674388

#TimeUsernameProblemLanguageResultExecution timeMemory
674388VictorAkcija (COCI21_akcija)C++17
90 / 110
5080 ms478456 KiB
// #pragma GCC target ("avx,avx2,fma") // #pragma GCC optimize ("Ofast,inline") // O1 - O2 - O3 - Os - Ofast // #pragma GCC optimize ("unroll-loops") #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = (a); i < (b); ++i) #define per(i, a, b) for (int i = (b) - 1; i >= (a); --i) #define trav(a, x) for (auto &a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() #define pb push_back #define debug(x) cout<<#x<<" = "<<x<<endl #define umap unordered_map #define uset unordered_set typedef pair<int, int> ii; typedef pair<int, ii> iii; typedef vector<int> vi; typedef vector<ii> vii; typedef vector<vi> vvi; typedef long long ll; typedef pair<ll,ll> pll; typedef vector<ll> vll; typedef vector<pll> vpll; const int INF = 1'000'000'007; vector<vi> node_products; vector<vi> sorted_node_products; int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n,k; cin>>n>>k; vector<iii> products(n); rep(i,0,n) { cin>>products[i].first>>products[i].second.first; products[i].second.second=i; } sort(all(products)); int cnt=0; ll sum=0; vector<bool> taken(n,0); vector<iii> optimal; { vi deadlines; int id=0; trav(product,products) { int cost=product.first,deadline,bla; tie(deadline,bla)=product.second; per(i,0,deadline) if(taken[i]==0) { taken[i]=1; ++cnt; sum+=cost; optimal.pb({deadline,{cost,id}}); deadlines.pb(deadline); break; } ++id; } sort(all(deadlines)); node_products.pb(deadlines); sorted_node_products.pb(deadlines); } per(i,0,sz(optimal)) { int id=optimal[i].second.second; products.erase(products.begin()+id); } //sort(all(optimal)); rep(i,0,n) swap(products[i].first,products[i].second.first); sort(all(optimal)); rep(i,0,n) swap(products[i].first,products[i].second.first); cnt=0; int unique_id=1; //cout<<sz(products)<<endl; //trav(product,products) debug(product.first); map<pair<int,pair<ll,int>>,pair<ii,ll>> nodes; nodes[{-sz(optimal),{sum,0}}]={{0,0},-1}; while(cnt<k) { if(nodes.empty()) break; auto it=nodes.begin(); int siz=-it->first.first,my_id=it->first.second.second; ll sum_cost=it->first.second.first; int product_index,pos_edit; tie(product_index,pos_edit)=it->second.first; ll move=it->second.second; nodes.erase(it); if(pos_edit%2==0) { pos_edit/=2; if(move!=-1) { int parent_id=move/(sz(products)+1); int new_product=move%(sz(products)+1); node_products[my_id]=node_products[parent_id]; int add_deadline=n+1; if(new_product!=sz(products)) add_deadline=products[new_product].second.first; //cout<<"my_id = "<<my_id<<" pos_edit = "<<pos_edit<<" node_products = "<<sz(node_products[my_id])<<endl; node_products[my_id][pos_edit-1]=add_deadline; // sort // rep(i,pos_edit-1,n-1) if(node_products[my_id][i]>node_products[my_id][i+1]) swap(node_products[my_id][i],node_products[my_id][i+1]); // per(i,0,pos_edit-1) if(node_products[my_id][i]>node_products[my_id][i+1]) swap(node_products[my_id][i],node_products[my_id][i+1]); sorted_node_products[my_id]=node_products[my_id]; sort(all(sorted_node_products[my_id])); } //cout<<endl; cout<<siz<<' '<<sum_cost<<endl; ++cnt; if(cnt==k) break; } else pos_edit/=2; int pos_cost=0; if(pos_edit!=sz(optimal)) pos_cost=optimal[pos_edit].second.first; int product_cost=0; if(product_index!=sz(products)) product_cost=products[product_index].first; //cout<<"siz = "<<siz<<" my_id = "<<my_id<<" sum_cost = "<<sum_cost<<endl; //cout<<"pos_edit = "<<pos_edit<<" product_index = "<<product_index<<" move = "<<move<<endl; //cout<<sz(sorted_node_products)<<endl; //cout<<endl; if(pos_edit!=sz(optimal)) { nodes[{-siz,{sum_cost,my_id}}]={{product_index,(pos_edit+1)*2+1},true}; nodes[{-(siz-1),{sum_cost-pos_cost,unique_id++}}]={{sz(products),(pos_edit+1)*2},sz(products)+ll(sz(products)+1)*my_id}; node_products.pb(vi()); sorted_node_products.pb(vi()); if(product_index!=sz(products)) { int min_deadline=0,pos_deadline=optimal[pos_edit].first; int time_slot=0; rep(i,0,sorted_node_products[my_id].size()) { if(sorted_node_products[my_id][i]==pos_deadline) { pos_deadline=-1; continue; } if(time_slot+1==sorted_node_products[my_id][i]) min_deadline=sorted_node_products[my_id][i]; time_slot++; } rep(i,product_index,sz(products)) { product_cost=products[i].first; if(products[i].second.first>min_deadline) { if(pos_cost>product_cost) { cout<<"pos_cost = "<<pos_cost<<" product_cost = "<<product_cost<<endl; cout<<"product_index = "<<product_index<<" min_deadline = "<<min_deadline<<" deadline = "<<products[i].second.first<<endl; assert(0); } nodes[{-siz,{sum_cost-pos_cost+product_cost,unique_id++}}]={{i+1,(pos_edit+1)*2},i+ll(sz(products)+1)*my_id}; node_products.pb(vi()); sorted_node_products.pb(vi()); } } } } //if(product_index!=sz(products)) nodes[{-siz,{sum_cost,unique_id++}}]={{product_index+1,(pos_edit)*2+1},false}; // move product index } return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:8:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i, a, b) for (int i = (a); i < (b); ++i)
      |                                          ^
Main.cpp:156:17: note: in expansion of macro 'rep'
  156 |                 rep(i,0,sorted_node_products[my_id].size()) {
      |                 ^~~
#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...