AGC037 C Numbers on a Circle【思维】
题意
这道题被某大佬改编拿来出成考试题,是长这个样子的:

好的,其实这才是真正的题意:
给定初始序列和最终序列,每次选择一个数变成自己和相邻2个数的和。问初始序列是否可以变为最终序列,若可以,问最少需要多少次。
分析
发现这道题有很多种操作方式,就算是写搜索暴力都不是很好写。
正难则反,考虑从末状态到初状态,就是一直减去左右两边的数。
如果中间的数大于两边的数之和,那么中间那个数一定要被操作(设$a,b,c$分别为$i-1,i,i+1$上的$B$值)
而且在$b>a+c$条件不被破坏时,如果不对$b$操作,那么$a,c$也不会被操作(操作之后为负数,不合法)
只要$b>a+c$并且$Bi>Ai$ $b$就要一直减去$(a+c)$
由于是一定要减 是必要的 所以也最小
$b>a+c$的条件就是在if(...)-1 那个地方判断的 也可以写成if(!step) 就是判断操作次数至少为$1$次
如果不能操作(操作就成负数)那就不能有解 如果可以操作 下取整操作次数是一定要做的 哪怕只有一次都要做
做完之后 如果满足了$Ai==Bi$那最好 就ok啦
但如果不满足 根据step的算法 就是再减一次就变成负数 这个时候$b<a+c$了
就不一定需要操作 所以继续塞到队列里面等着有朝一日继续操作
用优先队列呢,也是因为"在$b>a+c$条件不被破坏时,如果不对$b$操作,那么$a,c$也不会被操作(操作之后为负数)"
如果不先对最大的那个数操作 那么后面也就没有办法操作。
基本上就是这样了。
不过还要注意开$long$ $long$(具体次数好像不是很好算,这种不好估计的情况还是都开起比较保险)
代码
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
#define N 200005
#define ll long long
#define fst first
#define snd second
//环:1:2,n n:n-1,1
int n,a[N],b[N];
ll ans;//记得开ll
inline int rd()
{
int f=,x=;char c=getchar();
while(c<''||''<c){if(c=='-')f=-f;c=getchar();}
while(''<=c&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return f*x;
}
priority_queue<pair<int,int> >Q;
//pair定义优先队列 先按first 再按second 自动排序
int main()
{
//freopen("hopeless.in","r",stdin);
//freopen("hopeless.out","w",stdout);
n=rd();
for(int i=;i<=n;i++)
a[i]=rd();
for(int i=;i<=n;i++)
{
b[i]=rd();
if(a[i]!=b[i]) Q.push(make_pair(b[i],i));
}
while(!Q.empty())
{
pair<int,int> now=Q.top();Q.pop();
int i=now.snd;
/*int pre=i-1,suf=i+1;
if(pre==0) pre=n;
if(suf==n+1) suf=1;
int step=(b[i]-a[i])/(b[pre]+b[suf]);
*/
int pre=(i+n-)%n+,suf=i%n+;
int step=(b[i]-a[i])/(b[pre]+b[suf]);
if(b[i]-b[pre]-b[suf]<a[i])
{
puts("-1");
return ;
}
ans+=step;
b[i]-=step*(b[pre]+b[suf]);
if(a[i]!=b[i]) Q.push(make_pair(b[i],i));
}
printf("%lld\n",ans);
return ;
}
Code
AGC037 C Numbers on a Circle【思维】的更多相关文章
- AGC037C Numbers on a Circle(神奇思路)
Atcoder 全是神仙题-- 先变成能不能从 \(b\) 到 \(a\).操作变成一个数减掉旁边两个数. 考虑里面最大的且不和 \(a\) 中相等的那个数.它两边的数此时都不能操作,否则就减到非正数 ...
- AGC037C Numbers on a Circle【构造】
从后往前做,每次将\(B_i\)减去相邻两个数,注意如果最大的数没有变成初始状态,那么肯定要减,否则相邻两边的就减不了,所以用堆维护.根据辗转相除的复杂度,\(O(n\log^2 n)\). #inc ...
- AGC037C Numbers on a Circle
题目大意 给你一个序列a和序列b 每次操作是a[i]+=a[i-1]+a[i+1] 问a经过最少几次操作可以得到b 分析 用堆维护a 每次取出最大的 撤销操作直到不能撤销 将新数放入堆 不断维护即可 ...
- Codeforces Beta Round #94 div 1 D Numbers map+思路
D. Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- CodeForces 128D Numbers 构造
D. Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- ATcoder Grand Contest总结
最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...
- crossplatform---Node.js Applications with VS Code
Node.js is a platform for building fast and scalable server applications using JavaScript. Node.js i ...
- uva 524 prime ring problem——yhx
Prime Ring Problem A ring is composed of n (even number) circles as shown in diagram. Put natural ...
- Daily Scrum – 1/12
Meeting Minutes Merge Wordlist & Word Recite entry. (P0) – Done. Remove "Word Challenge&quo ...
随机推荐
- 扩展Puppet – 建立Puppet CA集群
扩展Puppet – 建立Puppet CA集群 (1 votes, average: 5.00 out of 5) 588 views 2012 年 3 月 4 日Puppet.运维ca.mast ...
- 后端返回图片的url,将其转成base64,再次进行上传
//将图片变成base64再上传(主要是转化来自客户端的图片) getUrlBase64=(url, ext)=> { var canvas = document.createEl ...
- C#生成的后台文件 ***.vshost.exe
vshost是visual studio宿主应用程序,vs运行调试时是打开的其实是这个文件,这个程序可以让vs跟踪调试信息.而exe则可以直接打开,vs不会跟踪任何这个文件的运行情况.只要引用的程序集 ...
- JavaWeb_响应和请求数据包
Google浏览器 F12中Network->Header部分 <%@ page language="java" import="java.util.*&qu ...
- sqli-labs(45)
基于报错的password处的')闭合注入 就是没有报错信息 payload和43关一样的构造
- python中super().__init__和类名.__init__的区别
super().__init__相对于类名.__init__,在单继承上用法基本无差 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次 多继承时 ...
- 消息队列rabbitmq/kafka
12.1 rabbitMQ 1. 你了解的消息队列 rabbitmq是一个消息代理,它接收和转发消息,可以理解为是生活的邮局.你可以将邮件放在邮箱里,你可以确定有邮递员会发送邮件给收件人.概括:rab ...
- 第八周总结&实验报告六
总结:这周主要是学习异常的使用,已经怎么解决异常,总的来说学习的还是有点难度的,因为前面的知识还需要时间去弥补,这门课程还是要加油的学习! 这周主要所学: 一.异常 1.异常是导致程序中断运行的一种指 ...
- legend3---4、lavarel中session使用注意
legend3---4.lavarel中session使用注意 一.总结 一句话总结: session('key',$value)不是存值,是设置默认值,session(['key'=>$val ...
- jQuery file upload --Multiple File Input Fields in One Form
The plugin can be applied to a form with multiple file input fields out of the box. The files are se ...