[luogu1108&2687][USACO4.3]Buy Low, Buy Lower(STL乱搞+高精度)
来源:互联网 发布:java软件是什么 编辑:程序博客网 时间:2024/06/01 09:17
题目:
我是超链接
题解:
水题而已,大部分人都应该会做,我突然想挑战一下
b[i]表示以i结尾的方案数
二分的第一问好做,问题是方案数怎么统计
每一个g存的数字都会被一个大于ta的数字替换,也就是说假如把所有的g值记录下来就是单调递增的,这样每次更新g的时候,方案数就是前一位比他大的数字方案数的和。
但很快博主就发现这个思路超难实现:无法处理有相等的数字出现时的方案数,你既不能置之不理【按照以前的那个加,这不就重复了吗】,也不能全盘替换【把以前的清空,虽然最后一个最优,但是前面的以其他数字结尾的方案也全没了】,总之弄一个ans统计简直没法玩。
www那怎么办,博主看到了一个做法,把n++,最后一个a放一个极小的数字,这样就可以把所有的方案数总结起来。 woc好科学啊,我怎么没有想到?
这道题相比那个大家熟悉的还需要高精度,这里博主压了4位
代码:
#include <cstdio>#include <vector>#include <cstring>#include <iostream>using namespace std;struct hh{int tim,z;};vector<hh>nxt[5005];int n,i,a[5005],g[5005],ans,ll[5005];struct bignum{int l,a[500];void cl(){memset(a,0,sizeof(a));l=0;}}b[5005];void gjj(bignum &a,bignum b){ a.l+=b.l;int x=0; for (int i=1;i<=a.l;i++) { a.a[i]=a.a[i]+b.a[i]+x; x=a.a[i]/10000; a.a[i]%=10000; } while (!a.a[a.l]) a.l--;}int main(){ scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&a[i]); int tot=0,maxx=0; a[++n]=-1e9; for (i=1;i<=n;i++) { int l=1,r=tot; while (l<=r) { int mid=(l+r)>>1; if (g[mid]<=a[i]) r=mid-1; else l=mid+1; } int now=i; if (!nxt[r+1].size() || a[i]!=a[nxt[r+1][nxt[r+1].size()-1].tim])//避免加入重复的数字 nxt[r+1].push_back((hh){i,a[i]}); else now=nxt[r+1][nxt[r+1].size()-1].tim; b[now].cl();//把以前的清零,因为作为结尾的话后面的数字一定比前面的优 if (r) for (int j=ll[r];j<nxt[r].size();j++) { if (nxt[r][j].z<=a[i]) ll[r]++; else gjj(b[now],b[nxt[r][j].tim]); } g[r+1]=a[i]; tot=max(tot,r+1); if (b[now].l==0) b[now].l=1,b[now].a[1]=1; //处理方式就是以前重复过的就覆盖以前的,因为最后手动加了一个最小数,以前所有的方案都会汇总到一起 } printf("%d ",tot-1); //高精度压4位 printf("%d",b[n].a[b[n].l]); for (i=b[n].l-1;i>=1;i--) { printf("%d",b[n].a[i]/1000); printf("%d",b[n].a[i]/100%10); printf("%d",b[n].a[i]/10%10); printf("%d",b[n].a[i]%10); }}
阅读全文
1 0
- [luogu1108&2687][USACO4.3]Buy Low, Buy Lower(STL乱搞+高精度)
- USACO4.3.1 Buy Low, Buy Lower (buylow)
- USACO4.3.1 Buy Low, Buy Lower (buylow)
- usaco4.3.1 Buy Low, Buy Lower
- [USACO4.3.1]Buy Low, Buy Lower
- BUY LOW, BUY LOWER
- buy low buy lower
- Buy Low, Buy Lower
- BUY LOW, BUY LOWER
- Buy Low Buy Lower
- BUY LOW,BUY LOWER
- BUY LOW, BUY LOWER
- usaco 4.3.1 Buy Low, Buy Lower DP + 高精度
- POJ1952 BUY LOW, BUY LOWER
- POJ1952 BUY LOW, BUY LOWER
- poj1952 BUY LOW, BUY LOWER
- BUY LOW, BUY LOWER poj
- BUY LOW, BUY LOWER poj1952
- HDU2089[不要62]--数位DP
- 关于TLS经验小结(上)
- JDBC 增删改查操作示例
- spring + redis 集群
- Android surfaceflinger(3)-DisplayDevice封装
- [luogu1108&2687][USACO4.3]Buy Low, Buy Lower(STL乱搞+高精度)
- 原型与继承
- 角色设计流程图
- c++实现一元稀疏多项式加减
- maven常见问题
- GitLab服务器经常502(阿里云搭建)
- git 常用命令
- Codeforces Round #448 (Div. 2) B,C,
- leetcode 47. Permutations II