D. Sorting By Multiplication

news/2025/1/1 15:51:23/

Problem - D - Codeforces

思路:我们首先考虑当只能乘以正数时,那么变为单调增的方法就是找所有w[i]>=w[i+1]的对数,因为如果存在一个w[i]>=w[i+1],那么我们一定至少需要进行一次操作,并且我们还知道我们进行一次操作最多只会破坏一对w[i]>=w[i+1](假如我们能够破坏两对,w[l]>=w[l+1],w[r]>=w[r+1],因为我们要破坏第一对,那么我们只能够对w[l+1]乘,并且我们又要破坏第二对,那么我们需要对w[r+1]乘,但是我们发现我们对w[r+1]乘的同时一定会对w[r]乘,所以我们一定不会破坏第二对,所以我们知道最多只会破坏一对),那么接下来我们只需要计算一下有多少对w[i]>=w[i+1]即可,如果加上了能够乘以负数,代表我们可以将一段递减的序列通过乘以一次负数得到递增的序列,那么我们就会想到一种方法,将前面的一部分得到递减的,后面一部分得到递增的,那么只需要这两部分的次数和+1,就能够得到递增的,那么我们会想到一个问题,一个是为什么前面递减的一定是连续的呢,比如说先递增再递减,那么我们能够发现如果我们将递减的乘以负数之后,前面递增的只能每次操作一次将其变为负数,然后拼接起来才是递增的,但是其实我们是可以先通过一次一个的将递增的变为递减的,将两个递减的拼接到一起,然后再对整体操作一次,变为递增的,那么答案并不会变差,所以一定可以前缀递减的,所以我们可以枚举那个点作为增减的分段点,然后求一个min(l[i]+1+r[i+1])即可,同时还要注意对r[1]去一个min,因为可能整体就是递增的

// Problem: D. Sorting By Multiplication
// Contest: Codeforces - Educational Codeforces Round 154 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1861/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms#include<bits/stdc++.h>
#include<sstream>
#include<cassert>
#define fi first
#define se second
#define i128 __int128
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> PII;
const double eps=1e-7;
const int N=5e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
const long long int llINF=0x3f3f3f3f3f3f3f3f;
inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
inline void write(ll x,char ch) {write(x);putchar(ch);}
void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
bool cmp0(int a,int b) {return a>b;}
template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
void hack() {printf("\n----------------------------------\n");}int T,hackT;
int n,m,k;
int w[N];
int l[N],r[N];void solve() {n=read();for(int i=1;i<=n;i++) w[i]=read(),l[i]=r[i]=0;r[n+1]=0;for(int i=2;i<=n;i++) {l[i]=l[i-1];if(w[i-1]<=w[i]) l[i]++;}for(int i=n-1;i>=1;i--) {r[i]=r[i+1];if(w[i]>=w[i+1]) r[i]++;}int ans=r[1];for(int i=1;i<=n;i++) ans=min(ans,l[i]+1+r[i+1]);printf("%d\n",ans);
}   int main() {// init();// stin();// ios::sync_with_stdio(false); scanf("%d",&T);// T=1; while(T--) hackT++,solve();return 0;       
}          

http://www.ppmy.cn/news/1101302.html

相关文章

java_日期时间API

文章目录 一、JDK8之前的日期时间API1.1 System类的currentTimeMillis()1.2 两个Date类1.2.1 java.util.Date包下的1.2.2 java.sql.Date包下的 一、JDK8之前的日期时间API 1.1 System类的currentTimeMillis() 获取当前时间对应的毫秒数&#xff0c;long类型 当前时间与1970年1…

Spark【RDD编程(三)键值对RDD】

简介 键值对 RDD 就是每个RDD的元素都是 &#xff08;key&#xff0c;value&#xff09;类型的键值对&#xff0c;是一种常见的 RDD&#xff0c;可以应用于很多场景。 因为毕竟通过我们之前Hadoop的学习中&#xff0c;我们就可以看到对数据的处理&#xff0c;基本都是以…

【C++】可变参数模板

2023年9月9日&#xff0c;周六下午 这个还是挺难学的&#xff0c;我学了好几天... 在这里我会举大量的示例程序&#xff0c;这样可以有一个更好的理解&#xff0c; 不定期更新。 目录 推荐文章&#xff1a; 示例程序一&#xff1a;拼接字符串 示例程序二&#xff1a;求整…

指针权限,new与delete,类与对象,函数模板,类模板的用法

指针权限 用法 void Print(const char* SecretPointer) {cout << "绝密指令为&#xff1a;";cout << SecretPointer << endl; }void Change(int& number, int* const FixedPointer) {cout << "更换站台数字为&#xff1a;";c…

TCP协议报文,核心特性可靠的原因,超时重传详细介绍

目录 一、TCP协议 二、TCP核心特性的保障 三、保留的六位标志位对于应答报文的作用 四、如何处理丢包——超时重传的原理 五、超时重传的时间 一、TCP协议 每一行是四个字节&#xff0c;前面的20个字节是固定的&#xff08;TCP最短长度&#xff0c;20字节&#xff0c;选项…

python-jieba库

jieba库&#xff0c;python提供的中文分词函数库的第三方库&#xff0c;它可以将一段中文文本分割成中文词语序列。 安装jieba库 pip install jiebajieba的三个模式 全模式 - - - jieba.lcut(s,cut_allTrue) - - - 速度非常快&#xff0c;但有冗余数据 精确模式&#xff08;…

【多线程】线程安全 问题

线程安全 问题 一. 线程不安全的典型例子二. 线程安全的概念三. 线程不安全的原因1. 线程调度的抢占式执行2. 修改共享数据3. 原子性4. 内存可见性5. 指令重排序 一. 线程不安全的典型例子 class ThreadDemo {static class Counter {public int count 0;void increase() {cou…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…