#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int b, n, d, m;
void arbeit1()
{
vector <int> v;
for(int i = 0;i<n;i++)
{
int x;
cin >> x;
v.push_back(x);
}
long long answer = 0;
sort(v.begin(), v.end());
for(int i = 0;i<n-1;i++)
{
if(v[i+1]-v[i]>d) continue;
int l = i + 1, r = n - 1, mid;
while(l+1<r)
{
mid = (l+r)/2;
if(v[mid]-v[i]<=d) l = mid;
else r = mid - 1;
}
if(v[r]-v[i]<=d) answer += r - i;
else answer += l - i;
}
cout << answer << '\n';
}
struct Plane2D
{
int offset;
Plane2D(){}
Plane2D(int offset)
{
this->offset = offset;
}
struct Event
{
int type; //1 -> left square side, point, right square side
int pos, height;
int l, r;
Event(){}
Event(int type, int pos)
{
this->type = type;
this->pos = pos;
}
Event(int type, int pos, int height) : Event(type, pos)
{//offset?
this->height = height;
}
Event(int type, int pos, int l, int r) : Event(type, pos)
{//offset?
this->l = l;
this->r = r;
}
bool operator <(Event other)
{
if(pos!=other.pos) return pos<other.pos;
return type<other.type;
}
};
vector <Event> v;
struct FenwickTree
{
int n;
vector <int> tree;
FenwickTree(){}
FenwickTree(int sz)
{
tree.assign(sz+10, 0);
this->n = sz + 3;
}
void update(int ind, int val)
{
ind++;
while(ind<n)
{
tree[ind] += val;
ind += ind&(-ind);
}
}
int query(int ind)
{
int sum = 0;
ind++;
while(ind>0)
{
sum += tree[ind];
ind -= ind&(-ind);
}
return sum;
}
int query(int l, int r)
{
return query(r) - query(l-1);
}
};
void addPoint(int x, int y)
{
v.push_back(Event(2, x, y+offset));
}
void addSquare(pair <int, int> centre, int side)
{
v.push_back(Event(1, centre.first-side, centre.second-side+offset, centre.second+side+offset));
v.push_back(Event(3, centre.first+side, centre.second-side+offset, centre.second+side+offset));
}
long long process()
{
long long answer = 0;
int maxCoordinate = 0;
for(Event e: v)
{
if(e.type==2) maxCoordinate = max(maxCoordinate, e.height);
}
sort(v.begin(), v.end());
FenwickTree T(maxCoordinate);
for(Event e: v)
{
//cout << e.pos << " ";
if(e.type==1)
{
//cout << e.type << " -- " << e.l << " " << e.r << '\n';
answer -= T.query(e.l, e.r);
}
else if(e.type==2)
{
//cout << e.type << " -- " << e.height << '\n';
T.update(e.height, +1);
}
else if(e.type==3)
{
//cout << e.type << " -- " << e.l << " " << e.r << '\n';
answer += T.query(e.l, e.r);
}
}
return answer;
}
};
void arbeit2()
{
int offset = 0;
vector <pair <int, int>> v;
for(int i = 0;i<n;i++)
{
int x, y;
cin >> x >> y;
v.push_back({x+y, x-y});
if(x-y-d<0) offset = max(offset, -(x-y-d));
}
Plane2D P(offset);
for(pair <int, int> p: v)
{
P.addPoint(p.first, p.second);
P.addSquare(p, d);
}
cout << P.process()/2 << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> b >> n >> d >> m;
if(b==1) arbeit1();
else if(b==2) arbeit2();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
1 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
22 ms |
1408 KB |
Output is correct |
2 |
Correct |
21 ms |
1408 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
29 ms |
1792 KB |
Output is correct |
2 |
Correct |
28 ms |
1792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
30 ms |
1792 KB |
Output is correct |
2 |
Correct |
31 ms |
1792 KB |
Output is correct |
3 |
Correct |
29 ms |
1792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
1024 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
65 ms |
12640 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
71 ms |
12772 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
90 ms |
13156 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
384 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |