E. Anonymity Is Important 【推断题(线段树|STL)】
题目

题意

给出若干次询问,当询问类型为1的时候,给出当前病人有病/无病/不确定的判断。
首先可以想到用set存储【不确定有病/无病】患者的下表,这样以来,凡是set中未出现的下标,对应的病人都是健康 无病的。关键在于怎么判断set中的患者是有病还是不确定。
显然,对于一个【未确定】的患者ppp,如果存在一个区间[a,b][a,b][a,b]使得p∈[a,b]p \in [a,b]p∈[a,b],且[a,b][a,b][a,b]中除了ppp之外,其他都不在set中了,则说明ppp确定有病。我们可以考虑在set中ppp之前的所有j∈[pre(p)+1,p]j \in [pre(p) + 1,p]j∈[pre(p)+1,p],jjj的右端点的最小值。设该最小值为posmin(j)posmin(j)posmin(j),如果posmin(j)<next(p)posmin(j) < next(p)posmin(j)<next(p),则ppp一定有病,否则是不确定。
注意:在区间右端点维护时,一定是随着左端点递增的。因为如果不是递增的,则一定存在区间包含关系,这样,大区间没有任何信息价值。

特别提醒

在通过遍历的方法erase元素的时候,应该避免这种写法:

for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter){cout<<iter->first<<":"<<iter->second<<endl;mapTest.erase(iter);
}

原因在于,当执行for循环里的++iter时,iter已经失效,这属于未定义行为
而以下方法是被推荐的:

for(ITER iter=mapTest.begin();iter!=mapTest.end();){cout<<iter->first<<":"<<iter->second<<endl;mapTest.erase(iter++);
}for(ITER iter=mapTest.begin();iter!=mapTest.end();){cout<<iter->first<<":"<<iter->second<<endl;iter=mapTest.erase(iter);
}

这样是通过迭代器删除元素的正确方法。

STL(map + set做法)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
using namespace std;
int main(){set<int> S;map<int,int> mp;int n,q;scanf("%d%d",&n,&q);for(int i = 0;i <= n+1;i++){S.insert(i);}    // mp[0] = 0;
//  mp[n+1] = n+1;for(int i = 0;i < q;i++){int t;scanf("%d",&t);if(!t){int l,r,x;scanf("%d%d%d",&l,&r,&x);if(x == 0){auto it = S.lower_bound(l);for(;it != S.end() && *it <= r;){it = S.erase(it);}}else{auto gt = mp.lower_bound(l);if(gt != mp.end() && gt->second <= r){continue;}mp[l] = r;auto it = mp.lower_bound(l);for(;it != mp.begin() && (prev(it)->second >= r);){mp.erase(prev(it));}}}else{int x;scanf("%d",&x);if(!S.count(x)){printf("NO\n");}else{auto pre = S.lower_bound(x);pre = prev(pre);int nxt = *S.upper_bound(x);auto it = mp.upper_bound(*pre);if(it != mp.end() && it->first <= x && it->second < nxt){printf("YES\n");}else{printf("N/A\n");}}}}return 0;
}

线段树做法

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
const int N = 2e5+5;
typedef struct Node{int l,r;int minv;
}Node;Node tr[N << 2];
int a[N];
inline void pushup(int u){tr[u].minv = min(tr[u << 1].minv,tr[u << 1|1].minv);return ;
}void build(int u,int l,int r){tr[u].l = l;tr[u].r = r;tr[u].minv = 1e9;if(l == r)return ;int mid = l + r >> 1;build(u << 1,l,mid);build(u << 1|1,mid+1,r);pushup(u);return ;
}int query(int u,int l,int r){if(tr[u].l >= l && tr[u].r <= r){return tr[u].minv;}int minv = 1e9;int mid = tr[u].l + tr[u].r >> 1;if(l <= mid)minv = min(query(u << 1,l,r),minv);if(r > mid)minv = min(query(u << 1|1,l,r),minv);return minv;
}void modify(int u,int x,int v){if(tr[u].l == tr[u].r){tr[u].minv = min(tr[u].minv,v);return ;}int mid = tr[u].l + tr[u].r >> 1;if(x <= mid)modify(u << 1,x,v);elsemodify(u << 1|1,x,v);pushup(u);return ;
}int main(){int n,q;scanf("%d%d",&n,&q);set<int> S;for(int i = 0;i <= n+1;i++)S.insert(i);build(1,1,n);for(int i = 1;i <= q;i++){int t;scanf("%d",&t);if(t == 0){int l,r,x;scanf("%d%d%d",&l,&r,&x);if(x == 0){auto it = S.lower_bound(l);for(;it != S.end() && *it <= r;){it = S.erase(it);}}else{modify(1,l,r);}}else{int x;scanf("%d",&x);if(S.count(x) == 0){printf("NO\n");}else{auto px = S.lower_bound(x);int pre = *(prev(px));int nxt = *(next(px));int minv = query(1,pre+1,x);if(minv < nxt){printf("YES\n");}else{printf("N/A\n");}}}}return 0;
}

codeforces E. Anonymity Is Important 【推断题(线段树|STL)】相关推荐

  1. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  2. CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)

    CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换)   首先一共有四个操作,第一个和第四个都是线段树的基本操作,直接用线段树实现.      第 ...

  3. 「一题多解」【CodeForces 85D】Sum of Medians(线段树 / 分块)

    题目链接 [CodeForces 85D]Sum of Medians 题目大意 实现一个setsetset,支持插入,删除,求∑a5k+3∑a5k+3\sum a_{5k+3}.注意,setsets ...

  4. Codeforces 671E Organizing a Race (贪心、线段树)

    题目链接 https://codeforces.com/contest/671/problem/E 题解 完全不会做--基本是抄lk的代码 ruogu的题解: https://www.luogu.co ...

  5. CodeForces 438D - The Child and Sequence(线段树)

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

  6. Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)

    F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...

  7. Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)

    题目链接 \(Description\) 给定串\(S\)和\(m\)个串\(T_i\).\(Q\)次询问,每次询问\(l,r,p_l,p_r\),求\(S[p_l\sim p_r]\)在\(T_l\ ...

  8. C#LeetCode刷题-线段树

    线段树篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 493 翻转对 ...

  9. Codeforces 1089K King Kog's Reception(线段树)

    题目链接:https://codeforces.com/contest/1089/problem/K 题意: 有一些骑士要去见国王,公主也要见国王 给你q个询问,询问有三种操作, 1.+ t d 表示 ...

最新文章

  1. Ruby系统中的AJAX开发技术简析
  2. 公司内部 action调用持久层规范
  3. flutter 图解_Flutter自绘组件:微信悬浮窗(三)
  4. 我的世界服务器破坏方块有延迟,问一下我的世界游戏方块不会被破坏的指令以及指令适用于游戏的版本 我记得在服务器上和单机上好像有不同的指令...
  5. C3P0 释放连接 的问题
  6. Python程序检查字符串是否是回文
  7. mysql engine 和type_type=INNODB和engine=INNODB的区别
  8. CCF201812-1 小明上学(100分)【序列处理】
  9. 在窗体创建时显示窗体
  10. Vim安装gruvbox配色教程,切换黑暗模式
  11. (亲测)躺着破解IDM下载权限,治疗不用破解补丁的强迫症们
  12. 【人工智能】无人车系统仿真软件-PreScan
  13. 生物特征识别:小面积指纹识别算法(二)
  14. JavaSE银行账户管理系统
  15. Facebook营销策略大全,脸书营销技巧详细教程
  16. linux 类似winscp_什么是类似于WinSCP的程序?
  17. 自费送几本豆瓣9.0高分Python书籍,助你涨薪至30K
  18. 生物信息学算法之Python实现|Rosalind刷题笔记:003 中心法则:翻译
  19. 华为计算机单机pc游戏软件,华为应用市场pc端
  20. GCC编译器原理(二)------编译原理一:目标文件

热门文章

  1. 跨境电商,50+爆款案例,揭示独立站选品7大逻辑
  2. 企业能耗在线监测系统
  3. 理论力学专题----拉普拉斯一龙格一楞次矢量
  4. 视频编码器效率评价标准:BDPSNR和BDBR
  5. 计算机毕业设计基于Android的在线相册管理系统
  6. 2016年度最受欢迎中国开源软件评选,开源中国、博文视点,阿里独占四席
  7. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest A. LaIS
  8. 三同轴连接器_三同轴连接器和线缆的定义与用途
  9. Linux:命令行使用技巧
  10. 不安装第三方软件,Windows 10录屏技巧