Codeforces Round 892 (Div. 2)

A.最大值只能由自己除,所以无解的情况只能是全部相同,否则直接最大值放c即可

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;int n,m,k;
int a[N],b[N];void solve(){set<int> st;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];st.insert(a[i]);}if(st.size()==1) cout<<"-1\n";else{vector<int> c,d;auto mx=*st.rbegin();for(int i=1;i<=n;i++)if(a[i]==mx) c.push_back(a[i]);else d.push_back(a[i]);cout<<d.size()<<" "<<c.size()<<"\n";for(auto x:d) cout<<x<<" ";cout<<'\n';for(auto x:c) cout<<x<<" ";cout<<'\n';}}
signed main(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();return 0;
}

B.b直接枚举其他数组的最小值放到当前数组(其他数组的最小值集中放在一个数组肯定最优的)

所以记录一下最小值和次小值即可

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
#define int long long
int n,m;
vector<int> a[N];
int mn1[N],mn2[N];
void solve(){cin>>n;int res=0;for(int i=1;i<=n;i++){cin>>m;a[i].clear();for(int j=1;j<=m;j++){int x;cin>>x;a[i].push_back(x);}sort(a[i].begin(),a[i].end());mn1[i]=a[i][0];mn2[i]=a[i][1];res+=mn1[i];}int mx=res;vector<int> mn(n+10,0x3f3f3f3f);for(int i=n;i>=1;i--) mn[i]=min(mn[i+1],mn1[i]);vector<int> s1(n+10,0);vector<int> s2(n+10,0);for(int i=1;i<=n;i++) s1[i]=s1[i-1]+mn1[i],s2[i]=s2[i-1]+mn2[i];vector<int> l(n+10,0x3f3f3f3f);vector<int> r(n+10,0x3f3f3f3f);for(int i=1;i<=n;i++) l[i]=min(l[i-1],mn1[i]);for(int i=n;i>=1;i--) r[i]=min(r[i+1],mn1[i]);for(int i=1;i<=n;i++){int now=s2[n]-mn2[i]+min({mn1[i],l[i-1],r[i+1]});mx=max(mx,now);}cout<<mx<<"\n";
}signed main(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

C.

额直接打表看的规律,直接调用next_permuatation 打表前10个答案的数组,观察一下可得

前半部分按顺序,后半部分翻转即可

 

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
#define int long long
int n,m;
//int a[N];
int b[N];
void solve(){cin>>n;if(n==2){cout<<2<<"\n";return ;}int res=0;vector<int> s(n+10,0);vector<int> mx(n+10,0);for(int i=1;i<=n;i++){b[i]=i;s[i]=s[i-1]+b[i]*i;mx[i]=max(mx[i-1],b[i]*i);}for(int i=1;i<=n;i++){int now=s[i];int nw=n;int mxx=0;for(int j=i+1;j<=n;j++){now+=nw*j;mxx=max(mxx,nw*j);nw--;}mxx=max(mxx,mx[i]);res=max(res,now-mxx);}cout<<res<<"\n";}signed main(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

D:

如果当前点在[l,r]中,那么他可以通过跳跃到有交集的且比当前区间靠右的那个区间的b那里

比如起点在第一个区间,无论在哪个点都能跳到b1,如果在b1那么和他相交的下一个区间她也能跳到b2,因为相交l<=b1

如果在当前点>b1 那么她依然能跳到b1,且更大可能能跳到下一个区间,且它依然能利用b1这个点跳跃到下一个区间

所以其实能跳跃的区间范围是[l,b],直接合并有交集的跳跃区间即可

 

所以可以直接预处理出当前点能往右跳到哪里,最后二分出当前询问的点在哪个区间,

我用的并查集合并的

 还有个问题就是二分的时候按照左端点排序,二分出最靠右的区间r>=l

因为第一个红线和第二个红线其实已经合并了,但是都没r优,所以要二分出最靠右的区间r>=l

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;int n,m,k;
PII a[N];
class dsu {public:vector<int> p;vector<int> mx;int n;dsu(int _n) : n(_n) {p.resize(n);iota(p.begin(), p.end(), 0);mx.resize(n);}inline int get(int x) {return (x == p[x] ? x : (p[x] = get(p[x])));}inline bool unite(int x, int y) {x = get(x);y = get(y);if (x != y) {mx[y]=max(mx[x],mx[y]);p[x] = y;return true;}return false;}
};void solve(){cin>>n;dsu d(n+10);for(int i=1;i<=n;i++){int l,r,bb,aa;cin>>l>>r>>aa>>bb;a[i]={l,bb};}sort(a+1,a+1+n,[&](const auto&p,const auto&q){return p.first<q.first; });for(int i=1;i<=n;i++) d.mx[i]=a[i].second;for(int i=2;i<=n;i++){int l=a[i].first,r=a[i].second;int x=d.get(i-1),y=d.get(i);if(l<=d.mx[x]){d.unite(x,y);}}int q;cin>>q;while(q--){int x;cin>>x;int res=x;int l=1,r=n;while(l<r){int mid=l+r+1>>1;if(a[mid].first<=x) l=mid;else r=mid-1;}if(a[l].first<=x&&d.mx[d.get(l)]>=x){res=max(res,d.mx[d.get(l)]);}if(q)cout<<res<<" ";else cout<<res<<"\n";}
}
signed main(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();return 0;
}

E:

设f为前i个点,且当前线段长度总和为k的贡献最大值

复杂度是n*k*k,因为要枚举当前长度和上一个线段总和的长度

考虑优化把绝对值拆开

首先ai和bi已经枚举了,且下标一样,所以已经固定了,接下来就是维护另一个aj和bj

 

copy一下别人的,别人写的清晰 

#include<bits/stdc++.h>
using namespace std;
const int N = 3010,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;int n,m,k;
int a[N],b[N];
int mx[2][2][N];
void solve(){cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];memset(mx,-0x3f,sizeof(mx));vector<vector<int>> f(n+10,vector<int>(k+10,0));for(int i=1;i<=n;i++){for(int j=1;j<=min(i,k);j++){for(int x=0;x<2;x++){for(int y=0;y<2;y++){mx[x][y][i - j] = max(mx[x][y][i - j], f[i - 1][j - 1] + (x == 0 ? a[i] : -a[i]) + (y == 0 ? b[i] : -b[i]));}}for(int x=0;x<2;x++){for(int y=0;y<2;y++){f[i][j]=max(f[i][j],f[i-1][j]);f[i][j]=max(f[i][j],mx[x][y][i-j]+ (x == 0 ? -b[i] : b[i]) + (y == 0 ? -a[i] : a[i]));}}}}cout<<f[n][k]<<"\n";}
signed main(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/65862.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 一种求平方根的方法 立方根也可以 极大 极小都可以

不知道研究这些干啥&#xff0c;纯纯的浪费时间。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…

YAMLException: java.nio.charset.MalformedInputException: Input length = 1

springboot项目启动的时候提示这个错误&#xff1a;YAMLException: java.nio.charset.MalformedInputException: Input length 1 根据异常信息提示&#xff0c;是YAML文件有问题。 原因是yml配置文件的编码有问题。 需要修改项目的编码格式&#xff0c;一般统一为UTF-8。 或…

大数据Flink(六十二):批处理的入门案例

文章目录 批处理的入门案例 一、示例 二、​​​​​​​开发步骤

差分升级在物联网水表上的实现与应用(学习)

摘要 当越来越多的物联网水表加入抄表系统后&#xff0c;实现了水表数据的信息化&#xff0c;并且当水表终端需要技术更新时&#xff0c;通过网络方式来升级产品可以高效修复设备面临的问题&#xff0c;减少用户损失&#xff0c;降低维护成本&#xff0c;但同时也对有限的网络…

【MySQL】并发执行事务可能存在的问题, 事务的四种隔离级别

文章目录 前言一、并发执行事务可能存在的问题1, 脏读问题2, 不可重复读3, 幻读 二、MySQL 的四种隔离级别1, READ UNCOMMITTED 读未提交2, READ COMMITTED 读已提交3, REPEATABLE READ 可重复读 (MySQL 的默认事务隔离级别)4, SERIALIZABLE 串行化 总结 前言 各位读者好, 我是…

Prometheus技术文档-基本使用-配置文件全解!!!!!

简介&#xff1a; Prometheus是一个开源的系统监控和告警系统&#xff0c;由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种时间序列数据&#xff0c;比如系统性能、网络延迟、应用程序错误等。Prometheus通过采集监控数据并存储在时间序列数据库中&#xff0c;…

推荐几款流行的项目管理系统,助力高效团队协作!

项目式管理是目前非常流行的企业管理方法&#xff0c;这种方法让是如何在确保时间、技术、经费和性能指标的条件下&#xff0c;以尽可能高的效率完成预定目标&#xff0c;让所有与企业相关方满意。在这种模式下&#xff0c;团队的层次关系不再那么重要&#xff0c;大家以项目结…

向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案

三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…

【RocketMQ入门-安装部署与Java API测试】

【RocketMQ入门-安装部署与Java API测试】 一、环境说明二、安装部署三、Java API 编写Producer和Consumer进行测试四、小结 一、环境说明 虚拟机VWMare&#xff1a;安装centos7.6操作系统源码包&#xff1a;rocketmq-all-5.1.3-source-release.zip单master部署&#xff0c;在…

代码随想录算法训练营之JAVA|第二十八天|122. 买卖股票的最佳时机 II

今天是第28天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 122. 买卖股票的最佳时机 IIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 第一想法 题目理解&#xff1a;找到一个升序的段&#xff0c;然后累加每一个升序的段头尾的…

【Git】版本控制器详解之git的概念和基本使用

版本控制器git 初始Gitgit的安装git的基本使用初始化本地仓库配置本地仓库三区协作添加---add修改文件--status|diff版本回退--reset撤销修改删除文件 初始Git 为了能够更⽅便我们管理不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是⼀个可以记…

CentOS7.7.1908升级python3版本

介绍 本文将详细介绍在CentOS7.7.1908系统的服务器将自带的python版本升级到3.8.0版本的过程。 在升级前CentOS7.7.1908中已经存在旧python版本。 查看CentOS版本命令&#xff1a; cat /etc/centos-release升级前后的python版本&#xff08;python3升级前为3.6.8&#xff09…