大佬博客 https://www.cnblogs.com/zinthos/p/3899565.html

题目:https://codeforces.com/problemset/problem/1080/F

题目大意:

  给你k个线段,每个线段属于一个集合(n),每次查询a,b,x,y,求[a,b]的集合是否都存在一个区间[l,r]使得l<=x&&r>=y

解法:

  题目等同于,对于[a,b]中的每一个集合,左端点大于x的线段中最小的右端点,的最大值是否<=y;

  对线段排序(根据左端点l值),根据线段左端点值l由大到小依次插入更新线段树(插入时维护最小值),线段树维护[1,n]上的最大的区间右端点值(所有的 集合的最小右端点 的最大值),每次更新需要复制的节点数最多为log个,端点数最多为nlogn

#include<bits/stdc++.h>
using namespace std;
#define freread freopen("input.txt","r",stdin);
#define frewrite freopen("output.txt","w",stdout);
typedef long long ll;
const int maxn=3e5+;
const int inf=(1LL<<)-;
int n,m,k,ar[maxn];
struct node{
int l,r,mx;
}no[];
struct data{
int l,r,v;
operator < (const data& other){
return l<other.l;
}
void prin(){
cout<<"da = "<<l<<" "<<r<<" "<<v<<endl;
}
}da[maxn];
int root[maxn],tot=;
void newNode(int& u,int p){
u=++tot;
no[u]=no[p];
}
void push(int x){
no[x].mx=max(no[no[x].l].mx , no[no[x].r].mx);
}
void build(int l,int r,int &o){
newNode(o,);
if(l==r){
no[o].mx=inf;
return ;
}
int mid=l+r>>;
build(l,mid,no[o].l);
build(mid+,r,no[o].r);
push(o);
}
void ensert(int l,int r,int& o,int pre,int a,int b){
newNode(o,pre);
if(l==r){
no[o].mx=min(no[o].mx, b);
return ;
}
int mid=l+r>>;
if(a<=mid)ensert(l,mid,no[o].l,no[o].l,a,b);
else ensert(mid+,r,no[o].r,no[o].r,a,b);
push(o);
}
int que(int l,int r,int o,int a,int b){
if(l==a && r==b){
return no[o].mx;
}
int mid=l+r>>;
int ans=;
if(a<=mid)ans=max(ans, que(l,mid,no[o].l,a,min(b,mid)));
if(b>mid)ans=max(ans, que(mid+,r,no[o].r,max(a,mid+),b));
return ans;
}
int findpos(int x){
int l=,r=k+;
while(l<r){
int mid=(l+r)>>;
if(da[mid].l>=x)r=mid;
else l=mid+;
}
return l;
} int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++){
scanf("%d%d%d",&da[i].l,&da[i].r,&da[i].v);
}
sort(da+,da+k+);
build(,n,root[k+]);
for(int i=k;i>=;i--){
ensert(,n,root[i],root[i+],da[i].v,da[i].r);
}
da[k+].l=1e9+;
while(m--){
int a,b,x,y;
scanf("%d%d%d%d",&a,&b,&x,&y);
int ans=que(,n,root[findpos(x)],a,b);
puts(ans<=y? "yes":"no");
fflush(stdout);
}
return ;
}

最新文章

  1. 安装第三方APP好的站点及解除安全与隐私限制
  2. js 正则表达式中的惰性匹配
  3. Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest
  4. javascript div z-index, input tabindex属性说明
  5. boost之algorithm/string
  6. DataGuard开启延时应用的测试
  7. vue基础5-生命周期
  8. 自学python 8.
  9. hdoj:2048
  10. 交换路由中期测验20181226(动态路由配置与重分发、NAT转换、ACL访问控制列表)
  11. RBAC权限管理及使用原生PHP实现
  12. solr学习
  13. SSH端口转发详解及实例-转载
  14. P4091 [HEOI2016/TJOI2016]求和
  15. 安装ik分词器以及版本和ES版本的兼容性
  16. javascript 20个正则表达式
  17. uva--242(邮资问题 dp)
  18. android 自定义照相机Camera黑屏 (转至 http://blog.csdn.net/chuchu521/article/details/8089058)
  19. 浅谈css中浮动和清除浮动带来的影响
  20. 搭建jetbrains 注册服务器

热门文章

  1. 动态规划:LIS
  2. 元类编程-- metaclass
  3. shell 25个常用命令
  4. 【BZOJ2288】生日礼物 [贪心]
  5. 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
  6. Vuejs - 组件式开发
  7. 网络设备之net_device结构与操作
  8. linux===Ubuntu修改设备名称
  9. qt-creator
  10. 23:django 信号(signal)