제출 #985988

#제출 시각아이디문제언어결과실행 시간메모리
985988andrei_boacaExamination (JOI19_examination)C++17
43 / 100
909 ms90304 KiB
#include <bits/stdc++.h>

using namespace std;
int n,q,sol[100005];
vector<int> vals[4*100005],aint[4*100005];
int nrx,nry;
struct point
{
    int x,y,z;
} v[100005];
struct date
{
    int x,y,z,ind;
} qr[100005];
vector<int> vx,vy;
map<int,int> nrmx,nrmy;
bool byz(point a,point b)
{
    return a.z>b.z;
}
bool comp(date a, date b)
{
    return a.z>b.z;
}
void plsput(int nod,int st,int dr,int x,int y)
{
    vals[nod].push_back(y);
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    if(x<=mij)
        plsput(nod*2,st,mij,x,y);
    else
        plsput(nod*2+1,mij+1,dr,x,y);
}
int getpoz(int ind,int val)
{
    int poz=vals[ind].size();
    poz++;
    int st=0;
    int dr=vals[ind].size();
    dr--;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(vals[ind][mij]>=val)
        {
            poz=mij+1;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return poz;
}
void build(int nod,int st,int dr)
{
    sort(vals[nod].begin(),vals[nod].end());
    vals[nod].erase(unique(vals[nod].begin(),vals[nod].end()),vals[nod].end());
    int lg=vals[nod].size();
    aint[nod].resize(4*lg+5);
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    build(nod*2,st,mij);
    build(nod*2+1,mij+1,dr);
}
void upd2(int ind,int nod,int st,int dr,int poz,int val)
{
    if(st==dr)
    {
        aint[ind][nod]+=val;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        upd2(ind,nod*2,st,mij,poz,val);
    else
        upd2(ind,nod*2+1,mij+1,dr,poz,val);
    aint[ind][nod]=aint[ind][nod*2]+aint[ind][nod*2+1];
}
int qr2(int ind,int nod,int st,int dr,int a,int b)
{
    if(st>=a&&dr<=b)
        return aint[ind][nod];
    int rez=0;
    int mij=(st+dr)/2;
    if(a<=mij)
        rez+=qr2(ind,nod*2,st,mij,a,b);
    if(b>mij)
        rez+=qr2(ind,nod*2+1,mij+1,dr,a,b);
    return rez;
}
void update(int nod,int st,int dr,int x,int y,int val)
{
    int poz=getpoz(nod,y);
    int lg=vals[nod].size();
    upd2(nod,1,1,lg,poz,val);
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    if(x<=mij)
        update(nod*2,st,mij,x,y,val);
    else
        update(nod*2+1,mij+1,dr,x,y,val);
}
int query(int nod,int st,int dr,int a,int b,int y)
{
    if(st>=a&&dr<=b)
    {
        int poz=getpoz(nod,y);
        if(poz<=vals[nod].size())
            return qr2(nod,1,1,vals[nod].size(),poz,vals[nod].size());
        return 0;
    }
    int rez=0;
    int mij=(st+dr)/2;
    if(a<=mij)
        rez+=query(nod*2,st,mij,a,b,y);
    if(b>mij)
        rez+=query(nod*2+1,mij+1,dr,a,b,y);
    return rez;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i].x>>v[i].y;
        v[i].z=v[i].x+v[i].y;
        vx.push_back(v[i].x);
        vy.push_back(v[i].y);
    }
    for(int i=1;i<=q;i++)
    {
        cin>>qr[i].x>>qr[i].y>>qr[i].z;
        qr[i].ind=i;
        vx.push_back(qr[i].x);
        vy.push_back(qr[i].y);
    }
    sort(vx.begin(),vx.end());
    sort(vy.begin(),vy.end());
    vx.erase(unique(vx.begin(),vx.end()),vx.end());
    vy.erase(unique(vy.begin(),vy.end()),vy.end());
    nrx=vx.size();
    nry=vy.size();
    for(int i=0;i<vx.size();i++)
        nrmx[vx[i]]=i+1;
    for(int i=0;i<vy.size();i++)
        nrmy[vy[i]]=i+1;
    for(int i=1;i<=n;i++)
    {
        v[i].x=nrmx[v[i].x];
        v[i].y=nrmy[v[i].y];
    }
    for(int i=1;i<=q;i++)
    {
        qr[i].x=nrmx[qr[i].x];
        qr[i].y=nrmy[qr[i].y];
    }
    sort(v+1,v+n+1,byz);
    sort(qr+1,qr+q+1,comp);
    for(int i=1;i<=n;i++)
        plsput(1,1,nrx,v[i].x,v[i].y);
    build(1,1,nrx);
    int j=1;
    for(int i=1;i<=q;i++)
    {
        while(j<=n&&v[j].z>=qr[i].z)
        {
            update(1,1,nrx,v[j].x,v[j].y,+1);
            j++;
        }
        sol[qr[i].ind]=query(1,1,nrx,qr[i].x,nrx,qr[i].y);
    }
    for(int i=1;i<=q;i++)
        cout<<sol[i]<<'\n';
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

examination.cpp: In function 'int query(int, int, int, int, int, int)':
examination.cpp:112:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         if(poz<=vals[nod].size())
      |            ~~~^~~~~~~~~~~~~~~~~~
examination.cpp: In function 'int main()':
examination.cpp:149:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  149 |     for(int i=0;i<vx.size();i++)
      |                 ~^~~~~~~~~~
examination.cpp:151:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  151 |     for(int i=0;i<vy.size();i++)
      |                 ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...