#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
struct fenwick{
vector<int> bit;
void build(int n){
bit.assign(n+1,0);
}
void update(int i,int x){
for(;i<bit.size();i+=(i&(-i))){
bit[i]+=x;
}
}
int query(int i){
int curr=0;
for(;i;i-=(i&(-i))){
curr+=bit[i];
}
return curr;
}
int range(int l,int r){
l=max(l,1);
r=min(r,(int)bit.size()-1);
if(l>r){
return 0;
}
return (query(r)-query(l-1));
}
};
struct presum{
int pre[151][151];
void build(vector<pair<int,int>> v){
memset(pre,0,sizeof(pre));
for(int i=0;i<v.size();i++){
assert(1<=v[i].first&&v[i].first<=150);
assert(1<=v[i].second&&v[i].second<=150);
pre[v[i].first][v[i].second]++;
}
for(int i=1;i<=150;i++){
for(int j=1;j<=150;j++){
pre[i][j]=(pre[i][j]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]);
}
}
}
int query(int x,int y){
if(x<=0||y<=0){
return 0;
}
x=min(x,150),y=min(y,150);
return pre[x][y];
}
int range(int x1,int y1,int x2,int y2){
return (query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1));
}
};
signed main(){
if(fopen("input.txt","r")){
freopen("input.txt","r",stdin);
}
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int b,n,d,m;
cin >> b >> n >> d >> m;
if(b==1){
vector<int> v(n);
for(int i=0;i<n;i++){
cin >> v[i];
}
sort(v.begin(),v.end());
int ptr=-1;
ll ans=0;
for(int i=0;i<n;i++){
while(ptr+1<i&&v[i]-v[ptr+1]>d){
ptr++;
}
ans+=(i-1-ptr);
}
cout << ans << endl;
return 0;
}
if(b==2){
vector<pair<int,int>> v(n);
for(int i=0;i<n;i++){
cin >> v[i].first >> v[i].second;
v[i]={v[i].first-v[i].second,v[i].first+v[i].second};
}
fenwick bit;
bit.build(2*m);
sort(v.begin(),v.end());
int ptr=-1;
ll ans=0;
for(int i=0;i<n;i++){
while(ptr+1<n&&v[i].first-v[ptr+1].first>d){
ptr++;
bit.update(v[ptr].second,-1);
}
ans+=bit.range(v[i].second-d,v[i].second+d);
bit.update(v[i].second,1);
}
cout << ans << endl;
return 0;
}
ll ans=0;
vector<vector<pair<int,int>>> group(m+1);
for(int i=0;i<n;i++){
int x,y,z;
cin >> x >> y >> z;
group[z].push_back({x-y+m,x+y});
}
presum pre[m+1];
for(int i=1;i<=m;i++){
vector<pair<int,int>> v=group[i];
fenwick bit;
bit.build(2*m);
sort(v.begin(),v.end());
int ptr=-1;
n=v.size();
for(int i=0;i<n;i++){
while(ptr+1<n&&v[i].first-v[ptr+1].first>d){
ptr++;
bit.update(v[ptr].second,-1);
}
ans+=bit.range(v[i].second-d,v[i].second+d);
bit.update(v[i].second,1);
}
pre[i].build(v);
}
for(int z=1;z<=m;z++){
for(pair<int,int> &bruh:group[z]){
int x=bruh.first,y=bruh.second;
for(int z2=z-1;z2>=1&&z-z2<=d;z2--){
int limit=d-(z-z2);
ans+=pre[z2].range(x-limit,y-limit,x+limit,y+limit);
}
}
}
cout << ans << endl;
}
컴파일 시 표준 에러 (stderr) 메시지
pairs.cpp: In function 'int main()':
pairs.cpp:59:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
59 | freopen("input.txt","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |