제출 #1274580

#제출 시각아이디문제언어결과실행 시간메모리
1274580quan606303Examination (JOI19_examination)C++17
100 / 100
505 ms27280 KiB
#include <bits/stdc++.h>
bool M1;
#define int long long 
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define memfull(a,b) memset(a,b,sizeof(a));
#define file(a) freopen(a".inp","r",stdin); freopen(a".out","w",stdout);
using namespace std;
const int MOD=1e9+7;
const int maxn=1e5+7;
const int inf=1e18;
int n,q,ans[maxn];
struct BIT
{
  int N;
  vector<int> bit;
  BIT(int n):N(n),bit(n+5,0){}
  void upd(int x,int val)
  {
    for (;x<=N;x+=(x&-x))bit[x]+=val;
  }
  int get(int x)
  {
    int sum=0;
    for (;x>0;x&=(x-1))sum+=bit[x];
    return sum;
  }
  int get_range(int l,int r)
  {
    return get(r)-get(l-1);
  }
};
struct point
{
  int X,Y,Z,id;
};
bool cmp1(point u,point v)
{
  if (u.X!=v.X)return u.X>v.X;
  return u.id<v.id;
}
bool cmp2(point u,point v)
{
  if (u.Y!=v.Y)return u.Y>v.Y;
  return u.id<v.id;
}
point a[2*maxn]; 
BIT bit(2*maxn);
void dnc(int l,int r)
{
  if (l>r)return ;
  int mid=(l+r)/2;
  vector<point> vt;
  for (int i=l;i<=r;i++)vt.push_back({i,a[i].Y,a[i].Z,a[i].id});
  sort(vt.begin(),vt.end(),cmp2);
  for (auto i:vt)
  {
    if (i.id==-1)
    {
      if (i.X<mid)
      {
        bit.upd(i.Z,1);
        if (a[mid].id!=-1&&i.Y>=a[mid].Y&&i.Z>=a[mid].Z)ans[a[mid].id]++;
      }
    }
    else 
    {
      if (i.X>mid)
      {
        ans[i.id]+=bit.get_range(i.Z,2*maxn-1);
        if (a[mid].id==-1&&a[mid].Y>=i.Y&&a[mid].Z>=i.Z)ans[i.id]++;
      }
    }
  }
  for (auto i:vt)
  {
    if (i.id==-1)
    {
      if (i.X<mid)bit.upd(i.Z,-1);
    }
  }
  dnc(l,mid-1);
  dnc(mid+1,r);
}
int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>q;
    vector<int> nenX,nenY,nenZ;
    nenX.push_back(-inf);
    nenY.push_back(-inf);
    nenZ.push_back(-inf);
    for (int i=1;i<=n;i++)
    {
      int X,Y;
      cin>>X>>Y;
      int Z=X+Y;
      a[i]={X,Y,Z,-1};
      nenX.push_back(X);
      nenY.push_back(Y);
      nenZ.push_back(Z);
    }
    for (int i=1;i<=q;i++)
    {
      int X,Y,Z;
      cin>>X>>Y>>Z;
      a[n+i]={X,Y,Z,i};
      nenX.push_back(X);
      nenY.push_back(Y);
      nenZ.push_back(Z);
    }
    int N=n+q;
    sort(nenX.begin(),nenX.end());
    sort(nenY.begin(),nenY.end());
    sort(nenZ.begin(),nenZ.end());
    nenX.erase(unique(nenX.begin(),nenX.end()),nenX.end());
    nenY.erase(unique(nenY.begin(),nenY.end()),nenY.end());
    nenZ.erase(unique(nenZ.begin(),nenZ.end()),nenZ.end());
    for (int i=1;i<=N;i++)
    {
      a[i].X=lower_bound(nenX.begin(),nenX.end(),a[i].X)-nenX.begin();
      a[i].Y=lower_bound(nenY.begin(),nenY.end(),a[i].Y)-nenY.begin();
      a[i].Z=lower_bound(nenZ.begin(),nenZ.end(),a[i].Z)-nenZ.begin();
    }
    sort(a+1,a+1+N,cmp1);
  dnc(1,N);
  for (int i=1;i<=q;i++)cout<<ans[i]<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...