LOVER II UVALive - 8522 —— 线段树区间比较的方法

2024-04-07 00:18

本文主要是介绍LOVER II UVALive - 8522 —— 线段树区间比较的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

This way

题意:

给你n个女生和m个男生的值,如果第i个女生的值和第j个男生的值相加>=k,他们就可以在一起,现在有q次询问,每次问你l-r的区间内的男生能否将所有女生拿下。

题解:

这题我想了很久啊,到结束过10分钟才想出来,但是有点复杂,就不敲了。看了别人的代码感觉和我差不多,但是方法比我简单,很优秀,推崇。
首先将所有a变成k-a,为什么,因为直接比较大小一般比相加再比较大小来的方便。然后将所有a排个序,这时候build线段树:最左边设为-n-1,第二个设为-n,最右边设为-1.为什么要这么设?因为右边的数比左边的大,所以当一个男生的值比较大的时候,就可以替代比较小的值的要求。当mi[1]>=0的时候就代表所有女生都找到了男生。之后就是枚举左端点找每个左端点至少的右端点在哪才能将所有女生匹配,这时候就用类似尺取的方法即可。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int mi[N*4],flag[N*4],a[N],b[N],rig[N];
void push_down(int root)
{if(!flag[root])return ;mi[root<<1]+=flag[root];mi[root<<1|1]+=flag[root];flag[root<<1]+=flag[root];flag[root<<1|1]+=flag[root];flag[root]=0;
}
void build(int l,int r,int root,int n)
{if(l==r){mi[root]=l-n-1;flag[root]=0;return ;}int mid=l+r>>1;build(l,mid,root<<1,n);build(mid+1,r,root<<1|1,n);mi[root]=min(mi[root<<1],mi[root<<1|1]);
}
void update(int l,int r,int root,int ql,int qr,int val)
{if(l>=ql&&r<=qr){mi[root]+=val;flag[root]+=val;return ;}push_down(root);int mid=l+r>>1;if(mid>=ql)update(l,mid,root<<1,ql,qr,val);if(mid<qr)update(mid+1,r,root<<1|1,ql,qr,val);mi[root]=min(mi[root<<1],mi[root<<1|1]);
}
int query(int l,int r,int root,int ql,int qr)
{if(l>=ql&&r<=qr)return mi[root];push_down(root);int ans=1e9;int mid=l+r>>1;if(mid>=ql)ans=min(ans,query(l,mid,root<<1,ql,qr));if(mid<qr)ans=min(ans,query(mid+1,r,root<<1|1,ql,qr));return ans;
}
int main()
{int t;while(~scanf("%d",&t)){while(t--){int n,m,k,q;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]=k-a[i];sort(a+1,a+1+n);build(1,n,1,n);for(int i=1;i<=m;i++)scanf("%d",&b[i]);int l=1,r=0;while(l<=m){if(r<l){int p=upper_bound(a+1,a+1+n,b[++r])-a-1;if(p)update(1,n,1,1,p,1);}while(mi[1]<0&&r<m){int p=upper_bound(a+1,a+1+n,b[++r])-a-1;if(p)update(1,n,1,1,p,1);}if(mi[1]<0)rig[l]=1e9;elserig[l]=r;int p=upper_bound(a+1,a+1+n,b[l++])-a-1;if(p)update(1,n,1,1,p,-1);}scanf("%d",&q);while(q--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",rig[l]<=r);}}}return 0;
}

这篇关于LOVER II UVALive - 8522 —— 线段树区间比较的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881206

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验