7.20T1

ソート(並べ替え)
[問題の説明]
小さなA.の前に立って順番にn個の個人があります。小さなターンこれは、m個の個々の動作をnとします。
各操作は、位置kを選択するために、すべてのこれらのN個の個々の高さは、現在の位置kに等しい未満であります
ランクから引き出され、その後、挿入するために、左から右へ順にローからハイへの上昇をたどる人の身長
元の位置の間でこれらの人々。
これらのN個の個々の高さの小さな逆シーケンスが非常に興味を持って構成されています。小さなは今、すべてを知りたいです
操作の逆の順序の後の数値。
[入力形式]
二つの整数n及びmの最初の行、およびオペランドの数を表します。
次の行nは整数AIは、左から右に一人一人の身長の初期状態を表しています。
次に、各m行の数は、kがこの操作を表します。
[出力形式]
出力コモン線m + 1は、ライン1が逆ないときの動作での数を表します。
最初のi行以外は、I-1は、逆の操作後の対数配列を表します。
[サンプル入力]
6 2
160 163 164 161 167 160
2
3
[サンプル出力]
6
3
1
サンプル[解説]
初めて160163161160を持ち出し
160 160,164,161,167,163の動作シーケンスの後
第二は、160,160,164,161,163を持ち出し
動作のシーケンスは、160 160,160,161,167,163た後
[データ範囲]
データの30%を、N、m≤500
データの60%を、N、m≤1000
100%のデータ、N、m≤300000,1≤k≤n,,1≤ai≤10^ 9
 
ゾル:ファンシー配信ポイント、彼らは答えには影響しないので、おそらく現在のサイズの前に、我々は、コントロールを持っていません
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
inline ll read()
{
    ll s=0; bool f=0; char ch=' ';
    while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
    while(isdigit(ch)) {s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0) {putchar('-'); x=-x;}
    if(x<10) {putchar(x+'0'); return;}
    write(x/10); putchar((x%10)+'0');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll N=300005;
ll n,m;
struct Node
{
    ll id,num,val;
}a[N];
inline bool cmpnum(Node a,Node b){return a.num<b.num;}
inline bool cmpid(Node a,Node b){return a.id<b.id;}
struct BIT
{
    ll S[N<<1];
    #define lowbit(x) ((x)&(-x))
    inline void Ins(int x,int v)
    {
        while(x<=n)
        {
            S[x]+=v; x+=lowbit(x);
        }
    }
    inline int Que(int x)
    {
        ll ans=0;
        while(x>0)
        {
            ans+=S[x]; x-=lowbit(x);
        }
        return ans;
    }
}T,BT;
signed main()
{
    freopen("sort.in","r",stdin);
    freopen("sort.out","w",stdout);
    ll i,cv=0,ans=0,now=0,oo;
    R(n); R(m);
    for(i=1;i<=n;i++) R(a[a[i].id=i].num);
    sort(a+1,a+n+1,cmpnum);
    a[1].val=++cv;
    for(i=2;i<=n;i++)
    {
        if(a[i].num==a[i-1].num) a[i].val=cv; else a[i].val=++cv;
    }
    sort(a+1,a+n+1,cmpid);
    for(i=n;i>=1;i--)
    {
        ans+=(oo=T.Que(a[i].val-1));
        BT.Ins(a[i].val,oo);
        T.Ins(a[i].val,1);
    }
    Wl(ans);
    for(i=1;i<=m;i++)
    {
        ll pos; R(pos);
        if(now<a[pos].val)
        {
            ans-=(BT.Que(a[pos].val)-BT.Que(now)); now=a[pos].val;
        }
        Wl(ans);
    }
    return 0;
}
/*
input
6 2
160 163 164 161 167 160
2
3
output
6
3
1
*/
View Code

 

おすすめ

転載: www.cnblogs.com/gaojunonly1/p/11222279.html