【算法】数位DP

【题解】动态规划

题目要求的是大整数……没办法只写了小数字的,感觉应该没错。

大题框架是最大值最小化的二分问题。

对于每一块要求count(b)-count(a-1)≥s

已知a如何计算b?令now=count(a-1)+s,求的就是满足count(b)≥now的最小b了。

虽然看上去只是不等式的移项,但其实上是一种差分思想:将b-a≥s转化为b≥a+s,避免计算b和a的差。

然后每次求出b后,b+1就是新的起点,也就是count(b)=count(a`-1),不需要重新计算。

那么如何计算count(i)?画画图就大概知道了:

预处理f[i]表示以高度i为根(不考虑自身)的1的数量,f[i]=f[i-1]*2+(1<<(i-1))。

每次从根到叶子判断若加上左子树权值(左子树包含的数字中所有1的数量)仍≤now就走右子树。

权值如何计算?ans=ans+f[j]+tot*(1<<j)+1,f[j]是假设上面的位是0考虑的,tot表示上面1的数量。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[],k,M;
bool calc(int s)
{
int n=,now=,i,cpnow=,tot=;
for(i=;i<=M;i++)
{
now=;tot=;n=;
for(int j=k-;j>=;j--)
{
if(now+f[j]+tot*(<<j)+<=cpnow+s)
{
now=now+f[j]+tot*(<<j)+;
n|=(<<j);
tot++;
}
}
printf("s=%d n=%d now=%d\n",s,n,now);
if(n==(<<k)-)return ;
cpnow=now;
}
return ;
}
int main()
{
scanf("%d%d",&k,&M);
f[]=;
for(int i=;i<=;i++)
{
f[i]=f[i-]*+(<<(i-));
}
int l=,r=(<<k)-;
while(l<r)
{
int mid=(l+r)>>;
if(calc(mid))r=mid;
else l=mid+;
}
printf("%d",l);
return ;
}

【SPOJ】2319 BIGSEQ - Sequence的更多相关文章

  1. 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)

    [SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...

  2. 【SPOJ】Substrings(后缀自动机)

    [SPOJ]Substrings(后缀自动机) 题面 Vjudge 题意:给定一个长度为\(len\)的串,求出长度为1~len的子串中,出现最多的出现了多少次 题解 出现次数很好处理,就是\(rig ...

  3. 【SPOJ】Longest Common Substring II (后缀自动机)

    [SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...

  4. 【SPOJ】Longest Common Substring(后缀自动机)

    [SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...

  5. 【SPOJ】Distinct Substrings(后缀自动机)

    [SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...

  6. 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)

    [SPOJ]Distinct Substrings/New Distinct Substrings(后缀数组) 题面 Vjudge1 Vjudge2 题解 要求的是串的不同的子串个数 两道一模一样的题 ...

  7. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  8. 【SPOJ】Power Modulo Inverted(拓展BSGS)

    [SPOJ]Power Modulo Inverted(拓展BSGS) 题面 洛谷 求最小的\(y\) 满足 \[k\equiv x^y(mod\ z)\] 题解 拓展\(BSGS\)模板题 #inc ...

  9. 【BZOJ4355】Play with sequence 线段树

    [BZOJ4355]Play with sequence Description 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a ...

随机推荐

  1. .net控制台程序Program args参数解析

    一直很有疑问在控制台程序的Main函数中为什么会有个string[] args的参数,又没有什么用. static void Main(string[] args) { } 这几天需要将一个控制台程序 ...

  2. 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能

    本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...

  3. sublime Remote_encoding cp1252

    "remote_encoding": "cp1252",才能连接远程ftp

  4. query 获取本身的HTML

    <div class="test"><p>hello,你好!</p></div> <script> $(".t ...

  5. 【python】如何查看已经安装的python软件包和版本

    pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品. pip freeze可以查看已经安装的python软件包和版本 pip list 也可以

  6. HTML5 应用程序缓存

    使用HTML5,通过创建 cache manifest 文件,可以轻松创建web应用的离线缓存.   什么事应用程序缓存? HTML5引入了应用程序缓存,这意味着 web 应用可进行缓存,并在没有因特 ...

  7. BZOJ4813 CQOI2017小Q的棋盘(树形dp)

    设f[i][j]为由i号点开始在子树内走j步最多能经过多少格点,g[i][j]为由i号点开始在子树内走j步且回到i最多能经过多少格点,转移显然. #include<iostream> #i ...

  8. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  9. [NOI2009]诗人小G 决策单调性优化DP

    第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); ...

  10. POJ2195:Going Home——题解

    http://poj.org/problem?id=2195 题目大意: 有些人和房子,一个人只能进一个房子,人走到房子的路程即为代价. 求所有人走到房子后的最小代价. ——————————————— ...