首页 > 其他分享 >CodeChef Cutting Plants难题题解

CodeChef Cutting Plants难题题解

时间:2023-07-05 22:00:53浏览次数:39  
标签:Plants ch int 题解 bi 队列 Cutting 单调

STL-CodeChef Cutting Plants题解

单调队列哦

我要造福后人,因为题解太jb难找了

题意:

2个操作
找一段l-r区间,取其<=最小值的任意高度 ,记为h
将l-r变为h
时间复杂度暂时归为n吧

思路:(思路应该很容易跟上)

最特殊的:L=R,来嘛我每个独自减
那为什么会有-1呢
涨不回去呗(bi>ai)

现在关键在于我可不可以(一起减)
想一下方案数减少的条件
eg:

5 7
2 3
我可以5-7那里一起修减到3,在把5修建到2
还是要用两次

所以当且仅当出现连续的bi时,可以减少方案书
上了个厕所(肾虚呢......在whz和ljh眼下悄悄c了两把)
一定要连续吗?
例如2222222212(目标)
我还是可以一下剪掉
但是2222222232,就不能,要分3次了

上面那种情况再拓展下
3333333332133
那就是找上面那种情况 ,用n减去多余步数就是答案
多余步数就是 重复的个数-1 (如上面,ans=13-10=3)
那要是多重呢
5555555 333333 222222 111111 22222222 333333333 555555
是不是就相当于5321235 ?ans=7-1-1-1=4;
那上面那个,是不是相当于3213?
woc,我好巨

现在我们就已经找到这道题很多性质了
验证一下:2121212,ans=7-3=4?对的!
那贪心肯定没问题,好难写,复杂度也可能有问题
思路理清了,想想这个该用什么数据结构来搞
管他呢,乱搞!

啊啊啊,错了
看题解
没找到
老师找到了,同他的话来说:"抽象"
但其实有了以上的认识,也很明了了
https://blog.csdn.net/noone0/article/details/82049287
单调队列:
所以说还要满足减去的<=min(a[i])-->不然的话我不要a数组就做出来了
这个就是问题所在了
然后就单调队列找这段区间

做法:

建立bi严格递减的单调队列 ,因为你要砍的话,肯定是砍一个b[i]
同时要求这段区间内最大也要是a[i],这是为了保证对于原数组(“砍得到”),从而避免答案偏大
如果出现了队列清空的情况(eg.343)
就说明有了3 4这一下了
又如果出现了b[i] =bi-1
就说明有3 3这一下了
3 3就可以直接缩减为3(上面找过这个规律的),同样也是避免答案偏大

为什么这么做
假设现在有一个单调递减的b数组,a数组都是极大的
那肯定就是要减少b.size()次
有一个不递增的b数组
那答案就是去重后的b.size()次
那遇到343这样的怎么办?
单调队列会在第一个3加一次,3处加一次,由于单调递减,在第二个3中就相当于
将第一个和第二个3合并了,没有计算答案,因此答案为2
最后吧a[i]的限制加上就行了吧

代码:

#include<bits/stdc++.h>
using namespace std;

int a[200005];
int b[200005];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main(){
//    ios::sync_with_stdio(false);
	int t;
	t=read();
	while(t--){
		int n;
		n=read();
		bool haveans=1;
		for(int i=1;i<=n;i++){
			a[i]=read();
		}
		for(int i=1;i<=n;i++){
			b[i]=read();
			if(b[i]>a[i]){
				haveans=0;
//				break;----------!!!!!!!!!!!!!!我也不知道为什么写了个这个,我是傻逼,70分wa这 
			}
		}
		if(!haveans){
			puts("-1");
			continue;
		}
		deque<int>q;//已经自动清空了 
		int res=0;
		for(int i=1;i<=n;i++){//DEQUE内存的是能一直运行到现在的h 
			while(!q.empty()&&b[i]>q.back()){
				q.pop_back();
			}	
			while(!q.empty()&&a[i]<q.front()){
				q.pop_front();
			}
			if(a[i]!=b[i]&&(q.empty()||b[i]!=q.back())){//找到了可以操作的
			/*
			这里给一个解释
			a[i]!=b[i]是为了这一次操作行之有效
			q.empty(不得不从新分离一次了)||b[i]!=q.back()(会多减一次) 
			*/
				res++;
				q.push_back(b[i]);
			}
		}
		cout<<res<<endl;
	} 
}

标签:Plants,ch,int,题解,bi,队列,Cutting,单调
From: https://www.cnblogs.com/linghusama/p/17529917.html

相关文章

  • 【DSY 4484】矩阵 题解(带限错排)
    DSY传送门。(带限制)错排问题。神仙题。Solution根据题目的问法,发现我们只想统计比给定矩阵\(A\)小的矩阵,记这个矩阵为\(B\)。显然,\(B\)的第\(i\)行一定从某个位置开始小于\(A\)的第\(i\)行,且前面的内容和\(A\)都是一样的。所以我们只需要枚举这个“开始变小”......
  • 「NOIP 模拟赛 20230705」T2-序列删数问题 题解
    题面Natsuzora有一个长度为\(n\)的排列\(a_1,a_2,\ldots,a_n\),他想要将序列中的\(m\)个数删除。删除数字需要使用到“魔法工具”,其也有\(m\)种,其中第\(i\)种魔法工具能够将排列中任意一个的长度为\(l_i\)的区间中最大的数删除。每个魔法工具最多只能使用\(1\)次。......
  • 洛谷P9025题解
    P9025题解简化题意求一个值\(c\)使得\[\sum_{i=1}^nw_i(\left|c-p_i\right|-d_i)\]最小化(注意题目中\(w_i\)表示每移动一米需要\(w_i\)秒)思路首先我们令选择\(c\)位置的总用时为\(f(c)\)显然,我们可以把它分成两边来看在\(c\)左边的人:\[f(c)=\sum_{p_i+d_......
  • 题解:【AT icpc2015summer day2-G】 Escape
    题目链接目前AT的最优解。树的话就是根叶链的最大点权和路径,DP随便搞。考虑扩展到图上,反复删除掉所有度数为\(1\)的节点,显然剩下的东西是可以全部取完的,因为它的形态类似于菊花套环,且末端必定为环。将这部分缩起来再跑上面的DP就好了。事实上两部分可以同时进行,一个bfs......
  • Springboot No bean named 'XXXXX' available 问题解决
    一、问题描述近日在工作中遇见了一个bug,后端程序频频报错Nobeannamed'XXXXX'available。对比同类程序文件,没有发现有任何特殊之处。在网上搜索方法基本上就是扫描包配置、注解问题、路径问题等,皆不能解决我的问题。排查问题是发现出现问题的类命名不符合驼峰规范,按照这个......
  • B0704 模拟赛题解
    原题链接前言挂分最多的一场。考虑到之前都无分可挂,这场算是最近很简单的了。T1不排序(按理说我的做法不需要排,但挂了),100->40。T2二分某个边界时单调性判错,100->30。T3原,但没做过。T4某人用模拟退火骗到60ptsorz。T1棍子签到题。考虑二分答案。显然每次要切的......
  • SPOJ Substrings 题解
    \(\text{SAM}\)入门好题。首先我们需要知道几个关于\(\text{SAM}\)的结论。结论1:题目中的\(f(x)\)单调下降。显然,对于长度为\(x\)的子串,其必存在一个\(x-1\)的后缀,这个后缀的\(\text{endpos}\)集合肯定包含子串的\(\text{endpos}\)集合,所以必有\(f(x-1)\le......
  • Hydro #4766. 文艺计算姬 题解--zhengjun
    link前置知识:Prufer序列,二分图别的题解都是直接给答案,没有比较易懂的思路。首先,考虑Prufer序列,发现右边点删除一定会加入一个左边点,另一边类似。且生成Prufer序列的最后一定会留下左右边各一个点。所以左边点在Prufer序列中出现的次数即为\(m-1\),右边即为\(n-1\)。......
  • 【Maven】Unknown lifecycle phase “.test.skip=true“.问题解决
    我们在运行跳过单元测试时的命令mvnpackage-Dmaven.test.skip=true时,出现Unknownlifecyclephase".test.skip=true".如下[ERROR]Unknownlifecyclephase".test.skip=true".Youmustspecifyavalidlifecyclephaseoragoalintheformat<plugin-prefix>......
  • PAT乙级【Java题解合集】
    ✨说在前面       这个暑假博主用大概两周不到的闲暇时间把PAT乙级的110道算法题全部肝完了,个人感觉题目的难度大部分在中等偏下,大概有二十道左右的题目还是蛮有意思的,值得细细去钻研,本专栏非常适合新手入门算法,也适合Java算法老手巩固一些基本知识点,由于C站上关于PAT乙级J......