codeforces1166C - A Tale of Two Lands

传送
题目大意:给定一个序列 ,在序列中找两个数x,y,使得|x-y|,|x+y| 在数轴中覆盖掉|x|,|y|, 问该序列中有多少对这种数。
方法:尺取法
正负无关,先排序,然后尺取的时候,注意ans加的是尺取出来的子序列的长度

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<cmath>
#include<algorithm>
#define ll long long
#define plr cout<<"l: "<<l<<" r:"<<r<<endl;
#define f(i,n) for(int i=1;i<=n;i++)
#define p(x) cout<<x<<" ";
#define pn cout<<endl;
using namespace std;
ll a[2*100000+100];
int main()
{
	int n;
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++)
	{
		scanf("%I64d",&a[i]);
		a[i]=abs(a[i]);
	}
	sort(a+1,a+1+n);
	//f(i,n) p(a[i]) pn
	int l=1,r=1;
	ll ans=0;
	int sum=0;
	
	while(r<=n)
	{
		if(a[r]-a[l]<=a[l])
		{
			ans+=r-l;
			r++;
		}
		else
		{
			l++;
		}
		
	}
	cout<<ans<<endl;
	return 0;
}```






>2021/4/9更新代码
```cpp
#include <iostream>
#include<bits/stdc++.h>
#define ll long long

using namespace std;
ll a[2*100100];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        a[i]=abs(a[i]);
    }
    sort(a+1,a+1+n);
    int l=1,r=2;
    ll ans=0;
    while(1)
    {
        while(r<=n && a[r]-a[l]<=a[l])
            r++;
        ans+=r-l-1;
        if(l>=n)    //注意这里是>=  因为r已经是n+1号位置,l必须小于r,否则l=n+1时,上一条更新语句就会变成r-l-1=-1
            break;
        l++;
    }
    cout<<ans<<endl;
    return 0;
}


 
posted @ 2020-07-09 08:56  DuJunlong  阅读(5)  评论(0编辑  收藏  举报  来源