Submission #58688

#TimeUsernameProblemLanguageResultExecution timeMemory
58688BenqGift (IZhO18_nicegift)C++14
49 / 100
2029 ms153440 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef complex<ld> cd; typedef pair<int, int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<cd> vcd; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; #define FOR(i, a, b) for (int i=a; i<(b); i++) #define F0R(i, a) for (int i=0; i<(a); i++) #define FORd(i,a,b) for (int i = (b)-1; i >= a; i--) #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--) #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define f first #define s second #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() const int MOD = 1000000007; const ll INF = 1e18; const int MX = 1000001; int N,K; vpl A; map<vi,ll> ret; void ins(vi v, ll oc) { for (auto a: v) { A[a].f -= oc; if (A[a].f < 0) { cout << -1; exit(0); } } sort(all(v)); assert(sz(v) == K); ret[v] += oc; } void input() { ios_base::sync_with_stdio(0); cin.tie(0); srand(135195); cin >> N >> K; A.resize(N); F0R(i,N) { // A[i].f = rand() % 3+1; // cout << A[i].f << " "; cin >> A[i].f; A[i].s = i+1; } // cout << "\n"; sort(all(A)); reverse(all(A)); } void tri(int l, int r, int ind, ll ti) { vi v; F0R(i,l) v.pb(i); FOR(i,ind,ind+K-l) v.pb(l+(i%(r-l+1))); ins(v,ti); } int l,m,r; void prin() { for (auto a: A) cout << a.f << " "; cout << "\n"; } void solve() { l = m = r = K-1; while (1) { // prin(); while (l && A[l-1].f == A[l].f) l--; while (m+1 < N && A[m+1].f == A[m].f) m ++; r = m; while (r+1 < N && A[r+1].f == A[m].f-1) r ++; ll ti = INF; if (r+1 != K && l != 0) ti = (A[l-1].f-A[l].f)/(r+1-K); // A[l-1] - ti*(r-l+1) >= A[l]-ti*(K-l) ti = min(ti,(A[r].f-(r == N-1 ? 0 : A[r+1].f))/(K-l)); if (ti) FOR(i,l,r+1) tri(l,r,i,ti); // prin(); // cout << l << " " << m << " " << r << "\n"; while (!(l != 0 && A[l-1].f == A[l].f) && !(r != N-1 && A[r+1].f >= A[l].f-1)) { if (A[0].f == 0) return; vi v; F0R(i,l) { v.pb(i); } for (; sz(v) < K; ) { v.pb(m--); if (m < l) m = r; } ins(v,1); } } } void print() { cout << sz(ret) << "\n"; for (auto a: ret) { cout << a.s << " "; for (int i: a.f) cout << A[i].s << " "; cout << "\n"; } } int main() { input(); solve(); print(); } /* Look for: * the exact constraints (multiple sets are too slow for n=10^6 :( ) * special cases (n=1?) * overflow (ll vs int?) * array bounds */
#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...