제출 #220248

#제출 시각아이디문제언어결과실행 시간메모리
220248MKopchevExamination (JOI19_examination)C++14
100 / 100
1942 ms305896 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=(1<<17)+42;
int n,q;

struct info
{
    int first_low,second_low,sum_low,id;
};

info inp[2*nmax];

bool cmp(info a,info b)
{
    if(a.sum_low!=b.sum_low)return a.sum_low>b.sum_low;
    return a.id<b.id;
}
int x_vals[nmax];
int y_vals[nmax];

int output[nmax];

struct tree_node
{
    int l,r,sum;
};

vector< tree_node > tree[2*nmax];

int make_node(int where)
{
    tree_node ret;
    ret.l=-1;
    ret.r=-1;
    ret.sum=0;
    tree[where].push_back(ret);

    return tree[where].size()-1;
}

void update_cur_tree(int node_pointer,int node,int l,int r,int y_val)
{
    //cout<<"update_cur_tree "<<node_pointer<<" "<<node<<" "<<l<<" "<<r<<" "<<y_val<<endl;

    tree[node_pointer][node].sum++;
    if(l==r)return;

    int av=(l+r)/2;
    if(y_val<=av)
    {
        if(tree[node_pointer][node].l==-1)
        {
            int was=make_node(node_pointer);
            tree[node_pointer][node].l=was;
        }
        update_cur_tree(node_pointer,tree[node_pointer][node].l,l,av,y_val);
    }
    else
    {
        if(tree[node_pointer][node].r==-1)
        {
            int was=make_node(node_pointer);
            tree[node_pointer][node].r=was;
        }
        update_cur_tree(node_pointer,tree[node_pointer][node].r,av+1,r,y_val);
    }
}
void update(int node,int l,int r,int x_val,int y_val)
{
    update_cur_tree(node,0,1,n,y_val);

    if(l==r)return;

    int av=(l+r)/2;
    if(x_val<=av)update(node*2,l,av,x_val,y_val);
    else update(node*2+1,av+1,r,x_val,y_val);
}

int query_cur_tree(int node_pointer,int node,int l,int r,int lq,int rq)
{
    if(node==-1)return 0;

    if(l==lq&&r==rq)return tree[node_pointer][node].sum;

    int av=(l+r)/2,ret=0;

    if(lq<=av)ret=ret+query_cur_tree(node_pointer,tree[node_pointer][node].l,l,av,lq,min(av,rq));
    if(av<rq)ret=ret+query_cur_tree(node_pointer,tree[node_pointer][node].r,av+1,r,max(av+1,lq),rq);

    return ret;
}
int query(int node,int l,int r,int x_left,int x_right,int y_left,int y_right)
{
    if(l==x_left&&r==x_right)return query_cur_tree(node,0,1,n,y_left,y_right);

    int ret=0,av=(l+r)/2;

    if(x_left<=av)ret=ret+query(node*2,l,av,x_left,min(x_right,av),y_left,y_right);
    if(av<x_right)ret=ret+query(node*2+1,av+1,r,max(x_left,av+1),x_right,y_left,y_right);

    return ret;
}
int main()
{
    for(int i=0;i<2*nmax;i++)make_node(i);

    scanf("%i%i",&n,&q);

    for(int i=1;i<=n;i++)
    {
        scanf("%i%i",&inp[i].first_low,&inp[i].second_low);
        inp[i].sum_low=inp[i].first_low+inp[i].second_low;

        x_vals[i]=inp[i].first_low;
        y_vals[i]=inp[i].second_low;

        inp[i].id=-1;
    }

    for(int i=n+1;i<=n+q;i++)
    {
        scanf("%i%i%i",&inp[i].first_low,&inp[i].second_low,&inp[i].sum_low);
        inp[i].id=i-n;
    }

    sort(inp+1,inp+n+q+1,cmp);
    sort(x_vals+1,x_vals+n+1);
    sort(y_vals+1,y_vals+n+1);

    for(int i=1;i<=n+q;i++)
    {
        int x_actual=lower_bound(x_vals+1,x_vals+n+1,inp[i].first_low)-x_vals;
        int y_actual=lower_bound(y_vals+1,y_vals+n+1,inp[i].second_low)-y_vals;

        if(inp[i].id==-1)
        {
            update(1,1,n,x_actual,y_actual);
        }
        else if(x_actual<=n&&y_actual<=n)
        {
            output[inp[i].id]=query(1,1,n,x_actual,n,y_actual,n);
        }
    }

    for(int i=1;i<=q;i++)
        printf("%i\n",output[i]);
    return 0;
}

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

examination.cpp: In function 'int main()':
examination.cpp:107:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i%i",&n,&q);
     ~~~~~^~~~~~~~~~~~~~
examination.cpp:111:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%i%i",&inp[i].first_low,&inp[i].second_low);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examination.cpp:122:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%i%i%i",&inp[i].first_low,&inp[i].second_low,&inp[i].sum_low);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...