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

显然,对于每一个添加的不等式,有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. Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏

    内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了

  2. Python练习题 021:递归方法求阶乘

    [Python练习题 021] 利用递归方法求5!. ---------------------------------------------- 首先得弄清楚:5! 指的是"5的阶乘&qu ...

  3. 灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟J ...

  4. 硬盘安装Linux

    准备材料:U盘.Linux镜像.UltraISO 1.下载安装UltraISO, 2.打开系统镜像 打开后我们就可以在左边侧栏看到镜像的内容 3.插入U盘,点击:启动->写入光盘映像->选 ...

  5. iPhone手机越狱-逆向砸壳-代码注入

    iPhone手机越狱 逆向砸壳 代码注入 工具下载 操作越狱 安装待逆向应用(app) 使用OpenSSH连接手机 找到应用二进制文件地址 找到应用document沙盒地址 拷贝砸壳工具(dumpde ...

  6. xxe 新手学习记录

    在做某题时遇到了xxe漏洞,学习+记录 这里因为环境暂时关了,现在复现不了,所以在网络上又找到了一些xxe题目环境 这里有 PikaChu靶场里的xxe环境,这个环境可以在BUUCTF里开,但是这里我 ...

  7. 警惕char类型直接相加

    今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串1:12345,字符串2:23456.需要1和2相加.2和3相加.就是两个字符相同位置的数进行相加. 这个一看很好完成,写一个for,然后取 ...

  8. kafka配置文件详解

    kafka的配置分为 broker.producter.consumer三个不同的配置 一 .BROKER 的全局配置最为核心的三个配置 broker.id.log.dir.zookeeper.con ...

  9. rs232转以太网转换器

    rs232转以太网转换器 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升 ...

  10. 【C语言C++编程学习笔记】一种很酷的 C 语言技巧,灵活运用编程技巧让你写代码事半功倍!

    C语言常常让人觉得它所能表达的东西非常有限.它不具有类似第一级函数和模式匹配这样的高级功能.但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了. ☆ 指定的初始化 很多人都 ...