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;
}