Submission #1118749

#TimeUsernameProblemLanguageResultExecution timeMemory
1118749MinbaevA Huge Tower (CEOI10_tower)C++17
20 / 100
1089 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 + 9;
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;
int res;
vector<int>g[N], vis(N);

void dfs(int x, int pos){
	vis[x] = 1;
	if(pos < n){
		for(auto to:g[x]){
			if(vis[to])continue;
			dfs(to, pos+1);
		}
	}
	vis[x] = 0;
	if(pos == n)res += 1;
}

void solve(){
 
	cin >> n >> k;
	vector<int>v(n);
	for(auto &to:v)cin >> to;
	
	if(n <= 20 && false){
		
		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";
		return;
	}
	
	for(int i = 0;i<n;i++){
		for(int j = 0;j<n;j++){
			if(i == j)continue;
			if(v[j]-v[i] <= k)g[i].pb(j);
		}
	}
	
	for(int i = 0;i<n;i++){
		dfs(i, 1);
	}
	
 	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:81:19: 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]
   81 |    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...