hdu 4217 Data Structure

http://blog.ac521.org/?p=209

题意:给你一个N,K;然后又有K个数i;表示从1,2,3…N个数 经过K次操作,每次操作是去掉第i小的数。求所有去掉数的之和;

思路:用线段树写的,具体看代码吧

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=272144;
int tree[maxn<<2];
int pos;
void build(int l,int r, int rt)
{
    tree[rt]=r-l+1;
    if(l==r) return ;
    int m = ( l + r ) >> 1;
    build( l , m , rt << 1 );
    build( m+1 , r , rt << 1 | 1 );
}
void update(int p,int l,int r, int rt)
{
    tree[rt]--;
    if(l == r)
    {
        pos = l;
        return ;
    }
    int m = ( l +  r ) >> 1;
    if(tree[rt << 1] >= p)
        update( p , l , m , rt<<1 );
    else
    {
        p -= tree[rt << 1];
        update(p,m+1,r,rt << 1 | 1);
    }
}
int main()
{
    int t,n,k,ki;
    __int64 sum;
    scanf("%d",&t);
    for(int T=1;T<=t;T++)
    {
        sum=0;
        scanf("%d%d",&n,&k);
        build(1,n,1);
        for(int i=1;i<=k;i++)
        {
            scanf("%d",&ki);
            update(ki,1,n,1);
            sum+=pos;
        }
        printf("Case %d: %I64d\n",T,sum);
    }
}
原文地址:https://www.cnblogs.com/AkQuan/p/2456895.html