Codeforces Round 892 (Div. 2)

news2024/7/6 19:52:52

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.coloradmin.cn/o/871816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TI毫米波雷达笔记】MMWave配置流程避坑

【TI毫米波雷达笔记】MMWave配置流程避坑 在TI SDK目录下的mmwave.h文档说明中 强调了要按以下配置&#xff1a; mmWave API The mmWave API allow application developers to be abstracted from the lower layer drivers and the mmWave link API.The mmWave file should b…

macOS使用ffmpeg与QT进行音视频推拉流

1.先启动流服务器 ./mediamtx 2.开始推流: ffmpeg -re -stream_loop -1 -i /Users/hackerx/Desktop/test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 3. 安装ffmpeg 4.4 brew install ffmpeg4 4.添加ffmpeg头文件目录与库目录 5.链接ffmpeg相关库…

【Rust】Rust学习 第十一章编写自动化测试

Rust 是一个相当注重正确性的编程语言&#xff0c;不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫&#xff0c;不过它不可能捕获所有种类的错误。为此&#xff0c;Rust 也在语言本身包含了编写软件测试的支持。 编写一个叫做 add_two 的将传递…

⑤ Axios网络请求

Axios安装 cnpm install --save axios post请求需要用到的&#xff1a; cnpm install --save querystring(用来转换格式的) 引入 一般是全局引入&#xff0c;在main.js中引入 全局引入后的get和post方式使用 get请求方式 post请求方式 先引入&#xff1a; axios封装…

Android之版本号、版本别名、API等级列表(全)(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

前端性能优化——包体积压缩,打包速度提升,提升浏览器响应的速率

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度&#xff0c;是前端性能优化中非常重要的环节&#xff0c;结合工作中的实践总结&#xff0c;梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令&#xff1a; "…

Java进阶-Oracle(二十)(1)

&#x1f33b;&#x1f33b; 目录 一、Oracle 数据库介绍1、Oracle 的概述2、Oracle 的结构2、Oracle的功能 二、安装与卸载1、卸载2、安装 三、使用&#xff08;需要关注得只有下面这两个&#xff09;四、PLSQL 的简单使用五、DBeaver 的简单使用 一、Oracle 数据库介绍 1、O…

ORB-SLAM2第一节---地图初始化

单目初始化 1.前提条件&#xff08;640*480&#xff09; 参与初始化的两帧各自的特征点数目都需要大于100.两帧特征点成功匹配的数目需要大于或等于100.两帧特征点三角化成功的三维点数目需要大于50. 2.针对条件三 流程如下 记录当前帧和参考帧&#xff08;第一帧&#xff…

MyBaits动态SQL

MyBaits动态SQL <include>用法 <where>用法 <if>用法 CONCATlike使用${...}使用#{...}使用CONCAT()函数连接参数形式 <choose><when><otherwise>例子 limit 字段变量&#xff0c;内部属性“refid”&#xff0c;后跟自定义的一段内容的名字…

什么是管程?

前言 在并发编程领域&#xff0c;最核心的两个理念就是同步和互斥&#xff0c;并发编程就是围绕这两个核心概念来完成的。 互斥&#xff1a;同一时刻只能有一个线程持有共享资源同步&#xff1a;多个线程之间协调、互作 在最初&#xff0c;人们利用信号量机制来实现互斥和同步…

多元最短路(Floyd)

是一个基于动态规划的全源最短路算法。它可以高效地求出图上任意两点之间的最短路 时间复杂度 O(n^3) 状态转移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代码 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

使用巴特沃兹滤波器的1D零相位频率滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用vscode在vue项目中重命名文件选择了更新导入路径仍有部分导入路径没有更新

背景: 将一个js文件重命名&#xff0c;vscode弹出是否更新导入路径&#xff0c;选择更新导入后&#xff0c;发现js文件中导入路径都自动更新&#xff0c;vue文件中路径都没有更新。 解决方案&#xff1a; 在设置中搜索updateimport&#xff0c;将最下面的Vue>Update Imports…

2023/08/13_____JMM JAVA Memory Model JAVA内存模型

JMM JAVA Memory Model java内存模型 作用&#xff1a;缓存一致性协议&#xff0c;用于定义数据读写的规则&#xff08;遵守&#xff0c;找到这个规则&#xff09; JMM定义了线程2工作内存和主内存之间的抽象关系&#xff1a;线程之间的共享变量存储在主内存&#xff08;main …

(贪心) 剑指 Offer 63. 股票的最大利润 ——【Leetcode每日一题】

❓剑指 Offer 63. 股票的最大利润 难度&#xff1a;中等 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天&#xff08;股票价格 1&#xff09;的…

在 Windows 中恢复数据的 5 种方法

发生数据丢失的原因有多种。无论是因为文件被意外删除、文件系统或操作系统损坏&#xff0c;还是由于软件或硬件级别的存储故障&#xff0c;数据都会在您最意想不到的时候丢失。今天我们重点介绍五种数据恢复方法&#xff0c;以应对意外情况的发生。 1.从另一台机器启动硬盘 如…

24近3年内蒙古大学自动化考研院校分析

今天给大家带来的是内蒙古大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、内蒙古大学 学校简介 内蒙古大学位于内蒙古自治区首府、历史文化名城呼和浩特市&#xff0c;距北京400余公里&#xff0c;是中华人民共和国成立后党和国家在民族地区创办的第一所综合大…

阿里云轻量应用服务器使用教程(从购买配置、连接到网站上线)

阿里云轻量应用服务器怎么使用&#xff1f;阿里云百科分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程&#xff1a; 目录 阿里云轻量应用服务器使用教程 步骤一&#xff1a;购买一台轻量应用服务器 步骤二&#xff1a;重置…

深入理解 Vue 3 计算属性:优雅地处理响应式数据计算

计算属性的定义 在 Vue3 的 HTML 模板中是支持 JavaScript 表达式的&#xff0c;例如&#xff1a; <h2>买5个共计&#xff1a;{{ price * 5 }} 元</h2>但是如果当表达式过于复杂时&#xff0c;模板代码就会变得非常臃肿并且可读性就会变差&#xff0c;恰巧&#…

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 通过解释器模式来实现四则运算&#xff0c;如计算ab-c的值&#xff0c;具体要求 先输入表达式的形式&#xff0c;比如abc-de&#xff0c;要求表达式的字母不能重复在分别输入a,b,c,d,e的值最后求出结果 传统方案 编写一个方法&#xff0c;接收表达式的形式&#xf…