Submission #497981

#TimeUsernameProblemLanguageResultExecution timeMemory
497981armashkaGift (IZhO18_nicegift)C++17
100 / 100
629 ms111580 KiB
#include <bits/stdc++.h> //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define fast ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); #define all(v) v.begin(),v.end() #define pb push_back #define sz size() #define ft first #define sd second using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef unsigned long long ull; const int N = 1e6 + 5; const ll M = 1e8; const ll inf = 1e18; const ll mod = 1e9; const double Pi = acos(-1); ll binpow(ll x, ll ti) { ll res = 1;while (ti){if(ti & 1)res *= x;x *= x;ti >>= 1; x %= mod; res %= mod;} return res;} ll binmul(ll x, ll ti) { ll res = 0;while (ti){if(ti & 1)res += x;x += x;ti >>= 1; x %= mod; res %= mod;} return res;} ll nok(ll a, ll b) { return (a*b)/__gcd(abs(a),abs(b)) * (a*b > 0 ? 1 : -1); } bool odd(ll n) { return (n % 2 == 1); } bool even(ll n) { return (n % 2 == 0); } ll n, k, sum, l[N], mx, cnt; pll a[N], b[N]; vector <pll> q[N]; const void solve(/*Armashka*/) { cin >> n >> k; for (int i = 1; i <= n; ++ i) cin >> a[i].ft, a[i].sd = i; sort(a + 1, a + n + 1); for (int i = 1; i <= n; ++ i) b[i] = a[i], sum += a[i].ft, mx = max(mx, a[i].ft); if (sum % k || mx > sum / k) { cout << "-1\n"; return; } ll s = 0, cur = 1; for (int i = 1; i <= n; ++ i) { if (s + a[i].ft <= sum / k) { q[cur].pb({a[i].ft, a[i].sd}); s += a[i].ft; if (s == sum / k) { s = 0; ++ cur; } } else { q[cur].pb({(sum / k) - s, a[i].sd}); ++ cur; s = a[i].ft - ((sum / k) - s); q[cur].pb({s, a[i].sd}); } } while (1) { multiset <pll> st; for (int i = 1; i <= k; ++ i) { if (l[i] < q[i].sz) st.insert({q[i][l[i]].ft, i}); } if (st.empty()) break; for (auto [x, pos] : st) { if (x == st.begin()->ft) q[pos][l[pos]].ft = 0, ++ l[pos]; else q[pos][l[pos]].ft -= st.begin()->ft; } ++ cnt; } cout << cnt << "\n"; for (int i = 1; i <= k; ++ i) q[i].clear(); s = 0, cur = 1; for (int i = 1; i <= n; ++ i) { if (s + a[i].ft <= sum / k) { q[cur].pb({a[i].ft, a[i].sd}); s += a[i].ft; if (s == sum / k) { s = 0; ++ cur; } } else { q[cur].pb({(sum / k) - s, a[i].sd}); ++ cur; s = a[i].ft - ((sum / k) - s); q[cur].pb({s, a[i].sd}); } } for (int i = 1; i <= k; ++ i) l[i] = 0; while (1) { multiset <pair<pll, ll>> st; for (int i = 1; i <= k; ++ i) { if (l[i] < q[i].sz) st.insert({q[i][l[i]], i}); } if (st.empty()) break; cout << st.begin()->ft.ft << " "; for (auto [x, pos] : st) { if (x.ft == st.begin()->ft.ft) q[pos][l[pos]].ft = 0, ++ l[pos]; else q[pos][l[pos]].ft -= st.begin()->ft.ft; cout << x.sd << " "; } cout << "\n"; } } signed main() { fast; //freopen("divide.in", "r", stdin); //freopen("divide.out", "w", stdout); int tt = 1; //cin >> tt; while (tt --) { solve(); } } /* 5 4 4 1 2 3 1 3 4 5 3 4 5 2 3 2 1 3 1 1 3 5 2 3 4 5 2 1 3 1 */

Compilation message (stderr)

nicegift.cpp: In function 'const void solve()':
nicegift.cpp:63:13: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |    if (l[i] < q[i].sz) st.insert({q[i][l[i]].ft, i});
      |             ^
nicegift.cpp:94:13: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |    if (l[i] < q[i].sz) st.insert({q[i][l[i]], 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...