【牛客 - 181C】序列(前缀和,二分,可用set维护)(有坑)
题干:
小a有n个数,他想把他们划分为连续的权值相等的k段,但他不知道这是否可行。
每个数都必须被划分
这个问题对他来说太难了,于是他把这个问题丢给了你。
输入描述:
第一行为两个整数n,q,分别表示序列长度和询问个数。
第二行有n个数,表示序列中的每个数。
接下来的q行,每行包含一个数k,含义如题所示。
输出描述:
输出q行,每行对应一个数Yes或者No,分别表示可行/不可行
示例1
输入
复制
5 3
2 1 3 -1 4
3
2
1
输出
复制
Yes
No
Yes
备注:
对于的数据,
对于的数据,
对于的数据,
设ai表示数列中的第i个数,保证
保证数据完全随机
解题报告:
刚开始以为二分复杂度是正确的,写了一个就AC了,但是后来一想发现不对啊复杂度成了O(q^2logn)、、、大概是数据水了吧
而且我这种解法根本不适合有负数存在的情况、、因为sum数组就不单调了呀。
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX = 100000 + 5 ;
ll a[MAX];
ll sum[MAX];
int main()
{int n,q,k;cin>>n>>q;for(int i = 1; i<=n; i++) scanf("%lld",a+i),sum[i] = sum[i-1] + a[i];while(q--) {scanf("%d",&k);if(sum[n] % k != 0) {puts("No");continue;}int every = sum[n] / k;int cur = 0,flag = 1;for(int i = 1; i<=k; i++) {int pos = lower_bound(sum+1,sum+n+1,cur + every) - sum;if(sum[pos] != cur+every) {flag=0;break;}cur += every;}if(flag == 1) puts("Yes");else puts("No");}// 2 3 6 5 9return 0 ;}
标程:(其实也差不多啦复杂度o(因子个数*N + q))
其实就是打表算的,对于这题其实打表比较合适,因为q比n大,且题干中说了数据保证随机,所以最好是打表然后o(1)查询
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int MAXN = 2 * 1e6 + 10, INF = 1e9 + 10;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int a[MAXN];
bool ans[MAXN];
int main() {int N = read(), Q = read();LL sum = 0;for(int i = 1; i <= N; i++) a[i] = read(), sum += a[i];for(int i = 1; i <= N; i++) {if(sum % i != 0) {ans[i] = 0; continue;}LL cur = 0, k = 0;for(int j = 1; j <= N; j++) {cur += a[j];if(cur == sum / i) cur = 0, k++;}ans[i] = (cur == 0 && k == i);}while(Q--) {int x = read();puts(!ans[x] ? "No" : "Yes");}
}
数据保证随机的意思是 sum 的因子不会太多(构造数据可以达到1e5级别)
另外可能有一个坑点:因为有负数的存在,如果当前数大于了 sum/k 了,是不能直接跳出的(这是针对标程的解法的,用前缀和就不存在这个问题)
还是要注意一下负数啊!!各种题中,尤其是那种,说 int范围的。比如这题
不对啊,我那种方法其实修改一下也是正确的,用set维护一个pair<前缀,当前下标>,然后每次二分查找pair<那个值,上一次查找的下标>,这样找到的就是pair<那个值,那个下标后面的值>或者pair<大于那个值,下标无所谓>,我们在if判断一下是否是第一种,就可以了。
【牛客 - 181C】序列(前缀和,二分,可用set维护)(有坑)相关推荐
- 牛客16732 序列(排列组合)
同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 链接:https://ac.nowcoder.com/acm/problem/16732 来源:牛客网 时间限制: ...
- 牛客练习赛52.Galahad(树状数组维护区间不相同数的和)
链接:https://ac.nowcoder.com/acm/contest/1084/B 来源:牛客网 Galahad 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K ...
- 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
题目链接 题意 N×MN×MN×M的矩阵选择KKK个数相邻的数字不能同时选择,让最小的数字最大. 思路 二分枚举答案,对于每个答案,DinicDinicDinic判断可行性. #include < ...
- 【牛客 -2A】矩阵(二分,字符串哈希)
题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...
- 牛客 CMB1 序列找数
利用位运算,任何数和他自己本身做位异或运算都得0,而0和任何数做位异或都得那个数 import java.util.*; public class Main{public static void ma ...
- 【牛客 - 2B】树(思维,dp,有坑)
题干: shy有一颗树,树有n个结点.有k种不同颜色的染料给树染色.一个染色方案是合法的,当且仅当对于所有相同颜色的点对(x,y),x到y的路径上的所有点的颜色都要与x和y相同.请统计方案数. 输入描 ...
- 牛客xiao白月赛32-- 拼三角(暴力却有坑)
题目如下: 我一开始想通过sort直接比较,但直接Wa了,这是为什么呢? 看下面这个例子: 3 8 12 15 16 16 3 15 16一组 8 12 16一组 所以:不可以通过sort去比较更小的 ...
- 牛客网笔试输入输出总结<记录自己踩的坑>
1.对于那种只需要写一个方法的题目,只要注意方法中参数的类型和返回值类型即可 2.对于需要自己考虑输入和输出的题目,自己主要遇到过以下几种情况,并自己尝试了进行读取 首先不会改变的是以下几段代码 im ...
- 牛客网华为机试题(JavaScript)
最近在牛客网刷华为机试题,遇到了很多坑,记录: 每一道题目都经过自己实践验证 华为机试题 牛客网在javascript V8引擎下处理输入输出如下: 利用了readline()接收输入的每一行,多行处 ...
最新文章
- Visual Studio2019 应用程序无法正常启动0xc000007b
- Problem E: 成绩排序
- Vuex原来可以这样上手
- RxJava操作符lift笔记25
- sicily 1443 Printer Queue
- LabVIEW以太网仪器控制
- android 反编译 签名,Android反编译及重签名命令
- 陪孩子的周日-20220123
- 功放的工作原理与作用
- JAVA 模拟扑克牌洗牌发牌案例
- Linux环境批量下载阿里云盘资源
- 4G低功耗摄像头如何实现快速视频,拍照上传文件
- iOS8扩展插件开发配置
- 微软应用商店打不开代码: 0x80131500
- Ubuntu16.04更改新加卷名称
- java类 家族成员 姓氏_java题目 将一些学生分别按姓氏分类,每个姓氏的学生输出到一行上。...
- DirectX游戏编程入门——前言
- 【教程】删除压缩包密码
- 模拟计算MS软件常见问题及解答(一)
- mysql李玉婷网课配套笔记(一) 基础查询、条件查询bilibili
热门文章
- [Leetcode][第100题][JAVA][相同的树][二叉树][深度遍历][递归]
- linux上git克隆命令,Git clone命令用法
- php在html中生成option,使用PHP可以将HTML SELECT/OPTION值设为NULL吗?
- python编程口诀_少儿Python编程中的算术与技巧
- 英语答题测试的软件叫什么,英语做题软件哪个好 有答案解析的英语做题软件分享...
- WINCE6补丁安装
- sqlite3_setp
- 大话WinCE与WinXP应用程序开发的差异性
- 固态硬盘 linux 文件系统,SSD是否需要使用特别的文件系统?
- arcgis矢量之间的空白如何快速填充