bzoj 4994: [Usaco2017 Feb]Why Did the Cow Cross the Road III

xiaoxiao2021-02-28  141

题意:

给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai

题解:

大水题,记录下每个数的第一次出现位置,第一次访问时在其位置加一,第二次减回一,且求区间和,累加就是答案了。 树状数组维护下就好啦。 code:

#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #define LL long long using namespace std; int p[100010],tr[100010],n; LL ans=0; int lowbit(int x){return x&(-x);} void change(int k,int c) { for(int i=k;i<=2*n;i+=lowbit(i)) tr[i]+=c; } int get(int k) { int ans=0; for(int i=k;i>=1;i-=lowbit(i)) ans+=tr[i]; return ans; } int main() { scanf("%d",&n); memset(p,-1,sizeof(p)); for(int i=1;i<=2*n;i++) { int x;scanf("%d",&x); if(p[x]==-1) p[x]=i,change(i,1); else { change(p[x],-1); ans=ans+(LL)(get(i)-get(p[x])); } } printf("%lld",ans); }
转载请注明原文地址: https://www.6miu.com/read-35393.html

最新回复(0)