Submission #1213709

#TimeUsernameProblemLanguageResultExecution timeMemory
1213709hengliaoComparing Plants (IOI20_plants)C++20
11 / 100
4099 ms193656 KiB
#include "plants.h" #include<bits/stdc++.h> using namespace std; #define F first #define S second #define pb push_back #define vll vector<ll> #define pll pair<ll, ll> typedef int ll; namespace{ const ll mxN=5005; // warning ll n, k; vll adj[mxN]; ll ans[mxN][mxN]; bool done[mxN]; ll val[mxN]; bool visited[mxN]; void dfs(ll cur){ if(visited[cur]) return; visited[cur]=1; for(auto &it:adj[cur]){ dfs(it); } } } void init(int K, vector<int> a) { memset(done, 0, sizeof(done)); memset(ans, 0, sizeof(ans)); n=a.size(); k=K; auto update=[&](ll lef, ll rig, ll val){ for(ll i=lef;i<=rig;i++){ a[i]+=val; } }; // if(2*k>n){ // for(ll i=n-1;i>=0;i--){ // vll tep; // for(ll j=0;j<n;j++){ // if(!done[j] && a[j]==0){ // tep.pb(j); // } // } // ll dumb=0; // if((ll) tep.size()==1){ // dumb=tep[0]; // } // else{ // for(ll j=0;j<(ll) tep.size();j++){ // ll pre=(j-1+(ll) tep.size())%((ll) tep.size()); // if(((tep[j]-tep[pre]+n)%n)>=k){ // dumb=tep[j]; // break; // } // } // } // val[dumb]=i; // done[dumb]=1; // ll lef=(dumb-k+1+n)%n; // ll rig=(dumb-1+n)%n; // if(lef>rig){ // update(lef, n-1, -1); // update(0, rig, -1); // } // else{ // update(lef, rig, -1); // } // } // return; // // for(ll i=0;i<n;i++){ // // cout<<val[i]<<' '; // // } // // cout<<'\n'; // } auto check=[&](ll tar){ if(a[tar]>0) return false; if(done[tar]) return false; ll cur=tar; for(ll i=0;i<k-1;i++){ cur--; if(cur<0) cur+=n; if(done[cur]) continue; if(a[cur]==0) return false; } return true; }; for(ll rep=0;rep<n;rep++){ ll cur=-1; for(ll tar=0;tar<n;tar++){ if(check(tar)){ cur=tar; break; } } done[cur]=1; for(ll i=1;i<k;i++){ ll cur2=(cur+i)%n; if(done[cur2]) continue; adj[cur].pb(cur2); } for(ll i=1;i<k;i++){ ll cur2=(cur-i+n)%n; if(done[cur2]) continue; a[cur2]--; adj[cur].pb(cur2); } } for(ll i=0;i<n;i++){ memset(visited, 0, sizeof(visited)); dfs(i); for(ll j=0;j<n;j++){ if(visited[j]){ ans[i][j]=1; ans[j][i]=-1; } } } } int compare_plants(int x, int y) { // if(2*k>n){ // if(val[x]>val[y]) return 1; // return -1; // } return (int) ans[x][y]; }
#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...