当前位置: 首页 > news >正文

两个数组的差值累加和转线段问题

今天这两题都是从Codeforces上扒的,主要是因为也算是一种题型吧

D. Absolute Beauty

思路:这题的思路我只能说还是比较巧妙的,这题也是看了题解才知道该怎么去做

我们可以将ai和bi作为一个线段的两个端点,我们此时来考虑两个线段之间的三种情况

1.两个线段没有交集

我们考虑同向线段,a1<b1&&a2<b2;

那么交换线段后的增加值就是两个线段之间的间隔的二倍

我们来考虑异向线段,a1<b1&&a2>b2

那么交换线段后的增加值还是两个线段之间的间隔的二倍

2.假如线段有一段交集,但是并不会发生一个线段包含另一个线段

不论是同向线段还是异向线段,交换都没有任何值的改变

3假设一个线段包含另一个线段

不论是同向线段还是异向线段,交换都没有任何值的改变

 因此,我们只需要让两个直线之间的间隔最大就可以找到最大的值,那么,当a[i]>b[i]的时候,直接交换a[i]和b[i]的值

然后对a数组和b数组进行排序,找到最大的a数组的值减去b数组的最小的值,是否是一个正数,如果是正数,那么就可以在原来线段的基础上,加上两倍的这个数

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[200005];
int b[200005]; 
void solve()
{cin>>n;int ans=0;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){cin>>b[i];if(b[i]<a[i])swap(b[i],a[i]);ans+=b[i]-a[i];}sort(a+1,a+1+n);sort(b+1,b+1+n);cout<<ans+max(0LL,2*(a[n]-b[1]))<<"\n";
}signed main()
{cin>>t;while(t--)solve();return 0;
}

F. Swapping Problem

题意:让你求交换一次后的最小值是多少

我们还是进行上述的分析 

1.两个线段没有交集

不论是同向线段还是异向线段,交换都没有任何值的改变

2.假如线段有一段交集,但是并不会发生一个线段包含另一个线段

同向线段,交换都没有任何值的改变

异向线段,交换后减少2倍的区间交集

3假设一个线段包含另一个线段

同向线段,交换都没有任何值的改变

异向线段,交换后减少2倍的区间交集

那么我们的思路就很明确了,找到最大的重叠区间,但是时间复杂度为O(n^2),很明显是不对的

那么我们要考虑别的方法了,我们可以首先现将区间按照右区间的大小进行升序排序,然后我们从大到小区枚举每个区间,在枚举区间的时候,我们同时去记录同向线段左端点最小值和异向线段左端点最小值,找到最大的重叠部分即可

#include<bits/stdc++.h>
using namespace std;
#define int long longint t;
int n,k;
int a[200005];
int b[200005];
int f[2];
struct node{int a;int b;int t;
}q[200005];bool cmp(node x,node y)
{return x.b<y.b;
}void solve()
{int ans=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){cin>>b[i];if(a[i]>b[i]){q[i].t=1;swap(a[i],b[i]);}q[i].a=a[i];q[i].b=b[i];ans+=b[i]-a[i];}sort(q+1,q+1+n,cmp);int len=0;f[0]=0x3f3f3f3f,f[1]=0x3f3f3f3f;//表示正向线段左端点最小,异向线段左端点最小 for(int i=n;i>=1;i--){int flag=q[i].t;if(f[flag^1]<q[i].b){len=max(len,q[i].b-max(q[i].a,f[flag^1]));}f[flag]=min(f[flag],q[i].a);}cout<<ans-2*len;
}signed main()
{t=1;while(t--)solve();return 0;
}

 


http://www.mrgr.cn/news/58093.html

相关文章:

  • fcntl,非阻塞模式,CLOEXEC和管道pipe,execlp-del
  • Halcon基础-瓶盖带角度的OCR批量识别
  • learn C++ NO.28——C++11
  • 啤酒酿造·锥形罐发酵液有苦味?别担心!
  • FIR数字滤波器在MATLAB中的实现
  • Meta推出OMat24:AI驱动材料发现迈向新纪元
  • 华为开发者工具HarmonyNext (5.0)创建第一个项目并且设置工作区为中文目录
  • OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR
  • SQL注入之账号登入
  • 【SQL基础:语法、分类与DDL操作全解析】
  • 我毕业后的8年嵌入式工作
  • 1024玩码神挑战赛,太太太上头了!!!
  • 虚拟机配置静态IP地址(人狠话不多简单粗暴)
  • Lucas带你手撕机器学习——朴素贝叶斯
  • 微知SOP-定位Linux crash问题的几个常用方面和常用命令?
  • php命令执行的一些执行函数----以ctfshow靶场为解题思路
  • 超级加速:轻松发现开源项目的终极秘籍
  • 文本相似度方案
  • 【OS】2.1.2 进程的状态与转换_进程的组织
  • 关闭或开启Win11系统的自动更新
  • 软件部署-Docker容器化技术(二)
  • Electron调用nodejs的cpp .node扩展【安全】
  • 【软件工程】软件项目管理/工程项目管理复习资料
  • 案例研究|DataEase嵌入式版助力软件开发商提升行业软件交付效率
  • SAM:Segment Anything
  • LSTM(Long Short-Term Memory,长短期记忆网络)在高端局效果如何