답안 #808673

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
808673 2023-08-05T09:12:10 Z DJeniUp The Potion of Great Power (CEOI20_potion) C++17
0 / 100
3000 ms 94792 KB
#include "bits/stdc++.h"

using namespace std;

typedef int ll;
typedef pair<ll,ll>pairll;

#define N1 100007
#define INF 1000000000
#define pb push_back
#define fr first
#define sc second

ll n,m,h[N1],h1;

vector<pairll>p[N1];

queue<ll>h2;

map<ll,ll>mp;

struct T{
    ll l,r,s;
}t[80*N1];

struct D{
    ll n,h;
}d[N1];

bool mcp(D d1,D d2){
    return d1.h<d2.h;
}

void init(int N, int D, int H[]) {
    n=N;
    m=D;
    for(int i=0;i<n;i++){
        h[i]=H[i];
        p[i].pb({0,0});
        d[i]={i,h[i]};
    }

    sort(d,d+n,mcp);
    sort(h,h+n);
    for(int i=0;i<n;i++){
        mp[d[i].n]=i;
    }
    return ;
}

void Add(ll x,ll y,ll l,ll r,ll tl){

    if(r<tl || tl<l)return ;
    if(l==r){
        t[x].s^=1;
        return ;
    }
    ll m1=(l+r)/2;
    if(tl<=m1){
        ll k=0;
        if(t[y].l==0){
            h1++;
            k=h1;
        }else k=t[y].l;
        t[k]=t[t[y].l];
        t[x].l=k;
        Add(t[x].l,t[y].l,l,m1,tl);
    }else{
        ll k=0;
        if(t[y].r==0){
            h1++;
            k=h1;
        }else k=t[y].r;
        t[k]=t[t[y].r];
        t[x].r=k;
        Add(t[x].r,t[y].r,m1+1,r,tl);
    }
    t[x].s=t[t[x].l].s+t[t[x].r].s;
    if(t[t[x].l].s==0 && t[x].l!=0){
        h2.push(t[x].l);
        t[x].l=0;
    }

    if(t[t[x].r].s==0 && t[x].r!=0){
        h2.push(t[x].r);
        t[x].r=0;
    }
   // cout<<"?! "<<x<<" "<<l<<" "<<r<<" "<<tl<<" "<<t[x].s<<endl;
    return ;
}

void curseChanges(int U, int A[], int B[]) {
    for(int i=0;i<U;i++){
        h1++;
        A[i]=mp[A[i]];
        B[i]=mp[B[i]];
        t[h1]=t[p[A[i]].back().sc];
        p[A[i]].pb({i,h1});
        Add(h1,p[A[i]][p[A[i]].size()-2].sc,0,n-1,B[i]);

        h1++;
        t[h1]=t[p[B[i]].back().sc];
        p[B[i]].pb({i,h1});
        Add(h1,p[B[i]][p[B[i]].size()-2].sc,0,n-1,A[i]);
    }
    return ;
}

ll R(ll x,ll l,ll r,ll tl){
    //cout<<"? "<<x<<" "<<l<<" "<<r<<" "<<tl<<" "<<t[x].s<<endl;
    if(r<tl || t[x].s==0)return INF;
    if(l==r)return l;
    ll m1=(l+r)/2;
    ll r1=INF;
    if(tl<=m1)r1=R(t[x].l,l,m1,tl);
    if(r1!=INF)return r1;
    return R(t[x].r,m1+1,r,tl);
}

int question(int x, int y, int v) {
    x=mp[x];
    y=mp[y];
    ll res=INF;
    ll l=0;
    ll r=p[x].size()-1;
    while(l<r){
        ll m1=(l+r+1)/2;
        if(p[x][m1].fr>=v)r=m1-1;
        else l=m1;
    }

    ll l1=0;
    ll r1=p[y].size()-1;
    while(l1<r1){
        ll m1=(l1+r1+1)/2;
        if(p[y][m1].fr>=v)r1=m1-1;
        else l1=m1;
    }
    //cout<<"! "<<l<<" "<<l1<<endl;
    ll a=-1;
    while(1){
        a=R(p[x][l].sc,0,n-1,a+1);
        if(a==INF)break;
        ll b=R(p[y][l1].sc,0,n-1,a);
        if(b==INF)break;
        res=min(res,abs(h[a]-h[b]));
        if(res==0)break;
        //cout<<a<<" "<<b<<endl;
    }
    a=-1;
    while(1){
        a=R(p[y][l1].sc,0,n-1,a+1);
        if(a==INF)break;
        ll b=R(p[x][l].sc,0,n-1,a);
        if(b==INF)break;
        res=min(res,abs(h[a]-h[b]));
        if(res==0)break;
        //cout<<a<<" "<<b<<endl;

    }
    return res;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2640 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3024 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 696 ms 94792 KB Output is correct
2 Correct 760 ms 94784 KB Output is correct
3 Correct 615 ms 64076 KB Output is correct
4 Execution timed out 3062 ms 26720 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 490 ms 94732 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 15 ms 7044 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2640 KB Incorrect
2 Halted 0 ms 0 KB -