Submission #531766

#TimeUsernameProblemLanguageResultExecution timeMemory
531766zaneyuIzbori (COCI22_izbori)C++14
110 / 110
54 ms16380 KiB
/*input 5 2 2 1 2 3 */ #include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; //#pragma GCC optimize("unroll-loops,no-stack-protector") //order_of_key #of elements less than x // find_by_order kth element using ll = long long; using ld = long double; using pii = pair<int,int>; typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set; #define f first #define s second #define pb push_back #define REP(i,n) for(int i=0;i<n;i++) #define REP1(i,n) for(int i=1;i<=n;i++) #define FILL(n,x) memset(n,x,sizeof(n)) #define ALL(_a) _a.begin(),_a.end() #define sz(x) (int)x.size() #define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end())))) #define MP make_pair const ll INF64=4e17; const int INF=0x3f3f3f3f; const ll MOD=1e9+7; const ld PI=acos(-1); const ld eps=1e-9; #define lowb(x) x&(-x) #define MNTO(x,y) x=min(x,(__typeof__(x))y) #define MXTO(x,y) x=max(x,(__typeof__(x))y) template<typename T1,typename T2> ostream& operator<<(ostream& out,pair<T1,T2> P){ out<<P.f<<' '<<P.s; return out; } template<typename T> ostream& operator<<(ostream& out,vector<T> V){ REP(i,sz(V)) out<<V[i]+1<<((i!=sz(V)-1)?" ":""); return out; } ll mult(ll a,ll b){ return ((a%MOD)*(b%MOD))%MOD; } ll mypow(ll a,ll b){ if(b<=0) return 1; ll res=1LL; while(b){ if(b&1) res=mult(res,a); a=mult(a,a); b>>=1; } return res; } const int maxn=2e5+5; int arr[maxn],tmp[maxn]; pii a[maxn],b[maxn]; vector<pii> v[maxn]; int mp[2*maxn],pos[2*maxn]; int C; void read(int &x){ x=0; char ch=getchar_unlocked(); while(ch&16) x=(x<<3)+(x<<1)+(ch&15),ch=getchar_unlocked(); } inline void add(int x){ if(pos[x]!=C){ mp[x]=0,pos[x]=C; } mp[x]++; } inline int get(int x){ if(pos[x]!=C) return 0; return mp[x]; } int cnt[32768]; const int H1 = (1 << 15) - 1; int main(){ ios::sync_with_stdio(false),cin.tie(0); int n; read(n); REP(i,n) read(arr[i]),a[i].f=arr[i],a[i].s=i; memset(cnt, 0, sizeof(cnt)); for(int i = 0;i < n;i++) cnt[a[i].f&H1]++; for(int i = 1;i <= H1;i++) cnt[i] += cnt[i-1]; for(int i = n-1;i >= 0;i--) b[--cnt[a[i].f&H1]] = a[i]; memset(cnt, 0, sizeof(cnt)); for(int i = 0;i < n;i++) cnt[b[i].f >> 15]++; for(int i = 1;i <= H1;i++) cnt[i] += cnt[i-1]; for(int i = n-1;i >= 0;i--) a[--cnt[b[i].f >> 15]] = b[i]; int cntt=0; REP(i,n){ if(i and arr[a[i].s]!=arr[a[i-1].s]) ++cntt; tmp[a[i].s]=cntt; } ++cntt; REP(i,n) arr[i]=tmp[i]; for(int i=0;i<n;){ int p=i; while(i<n and arr[i]==arr[p]) ++i; v[arr[p]].pb({p,i}); } ll ans=0; REP(i,cntt){ int pv=0; int cur=n,mn=n,tot=0,up=n; v[i].pb({n,n}); C=i; add(cur); for(auto x:v[i]){ int z=x.f-pv; if(z){ while(cur-1>mn and z){ cur--; tot-=get(cur); ans+=tot; --z; } if(z){ tot=0,cur-=z,mn=cur; } add(cur); } for(int j=x.f;j<x.s;j++){ ++cur; tot+=get(cur-1); ans+=tot; if(j!=x.s-1) add(cur); else if(cur>=up) add(cur); if(cur<up) add(cur); MXTO(up,cur); } pv=x.s; } } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...