Submission #496326

#TimeUsernameProblemLanguageResultExecution timeMemory
496326IerusGift (IZhO18_nicegift)C++17
100 / 100
606 ms133240 KiB
#include<bits/stdc++.h> /* #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; */ using namespace std; #pragma GCC optimize ("unroll-loops,Ofast,O3") #pragma GCC target("avx,avx2,fma") #define F first #define S second #define int long long #define sz(x) (int)x.size() #define pb push_back #define eb emplace_back #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define NFS ios_base::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ; #define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) //#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> typedef long long ll; const int E = 1e6+777; const long long inf = 1e18+777; const int N = 1e5+777; const int MOD = 1e9+7; int n, k, a[E], sum; vector<vector<int>> res; priority_queue<pair<int,int>> pq; signed main(){auto solve=[&](){ cin >> n >> k; for(int i = 1; i <= n; ++i){ cin >> a[i]; sum += a[i]; if(a[i] > 0){ pq.push({a[i], i}); } } bool ok = (sum % k == 0); for(int i = 1; i <= n; ++i){ if(a[i] > sum / k) ok = false; } if(!ok){ cout << -1; return; } int len = sum / k; vector<vector<pair<int,int>>> m(k); vector<int> sm(k, 0), u(k, 0); for(int i = 1, e = 0; i <= n;){ if(sm[e] + a[i] <= len){ m[e].pb({a[i], i}); sm[e] += a[i]; ++i; }else{ int cur = len - sm[e]; if(!cur){ ++e; continue; } sm[e] += cur; m[e].pb({cur, i}); a[i] -= cur; ++e; } if(!a[i])++i; } // cerr << "M\n"; // for(int i = 0; i < k; ++i){ // for(int j = 0; j < sz(m[i]); ++j){ // cerr << m[i][j].F << ' '; // } // cerr << '\n'; // }cerr << '\n'; auto check = [&](){ bool ok = 0; for(int i = 0; i < k; ++i){ if(sm[i])ok=1; } return ok; }; while(check()){ // cerr << "OK\n"; vector<int> r; int mn = LLONG_MAX; for(int i = 0; i < k; ++i){ mn = min(mn, m[i][u[i]].F); } r.pb(mn); for(int i = 0; i < k; ++i){ sm[i] -= mn; m[i][u[i]].F -= mn; r.pb(m[i][u[i]].S); if(m[i][u[i]].F == 0){ ++u[i]; } } res.pb(r); } cout << sz(res) << '\n'; for(auto v : res){ for(auto it : v) cout << it << ' '; cout << '\n'; } };NFS;solve();}
#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...