Submission #531735

#TimeUsernameProblemLanguageResultExecution timeMemory
531735errorgornIzbori (COCI22_izbori)C++17
110 / 110
36 ms9032 KiB
//雪花飄飄北風嘯嘯 //天地一片蒼茫 #include <bits/stdc++.h> using namespace std; #define ll long long #define ii pair<int,int> #define iii pair<ii,ll> #define fi first #define se second #define endl '\n' #define debug(x) cout << #x << ": " << x << endl #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front #define lb lower_bound #define ub upper_bound #define rep(x,start,end) for(int x=start;x!=end;x++) #define all(x) (x).begin(),(x).end() #define sz(x) (int)(x).size() #define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> //change less to less_equal for non distinct pbds, but erase will bug mt19937 rng(chrono::system_clock::now().time_since_epoch().count()); int n; ii arr[200005]; ii brr[200005]; int cnt[1<<15]; int af=(1<<15)-1; int delta[200005]; ll solve(vector<int> &v){ if (sz(v)==1) return 1; v.pub(n+1); vector<ii> ranges={ {0,-(v[0]-1)} }; rep(x,0,sz(v)-1){ ranges.pub({ranges.back().se+1,ranges.back().se-(v[x+1]-v[x])+2}); } vector<int> imp={-(int)1e9}; rep(x,0,sz(ranges)) imp.pub(ranges[x].fi),imp.pub(ranges[x].fi-1); sort(all(imp)); imp.erase(unique(all(imp)),imp.end()); rep(x,1,sz(imp)) delta[x]=0; //for (auto it:ranges) cout<<it.fi<<"_"<<it.se<<" "; cout<<endl; int pos=find(all(imp),ranges[0].fi)-imp.begin()-1; int curr=0; ll res=0; for (auto it:ranges){ curr+=delta[pos]; pos++; while (true){ res+=curr; delta[pos]++; if (imp[pos-1]<it.se) break; pos--; curr-=delta[pos]; } } //cout<<res<<endl; return res; } void read(int &x){ x=0; char ch=getchar_unlocked(); while (ch&16) x=x*10+(ch&15),ch=getchar_unlocked(); } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin.exceptions(ios::badbit | ios::failbit); read(n); rep(x,0,n) read(arr[x].fi),arr[x].se=x+1; rep(x,0,n) cnt[arr[x].fi&af]++; rep(x,1,32768) cnt[x]+=cnt[x-1]; for (int x=n-1;x>=0;x--) brr[--cnt[arr[x].fi&af]]=arr[x]; memset(cnt,0,sizeof(cnt)); rep(x,0,n) cnt[(brr[x].fi>>15)&af]++; rep(x,1,32768) cnt[x]+=cnt[x-1]; for (int x=n-1;x>=0;x--) arr[--cnt[(brr[x].fi>>15)&af]]=brr[x]; ll ans=0; int curr=0; vector<int> pos; while (curr<n){ int nxt=curr+1; while (arr[curr].fi==arr[nxt].fi) nxt++; pos.clear(); rep(x,curr,nxt) pos.pub(arr[x].se); ans+=solve(pos); curr=nxt; } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...