Submission #20681

#TimeUsernameProblemLanguageResultExecution timeMemory
20681우리OJ (#35)복불복 (OJUZ11_luck)C++14
22 / 100
169 ms2028 KiB
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <memory.h> #include <math.h> #include <assert.h> #include <queue> #include <map> #include <set> #include <string> #include <algorithm> #include <iostream> #include <functional> #include <unordered_map> #include <unordered_set> #include <list> #include <bitset> using namespace std; typedef pair<int, int> Pi; typedef long long ll; #define pii Pi #define pll PL #define Fi first #define Se second #define pb(x) push_back(x) #define sz(x) ((int)(x).size()) #define rep(i, n) for(int i=0;i<n;i++) #define all(x) (x).begin(), (x).end() typedef tuple<int, int, int> t3; typedef pair<ll, ll> PL; int n, k; int A[110], B[110]; const int MOD = 1e9 + 7; void subtask_1(){ int p[8] = {}, ans = 0; rep(i, n)p[i] = i; do{ int aa = 1e9, bb = 0; rep(i, n){ if(i < k)aa = min(aa, A[i] + B[p[i]]); else bb = max(bb, A[i] + B[p[i]]); } if(aa >= bb)ans++; }while(next_permutation(p, p+n)); printf("%d\n", ans); } void subtask_2(){ ll ans = 0; for(int i=0;i<n;i++){ int aa = A[0] + B[i]; int v[110] = {}; for(int j=1;j<n;j++){ int c = 0; for(int k=0;k<n;k++)if(i != k && B[k] + A[j] <= aa)++c; for(int k=1;k<=c;k++)v[k]++; } ll now = 1; for(int j=n-1;j;j--){ now = now * v[j] % MOD; for(int k=j;k;k--)v[k]--; } ans = (ans + now) % MOD; } printf("%lld\n", ans); } void subtask_3_get(int k, int *A, vector <int> &v, vector <Pi> &res, int inv){ rep(a, k){ rep(b, k){ int t = A[a] + v[b]; vector <int> cv(k+1, 0); rep(c, k){ int cnt = 0; rep(d, k)if(inv * (A[c] + v[d]) >= inv * t)cnt++; cv[cnt]++; } ll g = 1; for(int c=k, r=0;c;c--){ g = (cv[c] + r) * g % MOD; r += cv[c] - 1; } res.pb(Pi(t, (int)g)); } } sort(all(res)); } void subtask_3(){ ll ans = 0; for(int i=0;i<1<<n;i++){ if(__builtin_popcount(i) != k)continue; vector <int> v, w; rep(j, n){ if(1<<j & i)v.pb(B[j]); else w.pb(B[j]); } vector <Pi> av, aw; subtask_3_get(k, A, v, av, 1); //min subtask_3_get(n-k, A+k, w, aw, -1); //max for(int j=sz(aw)-1;j;j--)aw[j].Se = (aw[j].Se - aw[j-1].Se + MOD) % MOD; for(int j=0;j<sz(aw);j++){ int ww = aw[j].Fi; auto it = lower_bound(all(av), Pi(ww, -1)); if(it != av.end())ans = (ans + (ll)aw[j].Se * (lower_bound(all(av), Pi(ww, -1))->Se)) % MOD; } } printf("%lld\n", ans); } void solve(){ scanf("%d%d", &n, &k); rep(i, n)scanf("%d", A+i); rep(i, n)scanf("%d", B+i); sort(A, A+n); reverse(A, A+n); sort(B, B+n); reverse(B, B+n); int debug = 0; if(n <= 8){ subtask_1(); if(!debug)return; } if(k == 1){ subtask_2(); if(!debug)return; } if(n <= 15){ subtask_3(); } } int main(){ int Tc = 1; //scanf("%d", &Tc); for(int tc=1;tc<=Tc;tc++){ //printf("Case #%d: ", tc); solve(); } return 0; }

Compilation message (stderr)

luck.cpp: In function 'void solve()':
luck.cpp:116:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &k);
                       ^
luck.cpp:117:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  rep(i, n)scanf("%d", A+i);
                           ^
luck.cpp:118:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  rep(i, n)scanf("%d", B+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...