Submission #195560

#TimeUsernameProblemLanguageResultExecution timeMemory
195560theStaticMindExamination (JOI19_examination)C++14
100 / 100
2223 ms14748 KiB
#include<bits/stdc++.h>
#define pb push_back
#define ii pair<int,int>
#define all(x) (x).begin(),(x).end()
#define INF 100000000000000000
#define modulo 1000000007
#define mod 998244353
//#define int long long int
using namespace std;

struct Person{
      int M,I,Z,ind;
      bool Q;
      Person(int m,int i,int z,int in){
            M=m;
            I=i;
            Z=z;
            ind=in;
      }
      bool operator<(const Person& A)const{
            return M<A.M||(M==A.M&&I<A.I);
      }
};
vector<Person>arr;
vector<Person>Q;
vector<int>no;
vector<vector<ii>> data;
int sq;
int sz;
bool sort_by_Z(int A,int B){
      return arr[A].Z<arr[B].Z;
}
bool Sort_by_Z(int A,int B){
      return Q[A].Z<Q[B].Z;
}
int query(vector<ii>& data,int x){
      int l=0,r=data.size()-1;
      int j=data.size();
      while(l<=r){
            int mid=(l+r)/2;
            if(data[mid].first<x)l=mid+1;
            else{
                  r=mid-1;
                  j=mid;
            }
      }
      if(j==data.size())return 0;
      return data[j].second;
}
void erase(vector<ii>& data,int x){
      int l=0,r=data.size()-1;
      int j=data.size();
      while(l<=r){
            int mid=(l+r)/2;
            if(data[mid].first<x)l=mid+1;
            else{
                  r=mid-1;
                  j=mid;
            }
      }
      assert(j!=data.size());
      for(;j>=0;j--){
            data[j].second--;
      }
}
int32_t main(){
      ios_base::sync_with_stdio(false);
      cin.tie(NULL);
//      freopen("q.in","r",stdin);
//      freopen("q.out","w",stdout);
      int n,q;
      cin>>n>>q;
      vector<int>Z;
      vector<int>ans(q,0);
      for(int i=0;i<n;i++){
            int a,b;
            cin>>a>>b;
            arr.pb(Person(a,b,a+b,i));
            Z.pb(i);
      }
      sort(all(arr));
      for(int i=0;i<n;i++)arr[i].ind=i;
      sort(all(Z),sort_by_Z);

      sq=sqrt(n);
      sz=n/sq+1;
      for(int i=0;i<n;i++){
            no.pb(i/sq);
      }
      data.resize(sz);
      for(int i=0;i<n;i++){
            data[no[i]].pb({arr[i].I,0});
      }
      for(int i=0;i<sz;i++){
            int cnt=1;
            sort(all(data[i]));
            for(int j=data[i].size()-1;j>=0;j--){
                  data[i][j].second=cnt++;
            }
      }

      vector<int>idq;
      for(int i=0;i<q;i++){
            int a,b,c;
            cin>>a>>b>>c;
            idq.pb(i);
            Q.pb(Person(a,b,c,i));
      }
      sort(all(idq),Sort_by_Z);
      int ptr=0;
      vector<bool>vis(n,false);
      for(int i=0;i<q;i++){
            while(ptr!=n&&arr[Z[ptr]].Z<Q[idq[i]].Z){
                  vis[Z[ptr]]=true;
                  erase(data[no[arr[Z[ptr]].ind]],arr[Z[ptr]].I);
                  ptr++;
            }
            int l=0,r=n-1;
            int j=n;
            while(l<=r){
                  int mid=(l+r)/2;
                  if(arr[mid].M<Q[idq[i]].M)l=mid+1;
                  else{
                        r=mid-1;
                        j=mid;
                  }
            }
            if(j==n)continue;
            while(j!=0&&j<n&&no[j]==no[j-1]){
                  if(vis[j]==false&&arr[j].I>=Q[idq[i]].I)
                  ans[idq[i]]++;
                  j++;
            }
            if(j==n)continue;
            for(int N=no[j];N<sz;N++){
                  ans[idq[i]]+=query(data[N],Q[idq[i]].I);
            }
      }
      for(int i=0;i<q;i++)cout<<ans[i]<<"\n";
}

Compilation message (stderr)

examination.cpp: In function 'int query(std::vector<std::pair<int, int> >&, int)':
examination.cpp:47:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(j==data.size())return 0;
          ~^~~~~~~~~~~~~
In file included from /usr/include/c++/7/cassert:44:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33,
                 from examination.cpp:1:
examination.cpp: In function 'void erase(std::vector<std::pair<int, int> >&, int)':
examination.cpp:61:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       assert(j!=data.size());
              ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...