當前位置:
首頁 >
[ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)
發布時間:2025/6/17
36
豆豆
生活随笔
收集整理的這篇文章主要介紹了
[ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
\(\\\)
\(Description\)
給定長度為\(2N\)的序列,\(1\text ~N\)各出現過\(2\)次,\(i\)第一次出現位置記為\(a_i\),第二次記為\(b_i\),求滿足\(a_i<a_j<b_i<b_j\)的\((i,j)\)對數。
- \(N\in [1,10^5]\)
\(\\\)
\(Solution\)
考慮以一個數作為\(i\)出現在答案里,對應的\(j\)應滿足\(a_j\in (a_i,b_i),b_j>b_i\)。也就是說,我們需要對每一個數統計它兩次出現的位置構成的區間里,有多少個數字是第一次出現。
考慮樹狀數組的做法,第一次遇到一個數時,在出現位置打標記,記錄下這個數第一次出現的位置,便于詢問。
當第二次遇到這個數時,直接查詢區間\((a_i,b_i)\)的區間和即可。因為這個數已經出現了兩次,不能對后續的詢問做出貢獻了,所以要將之前的打標記處撤銷標記。
\(\\\)
\(Code\)
#include<map> #include<cmath> #include<cstdio> #include<cctype> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 50010 #define R register #define gc getchar using namespace std;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x; }int n,ans,p[N];struct BIT{int c[N];inline int lowbit(int x){return x&-x;}inline void add(int p,int x){for(;p<=n;p+=lowbit(p))c[p]+=x;}inline int sum(int p){int res=0;for(;p;p-=lowbit(p)) res+=c[p];return res;} }bit;int main(){n=rd()<<1;for(R int i=1,x;i<=n;++i){x=rd();if(!p[x]) bit.add((p[x]=i),1);else ans+=bit.sum(i)-bit.sum(p[x]),bit.add(p[x],-1);}printf("%d\n",ans);return 0; }
轉載于:https://www.cnblogs.com/SGCollin/p/9740980.html
總結
以上是生活随笔為你收集整理的[ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (数论)51NOD 1135 原根
- 下一篇: 【BZOJ1294】[SCOI2009]