hihocoder #1607 : H星人社交网络(双指针)

传送门

题意

分析

可知对与某个数x,设其可发送信息的边界为[L,R],那么随着x的递增,[L,R]也右移,故可对输入数排序,做一次双指针即可

trick

代码

//1. Aj < 1/8 * Ai + 8 或者  
//2. Aj > 8 * Ai + 8 或者  
//3. Ai < 88888 且 Aj > 88888  
/*
i不会给j发消息当且仅当
8*a[j]<a[i]+64
a[j]>8*a[i]+8
a[i]<88888&&a[j]>88888
可行区间
1:9~16
2:9~24
9:10~80
10:10~88
11:10~96
...
16:10~136
17:11~144
11110:1397~88888
11112:1397~88888
88888:11103~88888
88889:88888~100000
100000:88888~100000
*/

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))

int x,sz;
vector<int>v;
int main()
{
    int n;
    cin>>n;
    F(i,1,n)
    {
        scanf("%d",&x);
        v.push_back(x);
    }
    sort(v.begin(),v.end());
    sz=v.size();
    ll ans=0;
    int l=0,r=-1;
    R(i,0,sz)
    {
        while(l<sz&&v[l]*8<v[i]+64) l++;
        while(r+1<n&&v[r+1]<=8*v[i]+8&&(v[i]>=88888||v[r+1]<=88888)) r++;
        ans+=r-l+1;
        if(i>=l&&i<=r) ans--;
    }
    printf("%lld\n",ans );
    return 0;
}

转载于:https://www.cnblogs.com/chendl111/p/7679368.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值