• BZOJ 2762: [JLOI2011]不等式组( 平衡树 )


    对不等式变形..然后就是维护一些数, 随便找个数据结构都能写吧....用double感觉会有精度误差, 分类讨论把<改成<=了很久后弃疗了, 自己写了个分数体....然后速度就被完爆了..

    ------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
     
    using namespace std;
     
    typedef long long ll;
     
    const int maxn = 100009;
     
    int N, ans, n;
    char s[10];
     
    struct F {
    int a, b;
    F(int _a = 0, int _b = 0) : a(_a), b(_b) {
    if(b < 0)
    a = -a, b = -b;
    }
    bool operator < (const F &t) const {
    ll e = ll(a) * b, f = ll(t.a) * t.b;
    if(!e) return f > 0;
    if(!f) return e < 0;
    if(e > 0 && f < 0) return false;
    if(e < 0 && f > 0) return true;
    return ll(a) * t.b < ll(b) * t.a;
    }
    bool operator == (const F &t) const {
    return ll(a) * t.b == ll(b) * t.a;
    }
    };
     
    struct O {
    int t;
    F v;
    O(int _t = 0, F _v = F()) : t(_t), v(_v) {
    }
    } o[maxn];
     
    struct Node {
    Node* ch[2];
    int sz, r;
    F f;
    inline void upd() {
    sz = ch[0]->sz + ch[1]->sz + 1;
    }
    } pool[maxn], *pt, *Null, *Rt[2];
     
    void Init_Treap() {
    pt = pool;
    Null = pt++;
    Null->ch[0] = Null->ch[1] = Null;
    Null->sz = 0;
    Rt[0] = Rt[1] = Null;
    }
     
    Node* newNode(F v) {
    pt->f = v;
    pt->sz = 1;
    pt->r = rand();
    pt->ch[0] = pt->ch[1] = Null;
    return pt++;
    }
     
    void Rotate(Node*&t, int d) {
    Node* o = t->ch[d ^ 1];
    t->ch[d ^ 1] = o->ch[d];
    o->ch[d] = t;
    t->upd(), o->upd();
    t = o;
    }
     
    void Insert(Node*&t, F v) {
    if(t == Null) {
    t = newNode(v);
    } else {
    int d = (t->f < v);
    Insert(t->ch[d], v);
    if(t->ch[d]->r > t->r)
    Rotate(t, d ^ 1);
    }
    t->upd();
    }
     
    void Delete(Node*&t, F v) {
    int d = (v == t->f ? -1 : (t->f < v));
    if(d == -1) {
    if(t->ch[0] != Null && t->ch[1] != Null) {
    int _d = (t->ch[0]->r > t->ch[1]->r);
    Rotate(t, _d);
    Delete(t->ch[_d], v);
    } else {
    t = (t->ch[0] != Null ? t->ch[0] : t->ch[1]);
    }
    } else {
    Delete(t->ch[d], v);
    }
    if(t != Null) t->upd();
    }
     
    int Query(F v) {
    int ret = 0;
    for(Node* t = Rt[0]; t != Null; ) if(t->f < v) {
    ret += t->ch[0]->sz + 1;
    t = t->ch[1];
    } else
    t = t->ch[0];
    for(Node* t = Rt[1]; t != Null; ) if(v < t->f) {
    ret += t->ch[1]->sz + 1;
    t = t->ch[0];
    } else 
    t = t->ch[1];
    return ret;
    }
     
    int main() {
    scanf("%d", &N);
    ans = n = 0;
    Init_Treap();
    while(N--) {
    scanf("%s", s);
    if(s[0] == 'A') {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    c -= b;
    if(!a) {
    ans += (c < 0);
    o[n++] = O(0, F(0, c < 0));
    } else {
    Insert(Rt[a < 0], F(c, a));
    o[n++] = O(a < 0 ? -1 : 1, F(c, a));
    }
    } else if(s[0] == 'D') {
    int t;
    scanf("%d", &t), t--;
    if(o[t].t < -1)
    continue;
    if(!o[t].t) {
    ans -= o[t].v.b;
    } else {
    o[t].t > 0 ? Delete(Rt[0], o[t].v) : Delete(Rt[1], o[t].v);
    }
    o[t].t = -2;
    } else {
    int t;
    scanf("%d", &t);
    printf("%d ", ans + Query(F(t ,1)));
    }
    }
    return 0;
    }

    ------------------------------------------------------------------------------

    2762: [JLOI2011]不等式组

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 714  Solved: 205
    [Submit][Status][Discuss]

    Description

    旺汪与旺喵最近在做一些不等式的练习。这些不等式都是形如ax+b>c 的一元不等式。当然,解这些不等式对旺汪来说太简单了,所以旺喵想挑战旺汪。旺喵给出一组一元不等式,并给出一个数值 。旺汪需要回答的是x=k 时成立的不等式的数量。聪明的旺汪每次都很快就给出了答案。你的任务是快速的验证旺汪的答案是不是正确的。
     

    Input

    输入第一行为一个正整数 ,代表接下来有N 行。
    接下来每一行可能有3种形式:
    1.“Add a b c”,表明要往不等式组添加一条不等式ax+b>c ;
    2.“Del i”,代表删除第i 条添加的不等式(最先添加的是第1条)。
    3.“Query k”,代表一个询问,即当x=k 时,在当前不等式组内成立的不等式的数量。
    注意一开始不等式组为空,a,b,c,i,k 均为整数,且保证所有操作均合法,不会出现要求删除尚未添加的不等式的情况。
     

    Output

     
    对于每一个询问“Query k”,输出一行,为一个整数,代表询问的答案。

    Sample Input

    9
    Add 1 1 1
    Add -2 4 3
    Query 0
    Del 1
    Query 0
    Del 2
    Query 0
    Add 8 9 100
    Query 10

    Sample Output

    1
    1
    0
    0

    HINT

    1条添加到不等式组的不等式为x+1>1 ,第2条为-2x+4>3 ,所以第1个询问的时候只有第2条不等式可以成立,故输出1


    然后删除第1条不等式,再询问的时候依然是只有第2条不等式可以成立,故输出1


    再删除第2条不等式后,因为不等式组里面没有不等式了,所以没有不等式可以被满足,故输出0


    继续加入第3条不等式8x+9>100 ,当x=k=10时有8*10+9=89<100,故也没有不等式可以被满足,依然输出0


    数据范围:


    20%的数据, N<=1000


    40%的数据, N<=10000


    100%的数据,N<=100000


    a,b,c的范围为[-10^8,10^8],k的范围为[-10^6,10^6]


    Source

  • 相关阅读:
    2022.2.10学习日志
    2022.2.4学习日志
    【分享】MPSoC以太网hash包过滤模式
    解决给Ubuntu 18.04安装软件时的“unmet dependencies”问题
    ubuntu国内源
    编译FFMpeg n4.2.5,OpenCV 4.5.4后,编译Pangolin v0.6成功。
    Ubuntu 18.04下做点云开发安装的相关软件包
    【分享】使用Xilinx PetaLinux ARM64 SDK,交叉编译第三方软件
    使用rdfind删除重复文件
    为ubuntu 18.04的VNC运行轻量级桌面xfce
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5134481.html
Copyright © 2020-2023  润新知