Codeforces Round 914 (Div. 2)(A-D全是思维+数据结构优化)

2023-12-11 01:04

本文主要是介绍Codeforces Round 914 (Div. 2)(A-D全是思维+数据结构优化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A - Forked!

求他们相交的地方,直接枚举两个点走日字型的相交的点,

然后如果a=b,会重复,从8个格子变成4个格子

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=998244353;typedef long long LL;
typedef pair<int, int> PII;
typedef unsigned long long ULL;const long long inf=1e17;
using node=tuple<int,int,int,int>;
int n,m,k;void solve()
{int a,b;cin>>a>>b;int dx[8]={-a,-a,-b,-b,a,a,b,b},dy[8]={b,-b,a,-a,b,-b,a,-a};int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;int res=0;for(int i=0;i<8;i++){for(int j=0;j<8;j++){if(x1+dx[i]==x2+dx[j]&&y1+dy[i]==y2+dy[j])res++;}}if(a==b) res/=4;cout<<res<<"\n";
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

B - Collecting Game

直接排序,双指针

排序完后,如果当前要求的是i点,那么直接求i点能往右到达的最右的点即可

因为排序后是递增,所以是满足单调性的

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
const long long inf=1e17;
using node=tuple<int,int,int,int>;
int n,m,k;
PII a[N];
int res[N];
void solve()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i].first;a[i].second=i;}sort(a+1,a+1+n);int now=0;vector<int> s(n+10);for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i].first;int idx=0;for(int i=1;i<=n;i++){while(idx<=i){now+=a[idx].first;idx++;}while(idx<=n&&now>=a[idx].first){now+=a[idx].first;idx++;}res[a[i].second]=max(0ll,idx-2);}for(int i=1;i<=n;i++) cout<<res[i]<<" \n"[i==n];   
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

C - Array Game

C:分类讨论
k>=3:随便选两个不同的 i,j 然后第三次直接自己剪掉自己就行了
abs(3-9) abs(3-9) 0
k=1:min(数组的最小值,当前数组的绝对值最小值)
k=2::min(数组的最小值,当前数组的绝对值最小值)
当前数组的绝对值最小值和数组里面的数产生新的绝对值

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
typedef unsigned long long ULL;const long long inf=1e17;
using node=tuple<int,int,int,int>;
int n,m,k;
int a[N];
int res[N];
void solve()
{cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];if(k>=3){cout<<0<<"\n";return ;}sort(a+1,a+1+n);int mn=*min_element(a+1,a+1+n);for(int i=2;i<=n;i++)mn=min(mn,a[i]-a[i-1]);if(k==1){cout<<mn<<"\n";return ;}set<int> st;for(int i=1;i<=n;i++) st.insert(a[i]);// cout<<mn<<"\n";for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){int x=abs(a[i]-a[j]);auto it=st.lower_bound(x);mn=min(mn,abs(*it-x));if(it==st.begin()) continue;it--;mn=min(mn,abs(*it-x));//cout<<i<<" "<<j<<" "<<mn<<"\n";}}cout<<mn<<"\n";}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

D1 - Set To Max (Easy Version)


枚举每个数能不能改变的
假设当前枚举 i=3
当前下标往左的第一个a[j]==b[i]的数或者 当前下标往右第一个a[j]==b[i]的数
有两种情况是走不到的
k属于 [j+1:i-1]
就如果 中间b[k]<b[i]或者就是中间a[k]>b[i]
中间b[k]>b[i]:[j+1:i-1]这个区间的b[k]>=b[i] --->这个区间的b的最小值要大于b[i]
中间a[k]>b[i]:[j+1:i-1]这个区间的所有数的a[k]<=b[i] --->这个区间的a最大值不能大于b[i]

a[i]>b[i] 直接 no

第一个是easy版本

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,mod=998244353;
#define int long long
typedef long long LL;
typedef pair<int, int> PII;
typedef unsigned long long ULL;const long long inf=1e17;
using node=tuple<int,int,int,int>;
int n,m,k;
int a[N],b[N];
void solve()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int j=1;j<=n;j++) cin>>b[j];for(int i=1;i<=n;i++){if(a[i]==b[i]) continue;if(a[i]>b[i]){cout<<"NO\n";return ;}bool ok=false;for(int j=i-1;j>=1;j--){if(b[j]<b[i]||a[j]>b[i]){break;    }if(a[j]==b[i]){ok=true;break;}}for(int j=i+1;j<=n;j++){if(b[j]<b[i]||a[j]>b[i]){break;    }if(a[j]==b[i]){ok=true;break;}}if(!ok){cout<<"NO\n";return ;}}cout<<"YES\n";
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

优化版本就是用个st表求区间最值

拿个set二分左边第一个当前的数和右边第一个当前的数

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,mod=998244353;typedef long long LL;
typedef pair<int, int> PII;
typedef unsigned long long ULL;const long long inf=1e17;
using node=tuple<int,int,int,int>;
int n,m,k;
int a[N],b[N];
int f[N][25],g[N][20];
void init(){for (int j = 0; j < 20; j ++ )for (int i = 1; i + (1 << j)-1<=n; i ++ )if (!j) f[i][j] = a[i],g[i][j]=b[i];else {f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);g[i][j] = min(g[i][j - 1], g[i + (1 << (j - 1))][j - 1]);}
}
int querya(int l,int r){int len=r-l+1;int k=log(len)/log(2);return max(f[l][k],f[r-(1<<k)+1][k]);
}
int queryb(int l,int r){int len=r-l+1;int k=log(len)/log(2);return min(g[l][k],g[r-(1<<k)+1][k]);
}
void solve()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int j=1;j<=n;j++) cin>>b[j];init();map<int,set<int>> mp;for(int i=1;i<=n;i++){mp[a[i]].insert(-2e9);mp[a[i]].insert(2e9);mp[a[i]].insert(i);}for(int i=1;i<=n;i++){if(a[i]==b[i]) continue;if(a[i]>b[i]||!mp.count(b[i])){cout<<"NO\n";return ;}auto it=mp[b[i]].lower_bound(i);bool ok=false;if(*it!=2e9){int x=*it;if(queryb(i+1,x)>=b[i]&&querya(i+1,x)<=b[i])ok=true;}it--;if(*it!=-2e9){int x=*it;if(queryb(x,i-1)>=b[i]&&querya(x,i-1)<=b[i])ok=true;}if(!ok){cout<<"NO\n";return ;}// bool ok=false;//   for(int j=i-1;j>=1;j--){//       if(b[j]<b[i]||a[j]>b[i])//       {//             break;    //       }//       if(a[j]==b[i])//       {//           ok=true;break;//       }//   }//     for(int j=i+1;j<=n;j++){//         if(b[j]<b[i]||a[j]>b[i])//       {//             break;    //       }//       if(a[j]==b[i]){//           ok=true;break;//       }//   }//   if(!ok){//       cout<<"NO\n";return ;//   }}cout<<"YES\n";
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int t=1;cin>>t;while(t--) solve();
}

这篇关于Codeforces Round 914 (Div. 2)(A-D全是思维+数据结构优化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

MySQL中慢SQL优化方法的完整指南

《MySQL中慢SQL优化方法的完整指南》当数据库响应时间超过500ms时,系统将面临三大灾难链式反应,所以本文将为大家介绍一下MySQL中慢SQL优化的常用方法,有需要的小伙伴可以了解下... 目录一、慢SQL的致命影响二、精准定位问题SQL1. 启用慢查询日志2. 诊断黄金三件套三、六大核心优化方案方案

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜