ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF173E

2022-06-11 14:36:34  阅读:140  来源: 互联网

标签:int max age CF173E 三元组 ans now


独立想+写出来了,纪念一下。

思路:

离线线段树做法。

注意到,如果 \(i\) 成为了队长,他的队伍里必然包含了所有 \(r\leq r_i\) 且年龄差小于 \(k\) 的人,因为队员之间是没有限制的。

首先发现,对于一组 \(x\),\(y\) 的询问,对于任意 \(i\) 满足 \(r_i\geq\max(r_x,r_y)\) 且 \(a_i\) 在 \([a_x-k,a_x+k]\) 交 \([a_y-k,a_y+k]\) ,\(i\) 就可能成为队长,很显然,\(i\) 作为队长的队伍中必然包含了 \(x\) 和 \(y\)。

可以考虑求得任意 \(i\) 作为队长时队伍中的人数,转化为一个经典的二维偏序问题,按 \(r\) 排序后,动态开点值域线段树维护即可,记为 \(p_i\)。

sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
	add(root,1,2e9+10,a[i].age,1);
    if(i!=1&&a[i].res!=a[i-1].res)
    {
    	add(root,1,2e9+10,a[i].age,-1);
        while(lst<=i-1)
        {
        	p[lst]=sum(root,1,2e9+10,a[lst].age-k,a[lst].age+k);
            lst++;
		}
        add(root,1,2e9+10,a[i].age,1);
    }
}
while(lst<=n)
{
	p[lst]=sum(root,1,2e9+10,a[lst].age-k,a[lst].age+k);
    lst++;
}

随后问题转化就为了,就是给定了 \(n\) 个三元组,形如 \((r,a,p)\),求所有满足 \(r\geq k\) 且 \(a\) 属于 \([l,r]\) 的三元组的 \(p\) 的最大值,其中的 \(k\),\(l\),\(r\) 都是与询问的 \(x\),\(y\) 有关的,不多赘述。

这个问题显然可以按 \(k\) 排序,由于三元组已经按 \(r\) 排序,那么就消除了第一个限制,考虑在 \(a\) 处插入一个 \(p\) 然后取 \(\max\),动态开点值域线段树维护即可。

for(int i=1;i<=n;i++) 
{
    now[a[i].id]=i;
}
int q;cin>>q;
for(int i=1;i<=q;i++)
{
    int x,y;cin>>x>>y;
    x=now[x],y=now[y];
    Q[i]=(node1){x,y,max(a[x].res,a[y].res),i};
}
sort(Q+1,Q+1+q,cmp1);
int j=n;tot=0,root=0;
memset(t,0,sizeof(t));
for(int i=1;i<=q;i++)
{
    while(a[j].res>=Q[i].p&&j>0)
    {
        add1(root,1,2e9+10,a[j].age,p[j]);
        j--;
    }
    int x=Q[i].x,y=Q[i].y;
    int ans=-1;
    if(abs(a[x].age-a[y].age)<=k)
    {
        if(a[x].res==a[y].res)
        {
            ans=max(p[x],p[y]);
        }
        else if(a[x].res>a[y].res) ans=p[x];
        else ans=p[y];
    }
    int mi=min(a[x].age,a[y].age),mx=max(a[x].age,a[y].age);
    in now=get((in){max(0ll,mi-k),mi+k},(in){max(0ll,mx-k),mx+k});
    if(now.l!=-1)
    {
        ans=max(ans,query(root,1,2e9+10,now.l,now.r));
    }
    re[Q[i].id]=ans;
}

标签:int,max,age,CF173E,三元组,ans,now
来源: https://www.cnblogs.com/blog-WHY/p/16365813.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有