답안 #891034

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
891034 2023-12-22T06:39:03 Z Muhammad_Aneeq Pairs (IOI07_pairs) C++17
57 / 100
4000 ms 31340 KB
/*
بسم الله الرحمن الرحيم
Author:
                          (:Muhammad Aneeq:)
*/
#pragma GCC optimize("O2")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
#define int long long
inline int dis(vector<int>&a,vector<int>&b)
{
  int z=0;
  for (int j=0;j<b.size();j++)
    z+=abs(a[j]-b[j]);
  return z;
}
inline void solve()
{
  long long B,N,D,M;
  cin>>B>>N>>D>>M;
  int a[N][B];
  vector<int>mi(B,1e9+10),ma(B,0);
  map<vector<int>,int>d;
  for (int i=0;i<N;i++)
  {
    for (int j=0;j<B;j++)
      cin>>a[i][j];
    for (int j=0;j<B;j++)
    {
      mi[j]=min(mi[j],a[i][j]);
      ma[j]=max(ma[j],a[i][j]);
    }
  }
  if (dis(mi,ma)<=D)
  {
    cout<<(N*(N-1))/2<<endl;
    return;
  }
  if (B==1)
  {
    vector<int>z;
    for (int i=0;i<N;i++)
      z.push_back(a[i][0]);
    sort(begin(z),end(z));
    int ans=0;
    for (int i=0;i<N;i++)
    {
      int x=upper_bound(begin(z),end(z),z[i]+D)-begin(z);
      ans+=x-i-1;
    }
    cout<<ans<<endl;return;
  }
  M=min(M,D);
  int g=1;
  for (int i=0;i<B;i++)
    g*=M;
  int ans=0;
  set<vector<int>>s;
  for (int i=0;i<N;i++)
  {
    vector<int>g;
    for (int j=0;j<B;j++)
      g.push_back(a[i][j]);
    d[g]++;
    s.insert(g);
  }
  vector<vector<int>>z={begin(s),end(s)};
  int y=z.size();
  if (B==2)
  {
    // cout<<y<<endl;
    vector<int>e[ma[0]+10];
    for (auto i:z)
      e[i[0]].push_back(i[1]);
    for (int i=0;i<y;i++)
    {
      for (int j=max(mi[0],z[i][0]-M);j<=min(ma[0],z[i][0]+M);j++)
      {
        int f=lower_bound(begin(e[j]),end(e[j]),z[i][1]-(M-abs(z[i][0]-j)))-begin(e[j]);
        for (int u=f;u<e[j].size();u++)
        {
          int k=e[j][u];
          vector<int>y={j,k};
          int di=dis(z[i],y);
          if (di<=D)
          {
            if (j==z[i][0]&&k==z[i][1])
              ans+=d[z[i]]*(d[z[i]]-1);
            else
              ans+=d[z[i]]*d[y];
          }
          else
            break;
        }
      }
    }
    cout<<ans/2<<endl;
    return;
  }
  for (int i=0;i<z.size();i++)
  {
    int g=d[z[i]];
    ans+=(g*(g-1))/2;
    for (int j=i+1;j<z.size();j++)
    {
      int di=dis(z[i],z[j]);
      if (di<=D)
        ans+=d[z[i]]*d[z[j]];
    }
  }
  cout<<ans<<endl;
}
signed main()
{
  ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
        solve();
}

Compilation message

pairs.cpp: In function 'long long int dis(std::vector<long long int>&, std::vector<long long int>&)':
pairs.cpp:19:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |   for (int j=0;j<b.size();j++)
      |                ~^~~~~~~~~
pairs.cpp: In function 'void solve()':
pairs.cpp:86:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |         for (int u=f;u<e[j].size();u++)
      |                      ~^~~~~~~~~~~~
pairs.cpp:106:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |   for (int i=0;i<z.size();i++)
      |                ~^~~~~~~~~
pairs.cpp:110:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |     for (int j=i+1;j<z.size();j++)
      |                    ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 2268 KB Output is correct
2 Correct 15 ms 2268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 2268 KB Output is correct
2 Correct 19 ms 2392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 2388 KB Output is correct
2 Correct 19 ms 2268 KB Output is correct
3 Correct 19 ms 2268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2392 KB Output is correct
2 Correct 76 ms 2492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 129 ms 4688 KB Output is correct
2 Execution timed out 4045 ms 4540 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4064 ms 28872 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4038 ms 31340 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 600 KB Output is correct
2 Correct 50 ms 704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 2908 KB Output is correct
2 Correct 71 ms 2904 KB Output is correct
3 Correct 92 ms 3032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4006 ms 23268 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4035 ms 28500 KB Time limit exceeded
2 Halted 0 ms 0 KB -