Submission #1201686

#TimeUsernameProblemLanguageResultExecution timeMemory
1201686Joon_YorigamiFinding Routers (IOI20_routers)C++20
100 / 100
1 ms332 KiB
/* .:-=++***#***+=:. .:-==+**##**%########***#####*=:. .-+#%%#*****############**#******#####+=: .-*%#####********###########*********#######*+-: :+#######**********########*****+********##########+-. :+##########**###******##********************###########+: :+##########*****#*******###**********************###***####*: .=###########***###*******#***************************#****#####*: :*#################******************************************######= -###################***************+****************************#####*: .=###################******************************************#****#####+. :*###################*******************************+************#*****#####: =#############**######*****#*******************++***++++++***************#####= .*###########******####*****#************+++*+**+++***++++++++***#**********#####+ -############********###*****%*+****+++++++++++++++++***++++++++***#*****#****#####* =############********###+++++##++++++++++++++++*++++++****++++******##*+++*#****#####*. .+#*##########*********###+++++%*++==++++++++++++*+++++*#************#*##*+++##****#####*. .*#=-##########********###*++++*%*+++++++++++++*****+******#***********#*##*+++####*######*. .:-: .*#: *#########*********###+++++##****++*******************#*#**********##*#*****####*#%###%*. .--:++=+. .**. ##########********##*#++***%#****+*************=#*****#*#**********##*##*##*####**#%###%*: :++===== .**. -###########******##*##+****%#*****#************-********#**********#***%####*###***#%######=: .-=++= =*. +############****###*##*****%#*****%####*####**#:=#***#**#**********#=##*###**####***#%########+: . .#. .####################*##*****%#####*%#****##****#.:#***#*#**********#%:##*+##***%###***############+: -- -###################**#*****####****##****##*****..#*****#**********#*.*#+ +##**#####***##############+-. -=+++-. = +###################**#*****###**********#*#***#: .***#*#***********#:.*#- :**#*######***#######%%%####%%#=: .++====++ = ####################**##*****###***#+****#=#**** .+*###************+ ## +***######****##########+--+#%%%%+: .---:=+======+: +. ##################%#***#*****####****#**#+-####. .+###***##*******# .#: :***########***##%%%####%#=. .:=*%% ---==++=======+= -= .%#################%****#*****######-#*##*.=%#*. +=---:::.......: =: =**#########***#%%%%%%%%%%%=. .- :-:===========+= .#. :%################%%****#*****#####= :-+***#*=. .*#########%%#**#*=%%%%%%%%%%=. .---=========+= :*. -#################%%****#*****%#+-.-*#%%%@###*= +##########%%%***:+-#%%%#####*: .:=++++====+- =*.=###%############%@%****#*****#. =###%%%@@@+ ###########%%%%#*#: -*########= ..:::::-. +*+###%####%######%%+******#****#=##= -@@@@@@@+ =*###########%%%%##+ :*#######+ =%##+%####%######%+.******#*****%%#-:+@@@@%-=* +..###########%##%%%*. -####### %##=#####%###%%#%:=******#*****%*.**##*+=: . -+**####*=: - .=###############%%*: .+##### .%###%########%%%%:.#*****##*****= .+: . :-::.:--=++- : .-*##################+: :#### :##.*###########%@# #************+ .:.-==-- . +**###+*##############*: .*## -%- ############%@@-#*###*#=##***#. :. =*++*#**++*##############*- .## =# ############@@@######*#:###*##= :..+*++++***+++++*##############=.+# +: ###########%@%%%%######.=###### .=+#+++++++***+++++****############## .+ *##########%%%%%%######::######= =+++#*+++++++*#+++++******########### +: =%#%######%%%##%@######:-+######. .:------== :*++++**+++++++*#*+++++********####### -* :%%%%#####%%%##%%%#####***######* -=--------=: -*+++++++*++++++++*#**+++*=:=******+==* .*+ +%%%%###%%####%%%#####**+#######= -........:=: -++++++++++*#**##***+******++- .-******=. -*= *%%%%##%%%%%%%#%#####**++#######. :.........- .=#%%%######%##########%#+*******. .-++++*+ -*+ .*%%%%#%%#######%#####*++++######*: ......... :=#%@@%%%%%%#################*++*****=. .-++++ :**. :###%%%#%%########%####*++++*#######=-:.. -+#%%%###########################++++****#=. .-++ -*+ .######%%%%#########%###@@@%%%%######+...:----:. :*%################################%*+++++*+###- .+ :*+.=########%%%%###########%%%%%%%%######-........:------::.+%%%%%###############%#############%*+++++*.:*##+. . -+####****##%%%%%%%%###%########%%@%#####:.......:::::::...=@@%%%@###############%############%*+++++*. =##+ +#*##*****####%%%%##%%%%#########%@%#####:.....-:....:..::=*=++++############################%#*+++++ -##. =%**********#######%%###############%*#####=...=. . :-=-: .###############%#******####%#####+= +* *#************#############%%#######**+*%####-.- .-:=##############%*********##%#######=: .+. *#****************##**######%%%###*: ::*#####: -:: .-+####%%%####%*********#%##########*-: =#***********************######%*- .--:=:. =. :--: .-=*###%###*********#######*#######+- .#**************************###= .:. ::... .=. +***#%##*******#########***#######+: =##**************************: :-:--. .. .+..... + =******#%#####%##########***#####**# ####**********************+. . :#########+-=:.... -: +***********##%%#***######****##**** .#%####******************- *##########*:....... ...:. #**************##*********###*##**** :#%@%%%###************* =#*******####+....... :-. *#***************%************#%#**** .#**###%%%%%######****#. =#***********#=....:-. :*#****************##*************####* *#**#****#####%%%%##### =#*************+=: .=-::..:-*#*****************##*****************## -#***#*******######%%%%= :=*#**********: ... ##*##%##*******************#******************** .%*****#*********######%. ....:-=*- :++: =#****##%####*************###******************** :. +#*****#**********####%+ ..-*#***#+=##*******##%%###********####********************* .:-:. .%#*****#**********#%%%* :=+**##########******###********#%%%%%%##****###*********************** -- =%#******#*********@#%%-. :#%%%%%%%%%%%%%%###*****###*****#%%##%%%#%@#####************************* =-. .=. ##*******#********#%#**###*+=-:.: -######%##%###%####%%%%%##########%####%%%%##%*************####************ ==== .= :%#*******#********%%***************++#%%#%#######%###%#######%%%%%%%########%%%%####%#************####*********** ==== -: *%#*******#********@#********************#%#######%###%###########%%%%%#####%%%#######%%#**********#####********** :+=+. = .%###*******#******#%#*******************#%#############%##############%%%##%######***####%%#*******######********* */ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include "routers.h" using namespace std; using namespace __gnu_pbds; using ll = long long; using pll = pair<ll, ll>; using vll = vector<ll>; using mll = map<ll, ll>; using sll = set<ll>; using sc = set<char>; typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> cheese; #define printv(v) {for(auto &elem:v){cout<<elem<<" ";}cout<<endl;} #define printg(g) {for(auto &row:g){printv(row)};} #define printm(m) {for(auto &pa:m){cout << pa.first << "," << pa.second << " ";};cout<<endl;} ll min(int a,ll b) { if (a<b) return a; return b; } ll min(ll a,int b) { if (a<b) return a; return b; } ll max(int a,ll b) { if (a>b) return a; return b; } ll max(ll a,int b) { if (a>b) return a; return b; } ll gcd(ll a,ll b) { if (b==0) return a; return gcd(b, a%b); } ll lcm(ll a,ll b) { return a/gcd(a,b)*b; } string to_upper(string a) { for (ll i=0;i<(ll)a.size();++i) if (a[i]>='a' && a[i]<='z') a[i]-='a'-'A'; return a; } string to_lower(string a) { for (ll i=0;i<(ll)a.size();++i) if (a[i]>='A' && a[i]<='Z') a[i]+='a'-'A'; return a; } bool is_prime(ll a) { if(a==1) return false; for(ll i=2;i*i<=a;i++) { if (a%i==0) return false; } return true; } ll binpow(ll a, ll b, ll m) { a %= m; ll res = 1; while (b > 0) { if (b & 1) res = res * a % m; a = a * a % m; b >>= 1; } return res; } ll moddiv(ll numerator,ll denominator, ll mod) { numerator %= mod; denominator %= mod; return numerator * binpow(denominator,mod-2,mod) % mod; } //DSU https://cp-algorithms.com/data_structures/disjoll_set_union.html const ll DSUN = 200000; ll parent[DSUN]; ll set_size[DSUN]; ll find_set(ll v) { if (v == parent[v]) return v; return parent[v] = find_set(parent[v]); } void make_set(ll v) { parent[v] = v; set_size[v] = 1; } void union_sets(ll a, ll b) { a = find_set(a); b = find_set(b); if (a != b) { if (set_size[a] < set_size[b]) swap(a, b); parent[b] = a; set_size[a] += set_size[b]; } } //DSU //https://cp-algorithms.com/algebra/sieve-of-eratosthenes.html vector<char> segmentedSieve(ll L, ll R) { // generate all primes up to sqrt(R) ll lim = sqrt(R); vector<char> mark(lim + 1, false); vector<ll> primes; for (ll i = 2; i <= lim; ++i) { if (!mark[i]) { primes.emplace_back(i); for (ll j = i * i; j <= lim; j += i) mark[j] = true; } } vector<char> isPrime(R - L + 1, true); for (ll i : primes) for (ll j = max(i * i, (L + i - 1) / i * i); j <= R; j += i) isPrime[j - L] = false; if (L == 1) isPrime[0] = false; return isPrime; } //segtree vector<ll> builder(vector<ll> &arr) { //min ll identityelement = INT_MAX; vector<ll> segtree; ll n,segtree_size; n=arr.size(); segtree_size=1; while(segtree_size<n) { segtree_size<<=1; } segtree.assign(2*segtree_size,identityelement); for(ll i=0;i<n;i++) { segtree[segtree_size+i]=arr[i]; } for(ll i=segtree_size-1;i>0;i--) { segtree[i]=min(segtree[i*2],segtree[i*2+1]); } return segtree; } ll query(vector<ll>&segtree,vector<ll>&lazy,ll query_l,ll query_r,ll val,ll node_l,ll node_r,ll node) { // min ll identity_element = INT_MAX; if(lazy[node]!=0) { segtree[node]=lazy[node]; if(node_l!=node_r) { lazy[node*2]=lazy[node]; lazy[node*2+1]=lazy[node]; } lazy[node]=0; } if(val!=-1 && query_l<=node_l && node_r<=query_r) { segtree[node]=val; if(node_l!=node_r) { lazy[node*2]=val; lazy[node*2+1]=val; } lazy[node]=0; } if(query_l<=node_l && node_r<=query_r) { return segtree[node]; } else if(node_r<query_l || query_r<node_l) { return identity_element; } else { ll mid = node_l+(node_r-node_l)/2; ll sum = min(query(segtree,lazy,query_l,query_r,val,node_l,mid,node*2),query(segtree,lazy,query_l,query_r,val,mid+1,node_r,node*2+1)); segtree[node] = min(segtree[node*2],segtree[node*2+1]); return sum; } return 0ll; } //segtree ll kadane(vll &a) { ll ans = a[0], sum = 0; for (ll r = 0; r < a.size(); r++) { sum += a[r]; ans = max(ans, sum); sum = max(sum, 0); } return ans; } vector<bool>sieve(ll n) { vector<bool>ret(n+1,true); ret[0]=false; ret[1]=false; for(ll i=2;i<=n;i++) { if(ret[i]) { for(ll j=i*i;j<=n;j+=i) { ret[j]=false; } } } return ret; } ll mod=998244353; ll arr[200001]; ll solve(string &s) { ll cnt,ret; ret=0; cnt=0; ll pntr=s.size()-1; for(auto ch:s) { if(ch=='1') { ret+=(max(arr[pntr]+(cnt%2 ? -1 : 1),0)+mod)%mod; ret%=mod; cnt+=1; } pntr-=1; } return ret; } // https://www.geeksforgeeks.org/inversion-count-in-array-using-merge-sort/ ll countAndMerge(vector<ll>& arr, ll l, ll m, ll r) { // Counts in two subarrays ll n1 = m - l + 1, n2 = r - m; // Set up two vectors for left and right halves vector<ll> left(n1), right(n2); for (ll i = 0; i < n1; i++) left[i] = arr[i + l]; for (ll j = 0; j < n2; j++) right[j] = arr[m + 1 + j]; // Initialize inversion count (or result) and merge two halves ll res = 0; ll i = 0, j = 0, k = l; while (i < n1 && j < n2) { // No increment in inversion count if left[] has a // smaller or equal element if (left[i] <= right[j]) arr[k++] = left[i++]; // If right is smaller, then it is smaller than n1-i // elements because left[] is sorted else { arr[k++] = right[j++]; res += (n1 - i); } } // Merge remaining elements while (i < n1) arr[k++] = left[i++]; while (j < n2) arr[k++] = right[j++]; return res; } // Function to count inversions in the array ll countInv(vector<ll>& arr, ll l, ll r){ ll res = 0; if (l < r) { ll m = (r + l) / 2; // Recursively count inversions in the left and // right halves res += countInv(arr, l, m); res += countInv(arr, m + 1, r); // Count inversions such that greater element is in // the left half and smaller in the right half res += countAndMerge(arr, l, m, r); } return res; } ll inversionCount(vector<ll> &arr) { ll n = arr.size(); return countInv(arr, 0, n-1); } /* int use_detector(int x) { cout << x << endl; int owo; cin >> owo; return owo; } */ int use_detector(int x); vector<int> find_routers(int l, int n, int q) { vector<long long> owo(n,l); vll min_segtree,lazy; ll min_segtree_size; min_segtree=builder(owo); min_segtree_size=min_segtree.size()/2; lazy.assign(min_segtree_size*2,0); vector<int> indices({0}); int gap,left,right,mid,response,ans; for(int i=1;i<n;i++) { left=indices.back()+1; right=query(min_segtree,lazy,i,n-1,-1,1,min_segtree_size,1); ans=right; while(left<=right) { mid=left+(right-left)/2; response=use_detector(mid); if(response==i) { ans=mid; right=mid-1; } else if(response>i) { right=mid-1; } else { left=mid+1; } query(min_segtree,lazy,response,response,mid,1,min_segtree_size,1); } indices.push_back(2*(ans-1)-indices.back()); } return indices; } /* int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); //vll segtree,lazy; //ll segtree_size; //segtree=builder(arr); //segtree_size=segtree.size()/2; //lazy.assign(segtree_size*2,0); //update: query_sum(segtree,lazy,a,b,c,1,segtree_size,1); //query: cout << query_sum(segtree,lazy,a,b,-1,1,segtree_size,1) << endl; printv(find_routers(6, 3, 10)); } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...