제출 #328698

#제출 시각아이디문제언어결과실행 시간메모리
328698achibasadzishvili최후의 만찬 (IOI12_supper)C++14
43 / 100
492 ms24912 KiB
#include "advisor.h" #include<bits/stdc++.h> #define ll int #define f first #define s second #define pb push_back #define mp make_pair using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> int L; void write(ll x){ for(int i=0; i<L; i++){ bool k = (x & 1); WriteAdvice(k); x /= 2; } } int AC[200005]; void ComputeAdvice(int *c, int n, int k, int m){ ordered_set ord; set<pair<ll,ll> >st; set<pair<ll,ll> >::iterator it; set<ll>fr[n + 2]; for(int i=1; i<=20; i++) if((1 << i) > k){ L = i; break; } // cerr << "L: " <<L << '\n'; for(int i=0; i<n; i++){ fr[c[i]].insert(i); } for(int i=0; i<k; i++){ AC[i] = 1; ord.insert(i); if(fr[i].size() == 0) st.insert(mp(n + 2 , i)); else st.insert(mp((*fr[i].begin()) , i)); } for(int i=0; i<n; i++){ ll x = c[i]; if(AC[x] == 1){ st.erase(mp((*fr[x].begin()) , x)); fr[x].erase(fr[x].begin()); if(fr[x].size() == 0) st.insert(mp(n + 2 , x)); else st.insert(mp((*fr[x].begin()) , x)); continue; } else { fr[x].erase(i); it = st.end(); it--; int num = (*it).s; AC[num] = 0; AC[x] = 1; int ind = ord.order_of_key(num); write(ind); ord.insert(x); ord.erase(num); st.erase(it); if(fr[x].size() == 0) st.insert(mp(n + 2 , x)); else st.insert(mp((*fr[x].begin()) , x)); } } }
#include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> #define ll int #define f first #define s second #define pb push_back #include "assistant.h" using namespace std; int l = 0,ind = 0,ac[200005]; void Assist(unsigned char *A, int n, int k, int R){ ordered_set ord; for(int i=1; i<=20; i++) if((1 << i) > k){ l = i; break; } for(int i=0; i<k; i++){ ord.insert(i); ac[i] = 1; } for(int i=0; i<n; i++){ ll x = GetRequest(); if(ac[x] == 1)continue; else { ll d = 1,num = 0; for(int j=ind; j<ind+l; j++){ if(A[j] == 1)num += d; d *= 2; } ind += l; ll p = (*ord.find_by_order(num)); // cerr << "OE: " << p << '\n'; PutBack(p); // cerr << "Back: " << p << " " << x << '\n'; ac[p] = 0; ac[x] = 1; ord.erase(p); ord.insert(x); } } }
#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...