Submission #20682

#TimeUsernameProblemLanguageResultExecution timeMemory
20682우리OJ (#35)복불복 (OJUZ11_luck)C++14
47 / 100
193 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(){
	if(k == n){
		ll ans = 1;
		rep(i, n)ans = ans * (i+1) % MOD;
		printf("%lld\n", ans);
		return;
	}
	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:122: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:123: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:124: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...