因为之前忘做了,赶紧补上。

T1.Promotion Counting

题目大意:给定一个以1为根的N个节点的树(N<=100,000),每个节点有一个权值,对于每个节点求出权值比它大的子孙的个数。

思路:肯定先要求出dfs序,首先无脑想到主席树,后来发现只要按权值从大到小处理就不用那么麻烦了。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. char B[<<],*S=B,C;int X;
  5. inline int read()
  6. {
  7. while((C=*S++)<''||C>'');
  8. for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
  9. return X;
  10. }
  11. #define MN 100000
  12. #define lb(x) (x&-x)
  13. struct edge{int nx,t;}e[MN+],p[MN+];
  14. int h[MN+],en,d[MN+],o[MN+],cnt,s[MN+],ans[MN+];
  15. bool cmp(edge a,edge b){return a.t>b.t;}
  16. inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
  17. void pre(int x)
  18. {
  19. d[x]=++cnt;
  20. for(int i=h[x];i;i=e[i].nx)pre(e[i].t);
  21. o[x]=cnt;
  22. }
  23. inline void inc(int x){for(;x<=MN;x+=lb(x))++s[x];}
  24. inline int sum(int x){int r=;for(;x;x-=lb(x))r+=s[x];return r;}
  25. int main()
  26. {
  27. fread(B,,<<,stdin);
  28. int n=read(),i;
  29. for(i=;i<=n;++i)p[i]=(edge){i,read()};
  30. sort(p+,p+n+,cmp);
  31. for(i=;i<=n;++i)ins(read(),i);
  32. pre();
  33. for(i=;i<=n;++i)
  34. {
  35. ans[p[i].nx]=sum(o[p[i].nx])-sum(d[p[i].nx]);
  36. inc(d[p[i].nx]);
  37. }
  38. for(i=;i<=n;++i)printf("%d\n",ans[i]);
  39. }

T2.Building a Tall Barn

题目大意:给定长度为N的序列ai,对每个ai分配ci使得ci>0且ci之和等于K,求出最小的ai/ci之和。(N<=100,000,K<=10^12)

思路:容易想到先给每个ai分1,用堆维护每个ai再多分1能获得的收益,O(KlogN)实现。也就相当于N堆物品,从中取走K个求最大收益,我们二分一个取的下界,把大于这个下界的都取走,看看取了几个就可以了,取几个我一开始也二分,T了,然后发现可以数学直接算。另外这题精度要求可能比较大,二分多分几次就行了,最后O(NlogK)。从题解中学到了种二分写法(虽然好像以前见识过):for(i=1;i<=100;++i)if(check(mid))...

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<iostream>
  4. using namespace std;
  5. #define ll long long
  6. char B[<<],*S=B,C;ll X;
  7. inline ll read()
  8. {
  9. while((C=*S++)<''||C>'');
  10. for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
  11. return X;
  12. }
  13. #define MN 100000
  14. ll k,a[MN+];
  15. ll cal(double x){return (ll)((sqrt(+*x)-)/);}
  16. int main()
  17. {
  18. fread(B,,<<,stdin);
  19. int n=read(),i;k=read()-n;double l,r,mid;ll cnt;
  20. for(i=;i<=n;++i)a[i]=read();
  21. for(l=,r=1e12;r-l>1e-;)
  22. {
  23. mid=(l+r)/;
  24. for(cnt=,i=;i<=n;++i)cnt+=cal(a[i]/mid);
  25. if(cnt<=k)r=mid;else l=mid;
  26. }
  27. for(i=,l=;i<=n;++i)l+=a[i]/(double)(cal(a[i]/r)+);
  28. cout<<(ll)(l+0.5);
  29. }

T3.Subsequence Reversal

题目大意:给定一个长度为N的序列,允许翻转一个子序列,求最长不下降子序列长度。(N<=50,序列元素在1..50内)

思路:一眼看上去很不可做,而且N这么小很吓人,仔细想想可以搞个类似区间DP,从整个序列开始,左边一个元素不翻或右边一个元素不翻或交换这两个元素(交换可能两个都选入答案也可能只选一个,转移时都要考虑),逐渐把区间缩小,然后再在状态里加上能取的数字区间,还是挺好转移的,复杂度O(N^2*maxai^2),另外题目里明明写的increasing却是不下降,很坑爹啊。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. char B[<<],*S=B,C;int X;
  5. inline int read()
  6. {
  7. while((C=*S++)<''||C>'');
  8. for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
  9. return X;
  10. }
  11. #define MN 50
  12. int a[MN+],f[MN+][MN+][MN+][MN+],ans;
  13. inline void r(int&a,int b){if(b>a){a=b;if(b>ans)ans=b;}}
  14. int main()
  15. {
  16. fread(B,,<<,stdin);
  17. int n=read(),i,j,k,l;
  18. for(i=;i<=n;++i)a[i]=read();
  19. for(i=;i<=n;++i)for(j=n;j>=i;--j)
  20. for(k=;k<=MN;++k)for(l=MN;l>=k;--l)
  21. {
  22. if(k<=a[i]&&a[i]<=l)
  23. r(f[i+][j][a[i]][l],f[i][j][k][l]+),
  24. r(f[i+][j-][k][a[i]],f[i][j][k][l]+);
  25. if(k<=a[j]&&a[j]<=l)
  26. r(f[i][j-][k][a[j]],f[i][j][k][l]+),
  27. r(f[i+][j-][a[j]][l],f[i][j][k][l]+);
  28. if(i<j&&k<=a[j]&&a[j]<=a[i]&&a[i]<=l)
  29. r(f[i+][j-][a[j]][a[i]],f[i][j][k][l]+);
  30. r(f[i+][j][k][l],f[i][j][k][l]);
  31. r(f[i][j-][k][l],f[i][j][k][l]);
  32. r(f[i][j][k+][l],f[i][j][k][l]);
  33. r(f[i][j][k][l-],f[i][j][k][l]);
  34. }
  35. printf("%d",ans);
  36. }

USACO 2017 January Platinum的更多相关文章

  1. USACO 2017 February Platinum

    第二次参加USACO 本来打算2016-2017全勤的 January的好像忘记打了 听群里有人讨论才想起来铂金组三题很有意思,都是两个排列的交叉对问题 我最后得分889/1000(真的菜) T1.W ...

  2. USACO 2017 FEB Platinum mincross 可持久化线段树

    题意 上下有两个位置分别对应的序列A.B,长度为n,两序列为n的一个排列.当Ai == Bj时,上下会连一条边.你可以选择序列A或者序列B进行旋转任意K步,如 3 4 1 5 2 旋转两步为 5 2 ...

  3. USACO 2017 FEB Platinum nocross DP

    题目大意 上下有两个长度为n.位置对应的序列A.B,其中数的范围均为1~n.若abs(A[i]-B[j]) <= 4,则A[i]与B[j]间可以连一条边.现要求在边与边不相交的情况下的最大的连边 ...

  4. Usaco 2019 Jan Platinum

    Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...

  5. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  6. NC24083 [USACO 2017 Dec P]Greedy Gift Takers

    NC24083 [USACO 2017 Dec P]Greedy Gift Takers 题目 题目描述 Farmer John's nemesis, Farmer Nhoj, has N cows ...

  7. USACO 2005 January Gold The Wedding Juicer

    题目 题目链接,我只在poj上找到了题目,usaco居然上不去. 大意就是说有一些\(1\times 1\times 1\)的小方块堆在一起,问最多能装多少水. 我们在一次测试中出了这题,由于我写水题 ...

  8. USACO 2016 January Contest, Gold解题报告

    1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...

  9. [USACO] 2017 DEC Bronze&Silver

    link:http://www.usaco.org/index.php?page=dec17results Problem A(Bronze) 这是一道非常简单的判断重叠面积的题目,但第一次提交仍会出 ...

随机推荐

  1. css变化代码

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  2. hadoop基础教程免费分享

    提起Hadoop相信大家还是很陌生的,但大数据呢?大数据可是红遍每一个角落,大数据的到来为我们社会带来三方面变革:思维变革.商业变革.管理变革,各行业将大数据纳入企业日常配置已成必然之势.阿里巴巴创办 ...

  3. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  4. 利用Node的chokidar 监听文件改变的文件。

    最近维护一个项目.每次改完东西,都要上传到服务器.然后有时候就忘记一些东西,于是就想有没有可以方法能监听文件的改变.然后我再利用程序把更改的文件一键上传到服务器. 于是就找到了nodejs 的chok ...

  5. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  6. 使用pie.htc时Border-radius的兼容

    如果一个图层中(navin)使用了pie.htc来对ie6,7,8进行兼容,如若上一层(navwrap)的样式中有背景的属性,则此层 (navin) 在ie6,7,8中背景颜色不显示.如下图:此部分的 ...

  7. Python内置函数(21)——tuple

    英文文档: The constructor builds a tuple whose items are the same and in the same order as iterable's it ...

  8. websocketj--随时随地在Web浏览器中操作你的服务端程序

    0 - 有没有觉得Linux标准终端界面输入输出枯燥无味? 1 - 什么?vmstat命令的输出数据不直观?有没有想过能够可视化该命令的输出? 2 - 尝试过用浏览器操作Windows中的cmd吗? ...

  9. 实现一个网易云音乐的 BottomSheetDialog

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  10. linux环境安装mysql,以及mysql基本的终端操作命令

    linux环境下安装mysql服务器.客户端mysql简单的终端操作指令(使用数据库.简单的增删改查和备份恢复)1 SQL: Structured Query Language 结构化查询语言. 运用 ...