結果
問題 | No.404 部分門松列 |
ユーザー |
![]() |
提出日時 | 2016-07-22 23:10:34 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1,500 ms / 2,000 ms |
コード長 | 2,794 bytes |
コンパイル時間 | 2,338 ms |
コンパイル使用メモリ | 173,816 KB |
実行使用メモリ | 139,428 KB |
最終ジャッジ日時 | 2024-06-28 16:57:20 |
合計ジャッジ時間 | 24,340 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 31 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define int long longtypedef vector<int>vint;typedef pair<int,int>pint;typedef vector<pint>vpint;#define rep(i,n) for(int i=0;i<(n);i++)#define reps(i,f,n) for(int i=(f);i<(n);i++)#define all(v) (v).begin(),(v).end()#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)#define pb push_back#define mp make_pair#define fi first#define se secondtemplate<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}struct segtree{static const int SEG=1<<18;vector<vint>dat;segtree():dat(SEG*2){}void init(vint v){for(int i=0;i<v.size();i++)dat[i+SEG-1].pb(v[i]);for(int i=SEG-2;i>=0;i--){if(dat[i*2+1].size()+dat[i*2+2].size()==0)continue;dat[i].resize(dat[i*2+1].size()+dat[i*2+2].size());merge(all(dat[i*2+1]),all(dat[i*2+2]),dat[i].begin());}}int query(int a,int b,int ll,int hh,int k=0,int l=0,int r=SEG){if(r<=a||b<=l)return 0;if(a<=l&&r<=b)return lower_bound(all(dat[k]),hh)-lower_bound(all(dat[k]),ll);return query(a,b,ll,hh,k*2+1,l,(l+r)/2)+query(a,b,ll,hh,k*2+2,(l+r)/2,r);}};struct BIT{int N;vint dat;void init(int n){N=n;dat.resize(n+1);}void add(int k,int x){for(k++;k<=N;k+=k&-k)dat[k]+=x;}int sum(int k){int ret=0;for(k++;k;k-=k&-k)ret+=dat[k];return ret;}};int N;vint A;int Q;int L[222222],H[222222];int acc[777777];int cnt[777777],cnt2[7777777];signed main(){cin>>N;A.resize(N);rep(i,N)cin>>A[i];cin>>Q;rep(i,Q)cin>>L[i]>>H[i];vint as;rep(i,N)as.pb(A[i]);rep(i,Q){L[i]--;as.pb(L[i]);as.pb(H[i]);}sort(all(as));as.erase(unique(all(as)),as.end());rep(i,N)A[i]=lower_bound(all(as),A[i])-as.begin();rep(i,Q){L[i]=lower_bound(all(as),L[i])-as.begin();H[i]=lower_bound(all(as),H[i])-as.begin();}segtree seg;seg.init(A);rep(i,N)cnt[A[i]]++;BIT bit;bit.init(7777777);rep(i,N){int l=seg.query(0,i,0,A[i]);int r=seg.query(i+1,N,0,A[i]);acc[A[i]]+=l*r;l=seg.query(0,i,A[i]+1,1001001001);r=seg.query(i+1,N,A[i]+1,1001001001);acc[A[i]]+=l*r;acc[A[i]]-=bit.sum(A[i]-1);acc[A[i]]-=bit.sum(7777777)-bit.sum(A[i]);int tmp=bit.sum(A[i])-bit.sum(A[i]-1);cnt2[A[i]]++;bit.add(A[i],-tmp+cnt2[A[i]]*(cnt[A[i]]-cnt2[A[i]]));}for(int i=0;i<777777-1;i++)acc[i+1]+=acc[i];for(int i=0;i<Q;i++){printf("%lld\n",acc[H[i]]-acc[L[i]]);}return 0;}