• bzoj1106([POI2007]立方体大作战tet)(树状数组)


    传送门

    首先要看出,对于每一对,其凑到一起所需要的操作次数是中间没被匹配的个数。

    于是想到贪心,每次操作所需次数最小的。

    但其实做法并不需要这么麻烦,只用从左到右扫一遍。

    如果当前数字已经出现过,就统计其中未匹配的个数,同时把这一对标记为“已匹配”,就不会对后面的答案造成影响。

    用树状数组维护即可,第一次出现树状数组中对应位置的权值+1,第二次出现时,累计答案,同时把前面相同的数的位置树状数组里权值-1。

    #include<bits/stdc++.h>
    #define LL long long 
    #define N 50003 
    using namespace std;
    int read()
    {
        int x=0,f=1;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    int n; 
    int c[N*2],a[N*2],vis[N];
    void update(int x,int v)
    {
        while(x<=2*n)//注意二倍 
        {
            c[x]+=v;
            x+=x&(-x);
        }
    }
    int query(int x)
    {
        int ans=0;
        while(x)
        {
            ans+=c[x];
            x-=x&(-x);
        }
        return ans;
    }
    int main()
    {
        n=read();
        for(int i=1;i<=2*n;++i)
          a[i]=read();
        int ans=0; 
        for(int i=1;i<=2*n;++i)
        {
            if(!vis[a[i]])vis[a[i]]=i,update(i,1);
            else 
            {
                ans+=query(i)-query(vis[a[i]]);
                update(vis[a[i]],-1);
            }
        }
        printf("%d
    ",ans);
    } 
    View Code
  • 相关阅读:
    Linux 分区与挂载
    Linux Shell 编程总结
    Java AtomicIntegerFieldUpdater 抽象类
    Java 内部类加载顺序
    Java AtomicIntegerArray 类
    Java AtomicInteger 类
    Java ReentrantLock 类
    Java Runnable 接口
    Java Supplier 接口
    Java Consumer 接口
  • 原文地址:https://www.cnblogs.com/yyys-/p/11528922.html
Copyright © 2020-2023  润新知