zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    scrapy 断点续爬
    Tornado
    python 列表去重的几种方法
    安装Mysql-python报错EnvironmentError: mysql_config not found
    安装setuptools 报错缺少zlib
    微信小程序-if条件渲染
    微信小程序-遍历列表
    微信小程序-数据绑定
    超强过滤器
    如何在tomcat安装部署php项目
  • 原文地址:https://www.cnblogs.com/yyys-/p/11528922.html
Copyright © 2011-2022 走看看