Submission #696635

#TimeUsernameProblemLanguageResultExecution timeMemory
696635bachhoangxuanIzbori (COCI22_izbori)C++17
110 / 110
551 ms26812 KiB
// Judges with GCC >= 12 only needs Ofast // #pragma GCC optimize("O3,no-stack-protector,fast-math,unroll-loops,tree-vectorize") // MLE optimization // #pragma GCC optimize("conserve-stack") // Old judges // #pragma GCC target("sse4.2,popcnt,lzcnt,abm,mmx,fma,bmi,bmi2") // New judges. Test with assert(__builtin_cpu_supports("avx2")); // #pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma,tune=native") // Atcoder // #pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma") #include<bits/stdc++.h> using namespace std; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); uniform_real_distribution<> pp(0.0,1.0); #define int long long #define ld long double #define pii pair<int,int> #define piii pair<int,pii> #define fi first #define se second const int inf=1e9; const int mod=998244353; const int mod2=1e9+7; const int maxn=200005; const int maxq=500005; const int maxl=20; const int maxa=1000005; int power(int a,int n){ int res=1; while(n){ if(n&1) res=res*a%mod; a=a*a%mod;n>>=1; } return res; } namespace Segtree{ int tree[8*maxn],lazy[8*maxn],num[8*maxn]; void getnew(int l,int r,int id,int val,int add){ tree[id]+=val*(r-l+1)+add*(r-l)*(r-l+1)/2; lazy[id]+=val;num[id]+=add; } void pushdown(int l,int r,int id){ if(lazy[id]==0 && num[id]==0) return; int mid=(l+r)>>1; getnew(l,mid,id<<1,lazy[id],num[id]); getnew(mid+1,r,id<<1|1,lazy[id]+num[id]*(mid-l+1),num[id]); lazy[id]=num[id]=0; } void update(int l,int r,int id,int tl,int tr,int val,int add){ if(r<tl || tr<l) return; if(tl<=l && r<=tr){ getnew(l,r,id,val+add*(l-tl),add); return; } pushdown(l,r,id); int mid=(l+r)>>1; update(l,mid,id<<1,tl,tr,val,add);update(mid+1,r,id<<1|1,tl,tr,val,add); tree[id]=tree[id<<1]+tree[id<<1|1]; } int query(int l,int r,int id,int tl,int tr){ if(r<tl || tr<l) return 0; if(tl<=l && r<=tr) return tree[id]; pushdown(l,r,id); int mid=(l+r)>>1; return query(l,mid,id<<1,tl,tr)+query(mid+1,r,id<<1|1,tl,tr); } } int n,ans=0; vector<int> pos[maxn]; vector<pii> com; void solve(int x){ int cur=n-pos[x][0]+1;pos[x].push_back(n+1); Segtree::update(1,2*n,1,cur,n,1,1); Segtree::update(1,2*n,1,n+1,2*n,n-cur+1,0); //cout << x << '\n'; for(int i=0;i<(int)pos[x].size()-1;i++){ ans+=Segtree::query(1,2*n,1,cur-(pos[x][i+1]-pos[x][i])+1,cur); //cout << ans << '\n'; Segtree::update(1,2*n,1,cur-(pos[x][i+1]-pos[x][i])+2,cur+1,1,1); if(cur+2<=2*n) Segtree::update(1,2*n,1,cur+2,2*n,pos[x][i+1]-pos[x][i],0); cur+=2-(pos[x][i+1]-pos[x][i]); } cur=n-pos[x][0]+1; Segtree::update(1,2*n,1,cur,n,-1,-1); Segtree::update(1,2*n,1,n+1,2*n,-(n-cur+1),0); for(int i=0;i<(int)pos[x].size()-1;i++){ Segtree::update(1,2*n,1,cur-(pos[x][i+1]-pos[x][i])+2,cur+1,-1,-1); if(cur+2<=2*n) Segtree::update(1,2*n,1,cur+2,2*n,-pos[x][i+1]+pos[x][i],0); cur+=2-(pos[x][i+1]-pos[x][i]); } } void solve(){ cin >> n; for(int i=1;i<=n;i++){ int a;cin >> a; com.push_back({a,i}); } sort(com.begin(),com.end()); int v=1; for(int i=0;i<n;i++){ if(i>=1 && com[i].first!=com[i-1].first) v++; pos[v].push_back(com[i].second); } for(int i=1;i<=n;i++){ if(!pos[i].empty()) solve(i); } cout << ans << '\n'; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); int test=1;//cin >> test; while(test--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...