답안 #915246

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
915246 2024-01-23T14:53:16 Z NValchanov Trampoline (info1cup20_trampoline) C++17
0 / 100
157 ms 45436 KB
#include<bits/stdc++.h>

#define endl '\n'

using namespace std;

typedef long long ll;

const ll MAXN=1e9+10;
const ll MAXK=2e5+10;
const ll MAXQ=2e5+10;
const ll MAXLOG=18;

ll n,m,k,q;
pair<ll,ll>v[MAXK];
ll lift[MAXK][MAXLOG];
ll depth[MAXK];

void read()
{
    cin>>n>>m>>k;
    for(ll i=1;i<=k;i++)
    {
        ll x,y;
        cin>>x>>y;
        v[i]=make_pair(x,y);
    }
    sort(v+1,v+k+1);
}

ll lift_node(ll node,ll k)
{
    for(ll i=0;i<MAXLOG;i++)
    {
        if(k&(1<<i))
        {
            node=lift[node][i];
        }
    }
}

ll bin_search(pair<ll,ll>cur)
{
    ll left=1,right=k,mid;
    while(left<=right)
    {
        mid=left+(right-left)/2;
        if(v[mid]>=cur)
            right=mid-1;
        else
            left=mid+1;
    }
    return right==k?0:right+1;
}

bool check_ans(pair<ll,ll>ans,ll x,ll y)
{
    return ans.first<=x&&ans.second<=y;
}

bool check_query(ll x1,ll y1,ll x2,ll y2)
{
    return x1<=x2&&y1<=y2;
}

void query(ll x1,ll y1,ll x2,ll y2)
{
    if(!check_query(x1,y1,x2,y2))
    {
        cout<<"No"<<endl;
        ///cout<<"hui"<<endl;
        return;
    }
    if(x1==x2)
    {
        cout<<"Yes"<<endl;
        return;
    }
    pair<ll,ll>cur=make_pair(x1,y1);
    ll pos=bin_search(cur);
    pair<ll,ll>ans=v[pos];
    if(!check_ans(ans,x2,y2))
    {
        cout<<"No"<<endl;
        ///cout<<"chep"<<endl;
        return;
    }
    ll diff=x2-x1-1;
    if(depth[pos]<diff)
    {
        cout<<"No"<<endl;
        ///cout<<"daima"<<endl;
        return;
    }
    ll anspos=lift_node(pos,diff);
    if(v[anspos].first<=x2&&v[anspos].second<=y2)
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
}

void fill_lift(ll idx,ll pos)
{
    ///cout<<"namereno"<<endl;
    depth[idx]=depth[pos]+1;
    lift[idx][0]=pos;
    for(ll j=1;j<MAXLOG;j++)
        lift[idx][j]=lift[lift[idx][j-1]][j-1];
}

void prekompot()
{
    for(ll i=k;i>0;i--)
    {
        pair<ll,ll>target=v[i];
        target.first++;
        ll pos=bin_search(target);
        ///cout<<pos<<endl;
        ///cout<<v[pos].first<<" "<<v[pos].second<<endl;
        if(v[pos].first==target.first)
            fill_lift(i,pos);
    }
}

void process_queries()
{
    cin>>q;
    for(ll i=1;i<=q;i++)
    {
        ll x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        query(x1,y1,x2,y2);
    }
}

void control_print()
{
    for(ll i=1;i<=k;i++)
    {
        cout<<depth[i]<<" ";
    }
    cout<<endl;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

    read();
    prekompot();
    ///control_print();
    process_queries();
	return 0;
}

Compilation message

trampoline.cpp: In function 'll lift_node(ll, ll)':
trampoline.cpp:40:1: warning: no return statement in function returning non-void [-Wreturn-type]
   40 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 5208 KB expected YES, found NO [1st token]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 66 ms 35140 KB expected YES, found NO [3rd token]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 157 ms 45412 KB expected YES, found NO [4th token]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 5720 KB expected YES, found NO [1st token]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 154 ms 45436 KB expected YES, found NO [1st token]
2 Halted 0 ms 0 KB -