1745:グループ

制限時間:1000msのメモリ制限:262144キロバイト

[タイトル]説明

コミュニティのn住民は、各居住者は私個人の年齢を表し愛、里は私の個人的な位置を表し、特定の状況や年齢を持っています。

最近、コミュニティは船長以下の条件を満たしているになるために、チームのキャプテンを持っている必要があり、チームに何人かの人を必要とする、イベントを開催します

グループのキャプテン位置が最も高く(最初のために接続することができます)でなければなりません①、;

②年齢ギャップとKを超えることができないグループの他のメンバーの年齢の船長

一部の人々は、より良いの人々のグループしばらくどこ希望、同じグループの人の近いグループを所有したいと思います。

たとえば、xとyはもちろん、彼らが望む人々のグループ、より良い、一方で、同じグループになりたいです。彼らはまた、あなたは人々の最大数を設定することができ、xとy基の両方を含めるように頼む、キャプテン会う上記の基準を選択する必要がありますか?[入力] 二つの整数nおよびKの最初の行 入力されたn個の整数の次の行:R1、R2、···、RN 。A1、A2、...、:入力n個の整数の次の行 。今、Qは、お問い合わせのQを表して入力します。次Q線各入力x、yは、尋ねる発現:ときに、XおよびYは、同じグループに設定されている、彼らはチームの人々の最大数を有することができる(xおよびyはまた、そうであれば条件を満たすように、キャプテンとして選択されるべきです)。[出力] 各お問い合わせについては、対応する出力答え、ラインあたり各回答。X場合とにyが同じ年齢の出力1に設定することができない場合(たとえば、xは1であり、yは100の年齢であり、K = 1は、船長、XおよびYの両方として機能関係なく、常に船長より誰か古いありますKは、出力上ギャップ-1)。[サンプル]入力。5. 1 。1 5 1 4 2
 
























2 4 3 2 4
4。
5 3
2 3
2 5
4 1。

[]出力例

4。
3
-1
4。

[注]

[説明]サンプル

質問1:5第一人がグループを望んでいる第三の個人、グループ{1,3,4,5}はキャプテン3を選択したメンバーとすることができ、そしてそれは2歳との間の隙間2,2及び5を添加したため、図2は、K = 1より、添加することができません。

問い合わせ2:第二及び第三の個人がセットにたい場合、{1,2,3}が選択されてもよいです。

回答3:2と5を一緒にする場合、要件を満たすことができません。

{1,3,4,5}を選択してもよい、1と一緒になって4に望んでいた:4尋ねます。

[データ]スケール

2≤n≤100,0≤k≤100,1≤ri、ai≤100,1≤q≤100:20%のためのデータ。

2≤n≤1000,0≤k≤1000,1≤ri、ai≤1000,1≤q≤1000:データの40%を。

データの60%:2≤n≤\(10 ^ {4 } \)、0≤k≤\(10 ^ {9} \)、1≤ri、ai≤\(10 ^ {9} \)、 1≤q≤\(10 ^ {4} \)。

データの100%に:2≤n≤\(10 ^ {5 } \)、0≤k≤\(10 ^ {9} \)、1≤ri、ai≤\(10 ^ {9} \)、 1≤q≤\(10 ^ {5} \)、1≤x、y≤n、X≠Y。

[説明]

 

多くの場合、確かに、その後、選択可能なリーダーシップの人々の最大数を取り、指導者として一人一人で前処理することができるどのように多くの人々に求められます。

 

数が多い順に2人の最大値を求めることで、オフラインの状態を依頼することが推奨され、すべての人々の状況を照会する前に、各時間は、各クエリの年齢をすることができ、ツリーラインにプレス安全性の最大歳以上です。

 

考虑如何预处理每个人可以带多少人,将每个人按地位升序排序,则在他及他之前的人在年龄范围内都可以被带。

 

每扫到一个人,先把他和和他地位相同的人全部压入线段树中,再查询年龄区间内人数。

 

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+5;
map <int,int> dui;
int n,k,cnt,q,sh[N<<2],mx[N<<2],cou[N];
struct lisan
{
    int zhi,id;
}ls[N<<2];
struct people
{
    int r,a,id,dair;
}p[N];
struct xunwen
{
    int x,y,id,di,xs,ys;
}wen[N];
inline bool cmp(lisan x,lisan y)
{
    return x.zhi<y.zhi;
}
inline int read()
{
    char c=getchar();
    int x=0;
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return x;
}
//-------------树状数组---------------------// 
inline int lowbit(int x)
{
    return x& (-x);
}
inline void update(int x,int val)
{
    for(int i=x;i<=cnt;i+=lowbit(i)) sh[i]+=val;
}
inline int query(int x)
{
    int daan=0;
    if(x<=0) return 0;
    for(int i=x;i;i-=lowbit(i)) daan+=sh[i];
    return daan;
}
//----------------------------------//
inline void lisanlisan()
{
    sort(ls+1,ls+3*n+1,cmp);
    dui[ls[1].zhi]=++cnt;
    if(ls[1].id) p[ls[1].id].a=ls[1].zhi;
    for(int i=2;i<=n*3;i++)
    {
        if(ls[i].zhi!=ls[i-1].zhi) dui[ls[i].zhi]=++cnt;
        if(ls[i].id)
            p[ls[i].id].a=ls[i].zhi;
    }
}
inline bool cmp1(people x,people y)
{
    return x.r<y.r;
}
inline void get_meiren()
{
    sort(p+1,p+n+1,cmp1);
    int pre=1;
    for(int i=2;i<=n+1;i++)
    {
        if(p[i].r!=p[i-1].r)
        {
            for(int j=pre;j<=i-1;j++)
                update(dui[p[j].a],1);
            for(int j=pre;j<=i-1;j++)
                p[j].dair=query(dui[p[j].a+k])-query(dui[p[j].a-k]-1);
            pre=i;
        }
    }
}
inline bool cmp2(xunwen x,xunwen y)
{
    return x.di>y.di;
}
inline void modify(int now,int l,int r,int x,int zhi)
{
    if(l==r)
    {
        mx[now]=max(mx[now],zhi);
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid) modify(now<<1,l,mid,x,zhi);
    else modify(now<<1|1,mid+1,r,x,zhi);
    mx[now]=max(mx[now<<1],mx[now<<1|1]);
}
inline int cha(int now,int l,int r,int L,int R)
{
    if(L>R) return 0;
    if(l>=L&&r<=R) return mx[now];
    int mid=(l+r)>>1,daan=0;
    if(L<=mid) daan=cha(now<<1,l,mid,L,R);
    if(R>=mid+1) daan=max(daan,cha(now<<1|1,mid+1,r,L,R));
    return daan;
}
inline void solve()
{
    int dao=n;
    sort(wen+1,wen+q+1,cmp2);
    for(int i=1;i<=q;i++)
    {
        while(dao&&p[dao].r>=wen[i].di)
        {
            modify(1,1,cnt,dui[p[dao].a],p[dao].dair);
            dao--;
        }
        int ans=cha(1,1,cnt,dui[max((int)0,max(wen[i].xs,wen[i].ys)-k)],dui[min(wen[i].xs,wen[i].ys)+k]);
        if(ans==0) cou[wen[i].id]=-1;
        else cou[wen[i].id]=ans;
    }
}
signed main()
{
    n=read();k=read();
    for(int i=1;i<=n;i++) p[i].r=read(),p[i].id=i;
    for(int i=1;i<=n;i++) ls[i].zhi=read(),ls[i].id=i,ls[i+n].zhi=ls[i].zhi+k,ls[i+n+n].zhi=max((int)0,ls[i].zhi-k);
    lisanlisan();
    q=read();
    for(int i=1;i<=q;i++) wen[i].id=i,wen[i].x=read(),wen[i].y=read(),wen[i].di=max(p[wen[i].x].r,p[wen[i].y].r),wen[i].xs=p[wen[i].x].a,wen[i].ys=p[wen[i].y].a;
    get_meiren();
    solve();
    for(int i=1;i<=q;i++) cout<<cou[i]<<"\n";
    return 0;
}
View Code

おすすめ

転載: www.cnblogs.com/betablewaloot/p/12173897.html