本来以为有多难,结果发现是道树状数组水题...

显然,对于每一个添加的不等式,有3种情况:

  1. \(a<0\) 。此时可转换为 $x < {{a} \over {c-b}} $ 。

    但是,我们发现 \({a} \over {c-b}\) 这货是实数,容易产生误差,不好处理。

    但我们又发现,询问的 \(k\) 一定是整数。于是,我们可以把上面不等式转换为整数。

    怎么转换?显然对于 \(\forall x \in \mathbb{Z} ,x < a \iff x< \lceil a \rceil\) 。

    所以,这不就转化成 \(x < \lceil {{a} \over {c-b}} \rceil\) 了吗。

  2. \(a=0\) 。此时直接判断是否有 \(b>c\) 。若有,则在树状数组中全部 \(+1\) ;反之则不变。

  3. \(a>0\) 。与第一种情况类似,可以转化成 \(x > \lfloor {{a} \over {c-b}} \rfloor\) 。

那么,我们只要把上面提到的 \(\lceil {{a} \over {c-b}} \rceil\) 、 \(\lfloor {{a} \over {c-b}} \rfloor\) 和询问提到的所有数放在一起离散化一下,用树状数组统计即可。

最后注意一个坑人的点:一个不等式可能被多次删除,这时候就不要重复统计了。

Code:(236ms)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=100010;
struct Operation{int typ,a,b,c,val;}p[N];
int n,cnt,id[N<<1],cntd,raw[N<<1],vis[N<<1];
//raw即为离散化数组;id[i]则记第i条添加的不等式序号为多少
struct TA{//树状数组+查分
#define lowbit(x) ((x)&(-(x)))
int c[N<<1];
inline void add(int x,int val){
for(;x<=cnt+1;x+=lowbit(x)) c[x]+=val;
}
inline void modify(int l,int r,int val){ //区间加
add(l,val);add(r+1,-val);
}
int query(int x){//单点查询
int res=0;
for(;x>0;x-=lowbit(x)) res+=c[x];
return res;
}
#undef lowbit
}ta;
int main(){
cin>>n;
for(int i=1;i<=n;i++){ //先把操作存起来
char op[8];int a,b,c;
scanf("%s",op);
if(op[0]=='A'){
scanf("%d%d%d",&a,&b,&c);
p[i]=(Operation){1,a,b,c};
if(a<0) p[i].val=ceil(1.0*(c-b)/a);
else if(a>0) p[i].val=floor(1.0*(c-b)/a);
id[++cntd]=i;
raw[++cnt]=p[i].val;
}
if(op[0]=='Q'){
scanf("%d",&a);
p[i]=Operation{2,a};
raw[++cnt]=a;
}
if(op[0]=='D'){
scanf("%d",&a);
p[i]=Operation{3,a};
}
}
sort(raw+1,raw+cnt+1);cnt=unique(raw+1,raw+cnt+1)-raw-1;
for(int i=1;i<=n;i++){
//把所有的数值改为离散化后的值
if(p[i].typ==1) p[i].val=lower_bound(raw+1,raw+cnt+1,p[i].val)-raw;
if(p[i].typ==2) p[i].a=lower_bound(raw+1,raw+cnt+1,p[i].a)-raw;
}
for(int i=1;i<=n;i++){
if(p[i].typ==1){
//判断+修改
if(p[i].a<0) ta.modify(1,p[i].val-1,1);
else if(p[i].a>0) ta.modify(p[i].val+1,cnt,1);
else ta.modify(1,cnt,p[i].b>p[i].c?1:0);
}
if(p[i].typ==2) printf("%d\n",ta.query(p[i].a));
if(p[i].typ==3){
int x=id[p[i].a];
if(vis[x]) continue;
vis[x]=1;
if(p[x].a<0) ta.modify(1,p[x].val-1,-1);
else if(p[x].a>0) ta.modify(p[x].val+1,cnt,-1);
else ta.modify(1,cnt,p[x].b>p[x].c?-1:0);
}
}
return 0;
}

【Luogu】 P5482 [JLOI2011]不等式组 题解的更多相关文章

  1. 【做题记录】 [JLOI2011]不等式组

    P5482 [JLOI2011]不等式组 超烦人的细节题!(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线). 树状数组的下标是:所有可能出现的数据进行离散化之后的值. 其含义为 ...

  2. 【BZOJ2762】[JLOI2011]不等式组 树状数组

    [BZOJ2762][JLOI2011]不等式组 Description 旺汪与旺喵最近在做一些不等式的练习.这些不等式都是形如ax+b>c 的一元不等式.当然,解这些不等式对旺汪来说太简单了, ...

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

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

  4. bzoj 2762: [JLOI2011]不等式组——树状数组

    旺汪与旺喵最近在做一些不等式的练习.这些不等式都是形如ax+b>c 的一元不等式.当然,解这些不等式对旺汪来说太简单了,所以旺喵想挑战旺汪.旺喵给出一组一元不等式,并给出一个数值 .旺汪需要回答 ...

  5. 【luogu P4568 [JLOI2011]飞行路线】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...

  6. 【BZOJ2762】[JLOI2011]不等式组(树状数组)

    题目: BZOJ2762 分析: 加入的不等式分三种情况 当\(a>0\),可以变成\(x>\lfloor \frac{c-b}{a}\rfloor\) 当\(a=0\),若\(b> ...

  7. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  8. NOIP2008普及组题解

    NOIP2008普及组题解 从我在其他站的博客直接搬过来的 posted @ 2016-04-16 01:11 然后我又搬回博客园了233333 posted @ 2016-06-05 19:19 T ...

  9. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

随机推荐

  1. Python3基础——递归

    递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈 ...

  2. C++中cstring.h和string.h的区别

    转载:https://blog.csdn.net/qian_chun_qiang/article/details/80648691 1.string与cstring有什么区别 <string&g ...

  3. 洛谷UVA524 素数环 Prime Ring Problem

    标签:搜索与回溯 题目: 从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. 算法分析: 非常明显,这是一道回溯的题目.从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相 ...

  4. 笔记本电脑为什么有时候不用按FN+F1~12也可以控制音量、亮度全部等等

    对于经常要使用F1~F12的用户就很烦,比如编写前端代码的时候想直接按F12检查代码就是不行. 如何取消快捷键? 问题原因: 1.电脑默认使用了快捷键. 2.电脑按了FN+ESC锁定,只限于戴尔的电脑 ...

  5. 快速掌握ES6语法

    常量变量 let and const 先说说常量和变量的概念吧, 常量是说那种进行一次赋值后不会更改的值,比如说游戏账户的 ID, 变量是说赋值后有更改的需求的,比如游戏名,游戏密码. 在之前的 Ja ...

  6. EfCore3的OwnedType会导致Sql效率问题

    最近主导了旗下某核心项目升级到EfCore3 由于之前Core2升级时候也踩过不少的坑很多东西都有规划和准备,整体上还是没出太大问题 但是最近突然发现efcore对于使用了ownedType的生成语句 ...

  7. 第二十一章 PHP编译安装(centos7)

    一.环境准备 主机 IP 身份 web01 10.0.0.7 编译安装PHP 二.准备安装 1.新建目录 [root@jindada ~]# mkdir /php 2.上传源码包并解压 [root@j ...

  8. 一份超全的Python学习资料汇总

    一.学习Python必备技能图谱二.0基础如何系统学习Python?一.Python的普及入门1.1 Python入门学习须知和书本配套学习建议1.2 Python简史1.3 Python的市场需求及 ...

  9. return i++ 是先用再加么

    return i++ 比较特殊,先是return i:然后i++. return i=i+ 1 则不同,它是先让i=i+1,再return

  10. 第二十七章 ansible变量介绍

    一.ansible变量介绍 1.概念 变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲 ...