bzoj3136: [Baltic2013]brunhilda
这个题为什么会放在数据结构啊
首先因为有决策包容性,对于一个n每次必然选择一个n%p最大的p,令n减n%p
设fi表示i变成0的步数的话,同样我们可以知道f是有单调性的
假如fd能转移到fk,首先d一定是某个p的倍数,并且k-d+1<pi才能够转移
对于一个合法的d,它能够影响的长度就是pp,其中pp|d并且在给出的质数中是最大的,设它为s(d)
由于f有单调性,并且决策点影响的是由它开始往后的一段,那么决策也有单调性,假如我们知道了这个就可以O(n)指针扫决策点更新了
考虑如何求s
我们可以线性筛一次数,并把每个数被那个点标记记录下来,记为gi
先把每个给出的质数标记为自己,那么s(i)=max(s(i/gi),s(gi)) 好妙啊!
gb卡我空间
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e5+;
const int maxp=1e7+; int n,p[maxn]; int m,q[maxn];
int f[maxp],s[maxp]; int pr,g[maxp];bool v[maxp];
void dddd(int mx)
{
for(int i=;i<=mx;i++)
{
if(v[i]==false)
{
f[++pr]=i;
g[i]=i;
}
for(int j=;j<=pr&&i*f[j]<=mx;j++)
{
v[i*f[j]]=true;
g[i*f[j]]=f[j];
if(i%f[j]==)break;
}
}
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout); scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&p[i]),s[]=max(s[],p[i]);
int mx=;
for(int i=;i<=m;i++)
scanf("%d",&q[i]),mx=max(mx,q[i]); //.....read...... dddd(mx);
s[]=-;
for(int i=;i<=n;i++)s[p[i]]=p[i];
for(int i=;i<=mx;i++)s[i]=max(s[i/g[i]],s[g[i]]); //.....gets...... f[]=;int j=;
for(int i=;i<=mx;i++)
{
while(j<i&&(s[j]==-||f[j]==-||j+s[j]-<i))j++;
if(j==i)f[i]=-;
else f[i]=f[j]+;
} //.....getf..... for(int i=;i<=m;i++)
{
if(f[q[i]]==-)puts("oo");
else printf("%d\n",f[q[i]]);
} //.....print..... return ;
}
bzoj3136: [Baltic2013]brunhilda的更多相关文章
- 【BZOJ 3136】 3136: [Baltic2013]brunhilda (数论?)
3136: [Baltic2013]brunhilda Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 238 Solved: 73[Submit][ ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)
3133: [Baltic2013]ballmachine Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 148 Solved: 66 Descri ...
- BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
BZOJ_3133_[Baltic2013]ballmachine_堆+倍增 Description 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树 ...
- [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)
[BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...
- 【JZOJ3318】Brunhilda的生日
description 除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩.近期,她正在策划一个完美的生日派对.她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去.当这 ...
- bzoj3135: [Baltic2013]pipesd
Description 有n个水库,m条管道.Jester会在某些管道中间凿开一个洞,让水流出来或者用水泵把水打进去.保证这个流速是偶数.对于一条管道(u, v),如果在中间凿开了一个洞让水流出来,流 ...
- bzoj3136
Description 给定m个素数和Q个询问.每个询问有n个人,每次操作可以任意选择其中的一个素数p(素数可以重复使用),然后去掉剩余人数 mod p个人.对于每个询问,我们想知道,至少需要多少步操 ...
- BZOJ3133[Baltic2013]ballmachine
题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3133 题解 还是分两个操作来说吧. 先看第一个操作,放球,可以发现,对于祖先节点和后代节 ...
随机推荐
- LinkedList的构造函数有哪些
LinkedList构造函数有(两种): public LinkedList() public LinkedList(Collection<? extends E> c) /** * Co ...
- vector容器中添加和删除元素
添加元素: 方法一: insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入 ...
- FOJ Problem 2271 X
Problem 2271 X Accept: 55 Submit: 200Time Limit: 1500 mSec Memory Limit : 32768 KB Problem Des ...
- C语言函数调用及栈帧结构
source:http://blog.csdn.net/qq_29403077/article/details/53205010 一.地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念, ...
- MarsEdit 快速插入代码
<div class="cnblogs_Highlighter"> <pre class="brush:objc;gutter:true;"& ...
- android Paint属性
** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形 ...
- LeetCode OJ--Evaluate Reverse Polish Notation
http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 栈使用 #include <iostream> #inc ...
- 下载安装webstrom及激活
太久没在新电脑上安装websrtom,又有点忘了咋激活. 一.安装 1.直接在浏览器搜索webstrom,打开官网,直接点击download.如下图 2.打开安装包,开始安装,直接点击 next 3. ...
- python多线程实践小结
参考:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html #!/usr/bin/env python import sys ...
- Liunx 下Redis 的安装
一.Redis 的简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器,它是一个key-value存储系统.和Memcache类似,Memecache只支持字符窜的数据类型 ...