【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D
失踪人口突然回归……orz。题解还是有必要写的,虽然估计只有自己(?自己也不一定看得懂)看得懂。
题目链接:http://codeforces.com/contest/992/problem/D
题目大意:给出n个数字a和一个k,求数列a中的子区间aa满足aa的和乘k等于aa的积。(a<=1e8,n<=2e5,k<=1e5)
这道题没找到官方题解,所以看了一下standing rank1的dalao的代码。 鸣谢 dotorya
第一眼就觉得短,非常短。赛上把我卡得很恶心的1的情况竟然被两行代码解决了……再度%大佬的机智。
暴力解决这道题(枚举所有区间)的时间复杂度是n^2,在看了一眼数据范围后被我放弃了。
先说一下赛上思路过程,前缀和是第一反应,然后考虑前缀积。再一看范围,计算量直接T掉高精度。不过转念一想,k*sum_aa的最大值也就2e18,好像是在暗示着什么。用和来寻找积而不用积来寻找和。在草稿本上演算了一下,发现积的增长速度十分快,一旦在某个瞬间大于sum_aa*k了之后就不会再小于了。当然是在没有1的情况。想了半天不知道怎么破解这个1,最终GG退赛。
看了dalao的代码之后发现dalao机智地把1折叠了起来……既然乘1等于不乘那我们就不乘,跳过就行了,加1的影响用前缀和搞定。然后……就是暴力,对,暴力(Formiko的智商真是碾压我呀。)
%%%,我初步估计时间复杂度在nlog2e18,因为乘积的增长速度真的十分十分快,log级别的。此处鸣谢Formiko点醒了我。这确实是基本的数学素质,我竟然忘掉了。
中途写完代码的时候发现不能完全忽略1的影响,再次感谢formiko,他的一句“1加着加着就蹦出来一个解”成功帮我AC了这道题,同时%dalao的二分思路。
废话太多我精简地说一下这道题的题解。
首先用前缀和处理数列,把这个数列映射到另一个数列上,类似于链表(但是要保留原下标,方便前缀和以及1的影响)。映射方式就是折叠1,只保留非1的数,也就是对乘积有影响的数,对于固定的左端点,这个区间长度不会超过63,时间复杂度是可以承受的。接下来暴力枚举每个左端点,在映射的数组上跳跃,最多条约63次。中途会有1出现的情况。也就是分右端点是1和右端点不是1两种情况。如果右端点不是1,那么直接在映射数组上验证是否满足条件就行了,如果右端点是1,那么在一段连续1中,由于乘积一直乘的1,值不变,和一直在增加,所以如果出现满足条件的解,只会有一个,而且满足单调性!!那么二分就可以了。总时间复杂度在63*nlogn。
下面放代码:
/* by Lstg */ #include<stdio.h>
#include<iostream>
#define MAXN 200105
#define inf 3000000000000000000
using namespace std; int b[MAXN];
long long a[MAXN],sum[MAXN]; bool _find(int k,int l,int r,long long tmp){ if(l>r)return false;
int mid;
while(l<=r){
mid=(l+r)>>;
if(sum[mid]-sum[k]==tmp)return true;
if(sum[mid]-sum[k]>tmp)r=mid-;
else l=mid+;
}
return false;
} int main(){ int n,i,j;
long long k,tmp;
scanf("%d%I64d",&n,&k);
for(i=;i<=n;i++){
scanf("%I64d",&a[i]);
sum[i]=sum[i-]+a[i];
}
b[i]=i;
for(i=n;i>=;i--){
if(a[i]>)b[i]=i;
else b[i]=b[i+];
} long long cnt=;
for(i=;i<=n;i++){
j=b[i];
tmp=1ll;
if(a[i]==&&k==)cnt++;
while(j<=n){
if(inf/a[j]<tmp)break;
tmp*=a[j];
if(tmp==k*(sum[j]-sum[i-]))cnt++;
if(tmp%k==&&_find(i-,j+,b[j+]-,tmp/k))cnt++;
j=b[j+];
}
}
printf("%I64d",cnt);
return ;
}
【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D的更多相关文章
- 并查集+bfs+暴力滑窗 Codeforces Round #356 (Div. 2) E
http://codeforces.com/contest/680/problem/E 题目大意:给你一个n*n的图,然后图上的 . (我们下面都叫做‘点’)表示可以走,X表示不能走,你有如下的操作, ...
- Codeforces Round #489 (Div. 2) E. Nastya and King-Shamans(线段树)
题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) , 现在会进行 \(m\) 次操作 , 每次操作会修改某个 \(a_i\) 的值 , 在每次操作完后你需要判断是否存在一个位置 \(i ...
- Codeforces Round #489 (Div. 2)
A. Nastya and an Array time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #489 (Div. 2) E - Nastya and King-Shamans
E - Nastya and King-Shamans 题目大意:有n个数,每一次操作更改一个数,每次操作之后问你是否有一个数等于其前面所有数的和. 思路:好题,想了很久没想出来,看了题解,主要思想就 ...
- Codeforces Round #489 (Div. 2) B、C
B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...
- [Codeforces]Codeforces Round #489 (Div. 2)
Nastya and an Array 输出有几种不同的数字 #pragma comment(linker, "/STACK:102400000,102400000") #ifnd ...
- 数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog
题目传送门 /* 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束 详细解释:ht ...
- 暴力 Codeforces Round #305 (Div. 2) B. Mike and Fun
题目传送门 /* 暴力:每次更新该行的num[],然后暴力找出最优解就可以了:) */ #include <cstdio> #include <cstring> #includ ...
- 暴力 Codeforces Round #183 (Div. 2) A. Pythagorean Theorem II
题目传送门 /* 暴力:O (n^2) */ #include <cstdio> #include <algorithm> #include <cstring> # ...
随机推荐
- tomcat8在centos7.5下配置开机启动
本文参考这篇文章 一.在/etc/init.d下新建一个文件tomcat,并添加内容如下: #!/bin/sh # chkconfig: 345 99 10 # description: Auto-s ...
- JVM调优总结:一些概念
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...
- 【Hadoop】大数据时代,我们为什么使用hadoop
博客已转移,请借一步说话.http://www.daniubiji.cn/archives/538 我们先来看看大数据时代, 什么叫大数据,“大”,说的并不仅是数据的“多”!不能用数据到了多少TB , ...
- LintCode 532: Reverse Pairs
LintCode 35: Reverse Linked List 题目描述 翻转一个链表. 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1 ...
- 【BZOJ】1036 [ZJOI2008]树的统计Count
[算法]树链剖分+线段树 [题解]模板题,见http://www.cnblogs.com/onioncyc/p/6207462.html 调用线段数时要用新编号pos[i] !!! #include& ...
- 【BZOJ】2631: tree LCT
[题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link ...
- 【CodeForces】708 C. Centroids 树的重心
[题目]C. Centroids [题意]给定一棵树,求每个点能否通过 [ 移动一条边使之仍为树 ] 这一操作成为树的重心.n<=4*10^5. [算法]树的重心 [题解]若树存在双重心,则对于 ...
- 【NOIP】提高组2013 货车运输
[算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...
- 推箱子 BFS
[编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...
- ASP.NET EF(LINQ/Lambda查询)
EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...