LINK:Happy Triangle

这道题很容易。

容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可。

前面两个容易想到set来找前驱后继 第三个 考虑比x大的数字中两个连着的数字差的最小值 直接用线段树维护一下即可。

code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
#define maxx 1000000000
#define l(p) t[p].l
#define r(p) t[p].r
#define mx(p) t[p].mx
#define cnt(p) t[p].cnt
#define ls l(p),l,mid
#define rs r(p),mid+1,r
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=200010;
int n,rt,id,flag,cnt,ww,cc,vv;
int b[10];
map<int,int>H;
set<int>s;
set<int>::iterator it;
struct wy
{
int l,r;
int mx,cnt;
}t[MAXN*30];
inline void insert(int &p,int l,int r,int x,int w)
{
if(!p)p=++id;
if(l==r)return mx(p)=w,void();
int mid=(l+r)>>1;
if(x<=mid)insert(ls,x,w);
else insert(rs,x,w);
mx(p)=min(mx(l(p)),mx(r(p)));
}
inline void modify(int p,int l,int r,int x)
{
if(l==r)return cnt(p)^=1,void();
int mid=(l+r)>>1;
if(x<=mid)modify(ls,x);
else modify(rs,x);
cnt(p)=cnt(l(p))|cnt(r(p));
}
inline void insert(int x)
{
++H[x];++cc;ww=H[x];
if(ww==1)
{
s.insert(x);
it=s.find(x);
++it;
if(it!=s.end())insert(rt,1,maxx,x,*it-x);
else insert(rt,1,maxx,x,maxx+1);
--it;
if(it!=s.begin())
{
--it;
insert(rt,1,maxx,*it,x-*it);
}
}
if(ww==2)modify(rt,1,maxx,x);
}
inline void erase(int x)
{
--H[x];--cc;ww=H[x];
if(ww==0)
{
it=s.find(x);
++it;
int qq=-1,hj=-1;
if(it!=s.end())qq=*it;
--it;
if(it!=s.begin())--it,hj=*it;
insert(rt,1,maxx,x,maxx+1);
if(hj!=-1)insert(rt,1,maxx,hj,qq!=-1?qq-hj:maxx+1);
s.erase(x);
}
if(ww==1)modify(rt,1,maxx,x);
}
inline void ask(int p,int l,int r,int L,int R)
{
if(flag)return;
if(L<=l&&R>=r)return flag=cnt(p)||(mx(p)<L),void();
int mid=(l+r)>>1;
if(L<=mid)ask(ls,L,R);
if(R>mid)ask(rs,L,R);
}
inline int ask(int x)
{
if(cc<=1)return 0;
ww=H[x];flag=cnt=0;
if(ww>=2)return 1;
if(ww==1)b[cnt=1]=x;
s.insert(x);it=s.find(x);
if(it!=s.begin())
{
--it;
ww=H[*it];
rep(1,min(ww,2),i)b[++cnt]=*it;
if(ww==1)
{
if(it!=s.begin())
{
--it;
b[++cnt]=*it;
++it;
}
}
++it;
}
++it;
if(it!=s.end())b[++cnt]=*it;
s.erase(x);
rep(1,cnt,i)rep(i+1,cnt,j)
{
int cw=max(b[i],max(b[j],x));
if(b[i]+b[j]>cw&&b[i]+x>cw&&b[j]+x>cw)return 1;
}
ask(rt,1,maxx,x,maxx);
return flag;
}
int main()
{
//freopen("1.in","r",stdin);
get(n);mx(0)=maxx+1;
rep(1,n,i)
{
int get(op),get(x);
if(op==1)insert(x);
if(op==2)erase(x);
if(op==3)if(ask(x))puts("Yes");
else puts("No");
}
return 0;
}

2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论的更多相关文章

  1. 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset

    LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...

  2. 2020牛客暑假多校训练营 第二场 E Exclusive OR FWT

    LINK:Exclusive OR 没做出 原因前面几篇说过了. 根据线性基的知识容易推出 不超过\(w=log Mx\)个数字即可拼出最大值 其中Mx为值域. 那么考虑w+2个数字显然也为最大值.. ...

  3. 2020牛客暑期多校训练营 第二场 K Keyboard Free 积分 期望 数学

    LINK:Keyboard Free 我要是会正经的做法 就有鬼了. 我的数学水平没那么高. 三个同心圆 三个动点 求围成三角形面积的期望. 不会告辞. 其实可以\(n^2\)枚举角度然后算出面积 近 ...

  4. 2020牛客暑期多校训练营 第二场 J Just Shuffle 置换 群论

    LINK:Just Shuffle 比较怂群论 因为没怎么学过 置换也是刚理解. 这道题是 已知一个置换\(A\)求一个置换P 两个置换的关键为\(P^k=A\) 且k是一个大质数. 做法是李指导教我 ...

  5. 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路

    LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...

  6. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  7. 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心

    LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...

  8. 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP

    LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...

  9. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

随机推荐

  1. gulp之demo

    1.安装gulp cnpm install -g gulp; 2.然后还需要在当前目录安装gulp,具体不详,只知道安装了之后会在当前目录下的node_modules下多一个gulp文件夹 cnpm ...

  2. window的常用操作

    一.window.location location对象属性 1.location.href 属性返回当前页面的 URL. 2.location.pathname 返回路径和方法名称 3.locati ...

  3. 动手实现一个简单的 rpc 框架到入门 grpc (上)

    rpc 全称 Remote Procedure Call 远程过程调用,即调用远程方法.我们调用当前进程中的方法时很简单,但是想要调用不同进程,甚至不同主机.不同语言中的方法时就需要借助 rpc 来实 ...

  4. Linux 进程必知必会

    上一篇文章只是简单的描述了一下 Linux 基本概念,通过几个例子来说明 Linux 基本应用程序,然后以 Linux 基本内核构造来结尾.那么本篇文章我们就深入理解一下 Linux 内核来理解 Li ...

  5. 谈谈你对this的理解

    this的指向不是在编写时确定的,而是在执行时确定的,同时,this不同的指向在于遵循了一定的规则. 1.默认情况下,指向全局,浏览器的话就是指向window 2.如果函数被调用的位置存在上下文,那么 ...

  6. 外部应用复制 表格 到word中 设置表格自适应

    word 批量设置表格宽度自适应 描述 : 我们经常从 外部 如 excel,html 等其他文件 中复制的表格到word 文档 经常会出现在 word 中显示不全的问题 主要是源格式的表格 宽度比 ...

  7. (二)pandas处理丢失数据

    处理丢失数据 有两种丢失数据: None np.nan(NaN) import numpy as np type(None) NoneType type(np.nan) float 1. None N ...

  8. JavaScript之setinterval的具体使用

    关于setInterval在api文档中也有很详细的解释,比如下面那两个: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停 ...

  9. Worktile完成新一轮融资,将发力研发管理赛道

    Worktile 宣布完成B+轮融资.本轮融资由亿联凯泰基金领投,老股东斯道资本.宽带资本跟投.该轮融资将用于公司产品技术研发及市场拓展. 作为企业服务行业的佼佼者,Worktile 始终以打造世界级 ...

  10. bzoj4236JOIOJI

    bzoj4236JOIOJI 题意: 给一个只由JOI三个字母组成的串,求最长的一个子串使其中JOI三个字母出现次数相等.串长度≤200000 题解: 有点像bzoj4384,因此推算的过程是差不多的 ...