题目

分析

这个Rnd353真是神仙题层出不穷啊,大力脑筋急转弯- -
不过问题也在我思维江化上。思考任何一种算法都得有一个“锚点”,就是说最笨的方法怎么办。为什么要这么思考,因为这样思考最符合我们的思维规律。然后从这种最笨的方法中找问题、找漏洞、找关键的变量不变量,就能转化出更好的更快的算法。
这题就是这样。最笨的方法是什么?随便从哪个点出发,按照一个方向一个一个抹平差距。可以保证,n-1次一定完成。那么哪里可以改进?0区间。0区间的时候我们可以不移动:比如说 0 0 2 -2 0 0,那么只需要移动一次就可以了。那么是不是所有的0区间都可以不考虑?不可以(自己比划一下就知道了)。因此,我们需要找到最大的0区间。那么成环的问题要不要考虑?得看算法。这个算法太神奇了,我们好好分析一下。

代码

#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int, int>;
using pii = pair<int, pi>; template<typename T>
T read()
{
T tmp; cin>>tmp;
return tmp;
} int main()
{
int n; ll sum=0;
cin>>n;
map<ll,int> m;
int maxinterval=0;
rep(i,1,n)
{
int tmp; cin>>tmp;
sum+=tmp;
maxinterval=max(maxinterval,++m[sum]);
} cout<<n-maxinterval<<endl; return 0;
}

算法分析

问题就在于m[x]到底是什么。
我们考虑这三种情况的数组:
1. 0 1 -1 0
2. 1 0 -1 0
3. 1 0 0 -1
这三种情况下m[x]的值分别是什么?
1. m[0]=3, m[1]=1
2. m[1]=2, m[0]=2
3. m[1]=3, m[-1]=1
也就是说,m[x]维护的是区间前若干个数(也就是说这些数不属于区间)的和为x的区间,这样的区间的总长度。
更直观的是这样的数组:
0 1 0 -1 0 0 0 0 1 0 -1 0
m[x]分别为:m[0]=7,m[1]=4
0 1 0 -1 0 0 0 0 2 0 -2 0
m[x]分别为:m[0]=7,m[1]=2,m[2]=2
那么为什么我们要找最大的m[x]?在下面两个例子中,我们取的并不是单个的区间,但是仍然达到了最优解。
很简单,这样的区间保证了这样一个性质:第一个数一定不是0,其他数一定是0(如果第一个数是0,那么区间可以更长)。这样一来,我们总可以保证,不属于区间的数字,最后一定可以通过操作抹到0上。这样的操作不会跨越区间(什么意思呢?比如说… x1 0 0 0 2 -1 x2 0 0 0 0 …,我们设x1代表的区间和x2代表的区间一致,那么,会不会出现这样一种情况:2和-1的操作不能在x1和x2的区间内完成,它们必须要“借”别的区间的值),因为如果跨越区间了,就会导致区间和的性质被破坏了:它总保证前面的和为x(这就意味着,在区间外必有了x->x,也就是说它们是“平”的)!因此,一定能在区间之间,完成抹0的操作。
这样,我们找到最大的m[x],问题就得以解决了。
我不知道我有没有讲明白,但是感觉自己吹了一遍明白这个算法的思路了23333另外这题我觉得还是属于暴力的,因为确实还是要穷举找最大嘛23333就是其他地方的思维量大了一些

官方题解

We have array ai and should make all numbers in it be equal to zero with minimal number of operations. Sum of all ai equals to zero.

We can divide array into parts of consecutive elements with zero sum. If part has length l we can use all pairs of neighbours in operations and make all numbers be equal to zero with l - 1 operations.

So, if we sum number of operations in each part we get ans = n - k where k is number of parts. We should maximize k to get the optimal answer.

One of the part consists of some prefix and probably some suffix. Each of other parts is subarray of a.

Let’s calculate prefix sums. Each part has zero sum so prefix sums before each part-subarray are the same.

So we can calculate f — number of occurencies of the most frequent number in prefix sums and answer will be equal to n - f.

之后补分析。

「暑期训练」「Brute Force」 Money Transfers (CFR353D2C)的更多相关文章

  1. 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)

    题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...

  2. 「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)

    题意 有n" role="presentation">nn个站点,排成圆形,每站间距m" role="presentation"> ...

  3. 「暑期训练」「Brute Force」 Multiplication Table (CFR256D2D)

    题意 给定一矩阵M" role="presentation">MM,Mij=ij" role="presentation">Mi ...

  4. 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)

    题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...

  5. 「暑期训练」「Brute Force」 Far Relative’s Problem (CFR343D2B)

    题意 之后补 分析 我哭了,强行增加自己的思考复杂度...明明一道尬写的题- -(往区间贪心方向想了 其实完全没必要,注意到只有366天,直接穷举判断即可. 代码 #include <bits/ ...

  6. 「暑期训练」「基础DP」 Common Subsequence (POJ-1458)

    题意与分析 很简单:求最长公共子序列. 注意子序列与子串的差别:一个不连续一个连续.一份比较好的参考资料见:https://segmentfault.com/a/1190000002641054 状态 ...

  7. 「暑期训练」「基础DP」免费馅饼(HDU-1176)

    题意与分析 中文题就不讲题意了.我是真的菜,菜出声. 不妨思考一下,限制了我们决策的有哪些因素?一,所在的位置:二,所在的时间.还有吗?没有了,所以设dp[i][j]" role=" ...

  8. 「暑期训练」「基础DP」FATE(HDU-2159)

    题意与分析 学习本题的时候遇到了一定的困难.看了题解才知道这是二重背包.本题的实质是二重完全背包.二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种代价:对于每种 ...

  9. 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)

    题意与分析 给定立方体(个数不限),求最多能堆叠(堆叠要求上方的方块严格小于下方方块)的高度. 表面上个数不限,问题是堆叠的要求决定了每个方块最多可以使用三次.然后就是对3n" role=& ...

随机推荐

  1. 【转】jQuery源码分析-03构造jQuery对象-源码结构和核心函数

    作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 毕竟是边读边写,不对的地方请告诉我,多多交流共同进步.本章还未写完,完了会提交PDF. 前记: 想系 ...

  2. Python-Url编码和解码

    一.为什么要进行Url编码 url带参数的请求格式为(举例): http://www.baidu.com/s?k1=v1&k2=v2 当请求数据为字典data = {k1:v1, k2:v2} ...

  3. MVC学习七:Razor布局之加载分部视图【PartialView】

    Partial View 顾名思义就是Html代码片段,应用于此HTML代码多次被页面加载时使用.(类似于WebForm程序中的用户控件) 注:PartialView和正常的View页面在访问时没有任 ...

  4. [luoguP3325][HNOI2012]矿场搭建

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  5. 下载YouTube视频的网站和工具

    1.界面友好,可选择的清晰度较多(我个人用这个比较多) http://en.savefrom.net/ 2.几乎可以解析到所有的清晰度 http://www.clipconverter.cc 3.可选 ...

  6. IPv4和IPv6的兼容问题

    一网络拓扑 Ipv6网络1 路由器A IPv4网络 路由器B IPv6网络2 二知识补充 [注]双协议栈主机(路由器A.B)通过域名解析器区分传过来的是IPv4还是IPv6 三处理技术 双协议栈 Ip ...

  7. 关于math.random()的问题

    今天在写一个关于随机数的小程序时,在程序执行时,发现随机数不能执行随机,随机结果始终为1. 下面贴上一开始错误的代码 int i = (int)Math.random()*3+1; 无论运行多少次,结 ...

  8. c++ 数字和字符串的相互转换

    需要包含头文件<sstream> 字符串转化为int #include<stdio.h> #include<string.h> #include<iostre ...

  9. django+xadmin在线教育平台(十七)

    8-1 课程列表 拷贝课程列表页到template目录 创建课程相关的urls.py Mxonline2/urls.py中声明包含到course的url中: # 课程app的url配置 url(r&q ...

  10. LVS、keepalived原理及配置

    使用LVS实现负载均衡原理及安装配置详解 ​ 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负 ...