제출 #1166649

#제출 시각아이디문제언어결과실행 시간메모리
1166649Math4Life2020Mixture (BOI20_mixture)C++20
100 / 100
142 ms14096 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>; using ld = long double;

pii tfm(pii p1) {
    if (p1.first==0 && p1.second==0) {
        return p1;
    }
    ll g = gcd(p1.first,p1.second);
    return {p1.first/g,p1.second/g};
}

pii neg(pii p1) {
    return {-p1.first,-p1.second};
}

ll num0 = 0; //(0,0)
ll nump = 0; //(1,0)
ll numn = 0; //(-1,0)
multiset<ld> mt; //multiset top (y>0): x/y
multiset<ld> mb; //multiset bottom (y<0): x/y
ll pairc = 0; //pair count: how many pairs have positive value (mpair)?
map<pii,pii> mpair; //EXCLUDE y=0; (pair version with positive y) -> {# of that, # of opp}

void insrt(pii p0) {
    ll x = p0.first; ll y = p0.second;
    if (y==0) {
        if (x==0) {
            num0++;
        } 
        if (x>0) {
            nump++;
        }
        if (x<0) {
            numn++;
        }
        return;
    }
    if (y>0) {
        if (mpair.find({x,y})==mpair.end()) {
            mpair[{x,y}]={1,0};
        } else {
            pii pc = mpair[{x,y}];
            mpair[{x,y}]={pc.first+1,pc.second};
            if (pc.first==0 && pc.second>=1) {
                pairc++;
            }
        }
        mt.insert(((ld)x)/y);
    }
    if (y<0) {
        if (mpair.find({-x,-y})==mpair.end()) {
            mpair[{-x,-y}]={0,1};
        } else {
            pii pc = mpair[{-x,-y}];
            mpair[{-x,-y}]={pc.first,pc.second+1};
            if (pc.first>=1 && pc.second==0) {
                pairc++;
            }
        }
        mb.insert(((ld)x)/y);
    }
}

void del(pii p0) {
    ll x = p0.first; ll y = p0.second;
    if (y==0) {
        if (x==0) {
            num0--;
        } 
        if (x>0) {
            nump--;
        }
        if (x<0) {
            numn--;
        }
        return;
    }
    if (y>0) {
        pii pc = mpair[{x,y}];
        mpair[{x,y}]={pc.first-1,pc.second};
        if (pc.first==1 && pc.second>=1) {
            pairc--;
        }
        mt.erase(mt.find(((ld)x)/y));
    }
    if (y<0) {
        pii pc = mpair[{-x,-y}];
        mpair[{-x,-y}]={pc.first,pc.second-1};
        if (pc.first>=1 && pc.second==1) {
            pairc--;
        }
        mb.erase(mb.find((((ld)x)/y)));
    }
}

bool qry() { //exists triangle?
    if (nump>0 && numn>0) {
        assert(0);
    }
    if (mt.size()==0 || mb.size()==0) {
        return 0;
    }
    ld minb = *(mb.begin()); //x/y for y<0
    ld maxb = *(--mb.end());
    ld mint = *(mt.begin());
    ld maxt = *(--mt.end());
    if (nump>0) {
        if (maxb>mint) {
            return 1;
        }
    }
    if (numn>0) {
        if (maxt>minb) {
            return 1;
        }
    }
    if (maxb>mint && maxt>minb) {
        return 1;
    }
    return 0;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
    ll A,B,C,T; cin >> A >> B >> C; T=A+B+C;
    ll N; cin >> N;
    vector<array<ll,3>> acur;
    for (ll i=0;i<N;i++) {
        string S; cin >> S;
        if (S[0]=='A') {
            ll a1,b1,c1; cin >> a1 >> b1 >> c1; ll t1 = a1+b1+c1;
            acur.push_back({a1,b1,c1});
            insrt(tfm({T*a1-t1*A,T*b1-t1*B}));
        } else {
            ll r; cin >> r;
            r--;
            auto A1 = acur[r];
            ll a1 = A1[0]; ll b1 = A1[1]; ll c1 = A1[2]; ll t1 = a1+b1+c1;
            del(tfm({T*a1-t1*A,T*b1-t1*B}));
        }
        if (num0>0) {
            cout << "1\n";
        } else if (pairc>0 || (numn>0 && nump>0)) {
            cout << "2\n";
        } else if (qry()) {
            cout << "3\n";
        } else {
            cout << "0\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...