Submission #1118732

#TimeUsernameProblemLanguageResultExecution timeMemory
1118732MinbaevA Huge Tower (CEOI10_tower)C++17
20 / 100
319 ms262144 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast,unroll-loops")

using namespace std;
using namespace __gnu_pbds;

#define pb 		push_back
#define all(x) 	x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define f 		first
#define s 		second
#define int 	long long
#define ll 		long long
#define pii 	pair<int,int>
#define ar 		array
#define mps		make_pair

template<class T>bool umax(T &a,T b){if(a<b){a=b;return true;}return false;}
template<class T>bool umin(T &a,T b){if(b<a){a=b;return true;}return false;}

template<class T> using ste = tree<T, null_type, less_equal<T>,
rb_tree_tag, tree_order_statistics_node_update>;

const int inf = 3e18 + 7;
const int mod = 1e9 + 7;
const int N = 2e5 + 5;
const int md = 998244353;

int binpow(int a, int b, int m){
	if(b == 0)return 1;
	if(b % 2 == 0){
		int c = binpow(a,b/2,m);
		return (c*c)%m;
	}
	return (binpow(a,b-1,m)*a)%m;
}

int divi(int a, int b, int m){
	return (a*(binpow(b,m-2, m)))%m;
}

int n,m,k,q;
vector<int>g[21];

void solve(){

	cin >> n >> k;
	vector<int>v(n);
	for(auto &to:v)cin >> to;
	
	int dp[(1<<n)][n]{};
	for(int i = 0;i<n;i++){
		dp[(1<<i)][i] = 1;
	}
	
	for(int mask = 1;mask<(1<<n);mask++){
		vector<pii>vs;
		for(int i = 0;i<n;i++){
			if(dp[mask][i] > 0)vs.pb({v[i], dp[mask][i]});
		}
		sort(all(vs));
		vector<int>pref(vs.size());
		for(int i = 0;i<vs.size();i++){
			pref[i] = ((i == 0) ? 0 : pref[i-1]);
			pref[i] += vs[i].s;
			pref[i] %= mod;
		}
		
		for(int i = 0;i<n;i++){
			if(mask >> i & 1)continue;
			if(v[i] - vs[vs.size()-1].f > k)continue;
			int l = 0, r = vs.size(), ans = -1;
			while(l <= r){
				int mid = (l+r)/2;
				
				if(v[i]-vs[mid].f <= k){
					ans = mid;
					r = mid - 1;
				}
				else l = mid + 1;
			}
			int n_mask = (mask | (1<<i));
			dp[n_mask][i] += pref[vs.size()-1] - ((ans == 0) ? 0 : pref[ans-1]);
			dp[n_mask][i] %= mod;
		}
	}
	
	int res = 0;
	for(int i = 0;i<n;i++){
		res += dp[(1<<n)-1][i];
		res %= mod;
	}
	
	cout << res << "\n";
	


}
/*

*/
 signed main()
{
//	freopen("seq.in", "r", stdin);
//  freopen("seq.out", "w", stdout);
	ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
	int tt=1;//cin>>tt;
	while(tt--)solve();

}

Compilation message (stderr)

tower.cpp: In function 'void solve()':
tower.cpp:66:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |   for(int i = 0;i<vs.size();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...
#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...
#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...
#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...