제출 #1262255

#제출 시각아이디문제언어결과실행 시간메모리
1262255user736482Mixture (BOI20_mixture)C++20
13 / 100
1 ms328 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000007 
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099
ll n,a,b,c,A,B,C;
map<ld,ll>s[3];
bool czy(pair<ld,ld>x,pair<ld,ld>y){
    return x.ff*y.ss>=x.ss*y.ff;
}
bool check(){
    if(s[0].empty() || s[1].empty())return 0;
    ld p1=(*s[0].begin()).ff;
    ld p2=(*s[1].begin()).ff;
    ld k1=(*--s[0].end()).ff;
    ld k2=(*--s[1].end()).ff;
    //cout<<p1<<" "<<k1<<" "<<p2<<" "<<k2<<" "<<(-k1>p2)<<"\n";
    if(k1<p2 || k2<p1)return 0;
    return 1;
}
pair<ld,ll>gt(ll x,ll y,ll z){
    ll X=__gcd(__gcd(x,y),z);
    //cout<<y<<" "<<X<<" ";
    z/=X;
    x/=X;
    y/=X;
    ll s=C*x-z*A;
    ll d=C*y-z*B;
    ll k=abs(__gcd(s,d));
    if(k){
        s/=k;
        d/=k;
    }
    //cout<<s<<" "<<d<<"g\n";
    if(d==0){
        if(s==0){
            //cout<<x<<" "<<y<<" "<<z<<" "<<A<<" "<<B<<" "<<C<<"\n";
            if(x==A && y==B && z==C)
        return {0,2};
        else return {-1,2};
        }
        return {(ld)INFL,s>0};
    }
    return {(ld)s/(ld)d,(d>0)};
}
pair<ld,ll>x[100007];
ll czy1=0,czy2=0;

void f(pair<ld,ll>co,ll mlt){
    //cout<<co.ff<<" ";
    if(co==pair<ld,ll>{0,2}){
        czy1+=mlt;
        s[co.ss][co.ff]++;
        return;
    }
    czy2+=mlt*s[!co.ss][co.ff];
    if(s[!co.ss][co.ff]==0)s[!co.ss].erase(co.ff);
    s[co.ss][co.ff]++;
}
int main(){
    cin>>A>>B>>C;
    ll X=__gcd(A,__gcd(B,C));
    A/=X;
    B/=X;
    C/=X;
    cin>>n;
    ll ak2=1;
    for(ll i=0;i<n;i++){
        char ch;
        cin>>ch;
        if(ch=='A'){
            cin>>a>>b>>c;
            pair<ld,ll>ak=gt(a,b,c);
            x[ak2++]=ak;
            f(ak,1);
            //cout<<ak.ff<<"\n";
        }
        else{
            cin>>a;
            pair<ld,ll>ak=x[(ll)a];
            s[ak.ss][ak.ff]--;
            f(ak,-1);
            s[ak.ss][ak.ff]--;
            if(s[ak.ss][ak.ff]==0)s[ak.ss].erase(ak.ff);
            //cout<<ak.ff<<"\n";
        }
        //cout<<czy2<<" ";
       // cout<<s[0].size()<<" "<<s[1].size()<<"\n";
        if(czy1)cout<<1;
        else if(czy2)cout<<2;
        else if(check())cout<<3;
        else cout<<0;
        cout<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...