首页 > 代码库 > hoj Counting the algorithms
hoj Counting the algorithms
贪心加树状数组
给出的数据可能出现两种情况,包含与不包含,但我们从右向左删就能避免这个问题;
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn=200010; int f[maxn],l[maxn],a[maxn]; long long tree[maxn]; int n; inline int lowbit(int x) { return x&(-x); } void add(int pos,int x) { for(int i=pos;i<=2*n;i+=lowbit(i)) tree[i]+=x; } int getsum(int pos) { int sum=0; for(int i=pos;i>0;i-=lowbit(i)) sum+=tree[i]; return sum; } int main() { while(~scanf("%d",&n)) { memset(f,0,sizeof(f)); memset(l,0,sizeof(l)); for(int i=1;i<=2*n;i++) { scanf("%d",&a[i]); f[a[i]]==0?f[a[i]]=i:l[a[i]]=i; add(i,1); } long long ans=0; for(int i=1;i<2*n;i++) { //if(getsum(i)-getsum(i-1)>0) //{ if(f[a[i]]==0) continue; ans=ans+getsum(l[a[i]])-getsum(i-1)-1; add(i,-1); add(l[a[i]],-1); f[a[i]]=0; //} } printf("%lld\n",ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。