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