luoguのP4065 [JXOI2017]色

タイトル説明

乏しい長配列Aiがあるnは正の整数、同じ色を表す、請求同じ正の整数です。

今、このシーケンスは長すぎるので、彼女はこれらの色のすべての位置にいくつかの色を選択することを決めていることが悪い感じが削除されます。

色を削除iはAjと= Jの位置が配列から削除されているIを満たす全てとして定義することができます。

彼女はカラースキームは、最後に残っている非空のシーケンスを行い、継続的にどのように多くの削除を知りたいので、しかし、いくつかの段落にシーケンス全体を削除するには、いくつかの時間後に、貧しい人々は、それが好きではありません。

例えば、カラー・シーケンス{1、2、3、4、5}、3 {1,2}及び{4,5}二つに色配列を除去、条件が満たされていません。1色が削除シーケンス{2、3、4、5}となるが、条件を満たしています。

少なくとも一つの色がある場合にのみ、二つの異なる解決策があれば、私は、一の実施形態では省略されています。

入力形式

第一の入力線Tは、データセットの整数を表します。nは整数であり、各データ入力の最初の行は、列の長さの数を表します。入力nは整数の2行目は、色シーケンスに記載しました。

出力フォーマット

各出力データのための整数回答を表します。


各色のランド()同色0の全ての和そのような値のために

同一の値が0の値を引くことができ、左が現れ見つけるために地図プレフィックスとメンテナンス、

#include<map>
#include<ctime>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int N=3e5+10;
inline ll read(ll x=0){
    char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while('0'<=c&&c<='9'){  x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }
    return x;
}
#define Rand() (((ll)rand())<<1)-RAND_MAX
ll n,a[N],Max[N],sum[N];
map<ll,int>vis;
signed main(){
    srand(time(0)); 
    register int i;
    register ll op,qz,ans;
    for(int T=read();T;T--){
        n=read(); 
        for(i=1;i<=n;i++)a[i]=read(),Max[a[i]]=i;
        qz=0,ans=0; vis[qz]=1;
        for(i=1;i<=n;i++){
            op= (Max[a[i]]^i) ? Rand() : -sum[a[i]];
            sum[a[i]]+=op; qz+=op;
            ans+=vis[qz]; vis[qz]++;
        }
        printf("%lld\n",ans);
        vis.clear();
        memset(Max,0,sizeof(Max));
        memset(sum,0,sizeof(sum));
    }
    return 0;
}
}

おすすめ

転載: www.cnblogs.com/naruto-mzx/p/12001437.html
おすすめ