Submission #379398

#TimeUsernameProblemLanguageResultExecution timeMemory
379398fhvirusGift (IZhO18_nicegift)C++17
0 / 100
755 ms116744 KiB
// Knapsack DP is harder than FFT. #include<bits/stdc++.h> using namespace std; typedef int64_t ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define ff first #define ss second #define pb emplace_back #define FOR(i,n) for(int i=0;i<(n);++i) #define FOO(i,a,b) for(int i=(a);i<=int(b);++i) #define OOF(i,a,b) for(int i=(a);i>=int(b);--i) #define AI(x) begin(x),end(x) template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;} template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;} inline ll cdiv(ll x,ll m){return x/m+(x%m?(x<0)^(m>0):0);} #ifdef OWO #define safe cerr<<"\033[1;32m"<<__PRETTY_FUNCTION__<<" - "<<__LINE__<<" JIZZ\033[0m\n" #define debug(args...) SDF(#args, args) #define OIU(args...) ostream& operator<<(ostream&O,args) #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;} LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss) template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';} template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));} #else #pragma GCC optimize("Ofast") #define safe ((void)0) #define debug(...) ((void)0) #endif const ll inf = 1e9, INF = 4e18; const int N = 1e6 + 225; int n, k; ll a[N]; inline void fail(){ puts("-1"); exit(0);} int32_t main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n >> k; FOR(i,n) cin >> a[i]; ll sum = accumulate(a, a + n, 0ll), y = sum / k; if(y * k != sum) fail(); if(*max_element(a, a + n) > y) fail(); map<ll, vector<pll>> ms; { ll cur = 0; ll x = 0; FOR(i,n){ ll l = cur, r = cur + a[i] - 1; debug(a[i], cur, x, l, r); if(r >= y){ ms[l].pb(x, i); ++x; ms[0].pb(x, i); r -= y; } else { ms[l].pb(x, i); } cur = r + 1; } } debug(ms); vector<pair<ll, vector<int>>> ans; vector<int> cur(k); { for(auto it = begin(ms); it != end(ms); ++it){ auto [x, mod] = *it; if(x == y) break; for(auto [p, i]: mod){ cur[p] = i; } assert(next(it) != end(ms)); ans.pb((*next(it)).ff - x, cur); debug(x, cur); } } cout << ans.size() << '\n'; for(auto [x, v]: ans){ cout << x << ' '; for(int i: v) cout << i + 1 << ' '; cout << '\n'; } return 0; }
#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...