Submission #108850

#TimeUsernameProblemLanguageResultExecution timeMemory
108850hockySkyscraper (JOI16_skyscraper)C++14
20 / 100
653 ms359672 KiB
//new.cpp /* Author : Hocky Yudhiono Kam 02 Mei 2019 04:13:03 WIB Current Local Time : 16:13:03 getchar_unlocked > getchar > cin without sync > scanf > cin with sync bool operator<(const MyStruct& rhs) const On how to print Long Double to 5 decimal places : printf("%.5Lf",ans); On how to get random numbers : mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //For int mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); //For LL cout << rng() << endl; shuffle(isi.begin(),isi.end(),rng); __gcd(a,b) __builtin_ffs(a) first on bit __builtin_clz(a) count leading zero __builtin_ctz(a) count trailing zero __builtin_popcount(a) numbers of on bits */ //#include <unordered_map> //#include <unordered_set> //#include <random> //#include <chrono> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #include <algorithm> #include <iostream> #include <cstdlib> #include <cassert> #include <cstring> #include <iomanip> #include <cstdio> #include <limits> #include <string> #include <vector> #include <cmath> #include <deque> #include <queue> #include <stack> #include <map> #include <set> //using namespace __gnu_pbds; using namespace std; #pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC optimize(3) #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #pragma GCC target("sse3","sse2","sse") #pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3") #pragma GCC target("f16c") #pragma GCC optimize("inline","fast-math","unroll-loops","no-stack-protector") // #pragma GCC diagnostic error "-fwhole-program" // #pragma GCC diagnostic error "-fcse-skip-blocks" // #pragma GCC diagnostic error "-funsafe-loop-optimizations" // #pragma GCC diagnostic error "-std=c++14" // #pragma GCC target ("string"...) #pragma GCC push_options #pragma GCC pop_options #pragma GCC reset_options #pragma GCC optimize ("O3") typedef long long LL; typedef long double LD; typedef unsigned long long ULL; // typedef tree<long long, null_type, less<long long>, rb_tree_tag, tree_order_statistics_node_update> pbds; //If the time limit is strict, try not to use long double #define fbo find_by_order #define ook order_of_key #define mp make_pair #define pb push_back #define pf push_front #define popb pop_back #define popf pop_front #define remove erase //Remember to undefine if the problem is interactive #define endl '\n' #define DEBUG(X) cout << ">>> DEBUG(" << __LINE__ << ") " << #X << " = " << (X) << endl const double eps = 1e-9; const int INFMEM = 63; const int INF = 1061109567; const LL LINF = 4557430888798830399LL; const double DINF = numeric_limits<double>::infinity(); const LL MOD = 1000000007; const int dx[8] = {1,0,-1,0,1,1,-1,-1}; const int dy[8] = {0,1,0,-1,1,-1,1,-1}; const double PI = 3.141592653589793; #ifdef _WIN32 #define getchar_unlocked getchar #endif #define GETCHAR getchar_unlocked inline void fastll(LL &input_number) { input_number = 0; int ch = GETCHAR(); int sign = 1; while(ch < '0' || ch > '9'){ if(ch == '-') sign=-1; ch = GETCHAR(); } while(ch >= '0' && ch <= '9'){ input_number = (input_number << 3)+(input_number << 1) + ch-'0'; ch = GETCHAR(); } input_number *= sign; } inline void open(string a){ freopen((a+".in").c_str(),"r",stdin); freopen((a+".out").c_str(),"w",stdout); } inline void fasterios(){ //Do not use if interactive ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } LL n,k; LL isi[15]; vector <LL> all; LL memo[(1LL<<14)][2801]; //There are 6 cases //Case 1 = 000 //Case 2 = 100 //Case 3 = 001 //Case 4 = 101 //Case 5 = |01 //Case 6 = |00 //Case 7 = 10| //Case 8 = 00| void add(LL &a,LL b){ a = (a+b)%MOD; } LL dp(LL mask, LL cnt){ LL pos = __builtin_popcountll(mask)+1; // cout << pos << " " << mask << " " << cnt << endl; if(pos > n && cnt <= k) return 1; if(pos > n) return 0; if(memo[mask][cnt+1400] != -1) return memo[mask][cnt+1400]; LL ret = 0; for(int i = 0;i < n;i++){ if(mask&(1LL<<i)) continue; //put pos in the (i+1)-th position LL nxmask = (mask|(1LL<<i)); if(i == 0){ //left Wall case if(mask&(1LL<<(i+1))){ //case 5 add(ret,dp(nxmask,cnt+isi[pos])); }else{ //case 6 add(ret,dp(nxmask,cnt-isi[pos])); } }else if(i == n-1){ //Right wall case if(mask&(1LL<<(i-1))){ //case 7 add(ret,dp(nxmask,cnt+isi[pos])); }else{ //case 8 add(ret,dp(nxmask,cnt-isi[pos])); } }else{ //No wall case //Case 1 = 000 //Case 2 = 100 //Case 3 = 001 //Case 4 = 101 bool kiri = (mask&(1LL<<(i-1))); bool kanan = (mask&(1LL<<(i+1))); if(kiri == 0 && kanan == 0){ //Case 1 add(ret,dp(nxmask,cnt-(2*isi[pos]))); }else if((kiri^kanan)){ //Case 2 and Case 3 add(ret,dp(nxmask,cnt)); }else{ //Case 4 add(ret,dp(nxmask,cnt+(2*isi[pos]))); } } } return memo[mask][cnt+1400] = ret; } int main(){ memset(memo,-1,sizeof(memo)); cin >> n >> k; for(int i = 1;i <= n;i++) cin >> isi[i]; sort(isi+1,isi+1+n); if(n == 1) cout << 1 << endl; else cout << dp(0,0) << endl; return 0; }

Compilation message (stderr)

skyscraper.cpp:56:0: warning: ignoring #pragma comment  [-Wunknown-pragmas]
 #pragma comment(linker, "/stack:200000000")
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...