USACO 2017 January Platinum
因为之前忘做了,赶紧补上。
T1.Promotion Counting
题目大意:给定一个以1为根的N个节点的树(N<=100,000),每个节点有一个权值,对于每个节点求出权值比它大的子孙的个数。
思路:肯定先要求出dfs序,首先无脑想到主席树,后来发现只要按权值从大到小处理就不用那么麻烦了。
#include<cstdio>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100000
#define lb(x) (x&-x)
struct edge{int nx,t;}e[MN+],p[MN+];
int h[MN+],en,d[MN+],o[MN+],cnt,s[MN+],ans[MN+];
bool cmp(edge a,edge b){return a.t>b.t;}
inline void ins(int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
void pre(int x)
{
d[x]=++cnt;
for(int i=h[x];i;i=e[i].nx)pre(e[i].t);
o[x]=cnt;
}
inline void inc(int x){for(;x<=MN;x+=lb(x))++s[x];}
inline int sum(int x){int r=;for(;x;x-=lb(x))r+=s[x];return r;}
int main()
{
fread(B,,<<,stdin);
int n=read(),i;
for(i=;i<=n;++i)p[i]=(edge){i,read()};
sort(p+,p+n+,cmp);
for(i=;i<=n;++i)ins(read(),i);
pre();
for(i=;i<=n;++i)
{
ans[p[i].nx]=sum(o[p[i].nx])-sum(d[p[i].nx]);
inc(d[p[i].nx]);
}
for(i=;i<=n;++i)printf("%d\n",ans[i]);
}
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))...
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
#define ll long long
char B[<<],*S=B,C;ll X;
inline ll read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100000
ll k,a[MN+];
ll cal(double x){return (ll)((sqrt(+*x)-)/);}
int main()
{
fread(B,,<<,stdin);
int n=read(),i;k=read()-n;double l,r,mid;ll cnt;
for(i=;i<=n;++i)a[i]=read();
for(l=,r=1e12;r-l>1e-;)
{
mid=(l+r)/;
for(cnt=,i=;i<=n;++i)cnt+=cal(a[i]/mid);
if(cnt<=k)r=mid;else l=mid;
}
for(i=,l=;i<=n;++i)l+=a[i]/(double)(cal(a[i]/r)+);
cout<<(ll)(l+0.5);
}
T3.Subsequence Reversal
题目大意:给定一个长度为N的序列,允许翻转一个子序列,求最长不下降子序列长度。(N<=50,序列元素在1..50内)
思路:一眼看上去很不可做,而且N这么小很吓人,仔细想想可以搞个类似区间DP,从整个序列开始,左边一个元素不翻或右边一个元素不翻或交换这两个元素(交换可能两个都选入答案也可能只选一个,转移时都要考虑),逐渐把区间缩小,然后再在状态里加上能取的数字区间,还是挺好转移的,复杂度O(N^2*maxai^2),另外题目里明明写的increasing却是不下降,很坑爹啊。
#include<cstdio>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 50
int a[MN+],f[MN+][MN+][MN+][MN+],ans;
inline void r(int&a,int b){if(b>a){a=b;if(b>ans)ans=b;}}
int main()
{
fread(B,,<<,stdin);
int n=read(),i,j,k,l;
for(i=;i<=n;++i)a[i]=read();
for(i=;i<=n;++i)for(j=n;j>=i;--j)
for(k=;k<=MN;++k)for(l=MN;l>=k;--l)
{
if(k<=a[i]&&a[i]<=l)
r(f[i+][j][a[i]][l],f[i][j][k][l]+),
r(f[i+][j-][k][a[i]],f[i][j][k][l]+);
if(k<=a[j]&&a[j]<=l)
r(f[i][j-][k][a[j]],f[i][j][k][l]+),
r(f[i+][j-][a[j]][l],f[i][j][k][l]+);
if(i<j&&k<=a[j]&&a[j]<=a[i]&&a[i]<=l)
r(f[i+][j-][a[j]][a[i]],f[i][j][k][l]+);
r(f[i+][j][k][l],f[i][j][k][l]);
r(f[i][j-][k][l],f[i][j][k][l]);
r(f[i][j][k+][l],f[i][j][k][l]);
r(f[i][j][k][l-],f[i][j][k][l]);
}
printf("%d",ans);
}
USACO 2017 January Platinum的更多相关文章
- USACO 2017 February Platinum
第二次参加USACO 本来打算2016-2017全勤的 January的好像忘记打了 听群里有人讨论才想起来铂金组三题很有意思,都是两个排列的交叉对问题 我最后得分889/1000(真的菜) T1.W ...
- USACO 2017 FEB Platinum mincross 可持久化线段树
题意 上下有两个位置分别对应的序列A.B,长度为n,两序列为n的一个排列.当Ai == Bj时,上下会连一条边.你可以选择序列A或者序列B进行旋转任意K步,如 3 4 1 5 2 旋转两步为 5 2 ...
- USACO 2017 FEB Platinum nocross DP
题目大意 上下有两个长度为n.位置对应的序列A.B,其中数的范围均为1~n.若abs(A[i]-B[j]) <= 4,则A[i]与B[j]间可以连一条边.现要求在边与边不相交的情况下的最大的连边 ...
- Usaco 2019 Jan Platinum
Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- 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 ...
- USACO 2005 January Gold The Wedding Juicer
题目 题目链接,我只在poj上找到了题目,usaco居然上不去. 大意就是说有一些\(1\times 1\times 1\)的小方块堆在一起,问最多能装多少水. 我们在一次测试中出了这题,由于我写水题 ...
- USACO 2016 January Contest, Gold解题报告
1.Angry Cows http://www.usaco.org/index.php?page=viewproblem2&cpid=597 dp题+vector数组运用 将从左向右与从右向左 ...
- [USACO] 2017 DEC Bronze&Silver
link:http://www.usaco.org/index.php?page=dec17results Problem A(Bronze) 这是一道非常简单的判断重叠面积的题目,但第一次提交仍会出 ...
随机推荐
- alpha-咸鱼冲刺day1-紫仪
总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花 ...
- 敏捷冲刺每日报告四(Java-Team)
第四天报告(10.28 周六) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- 200行Python代码实现2048
200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面 ...
- 织梦dedecms默认网站地图sitemap.html优化
网站地图对于网站优化很重要,搜索引擎就是靠网站地图去收录网站页面,本文主要讲解优化织梦自带的网站地图功能. 织梦自带的网站地图使用方法:织梦后台--生成--HTML更新--更新网站地图,可以在 ...
- windows 7 netsh wlan命令连接wifi
显示本机保存的profiles,配置文件是以wifi的ssid命名的. netsh wlan show profiles 用netsh wlan connect name=00_1111 连接其中一个 ...
- Linq GroupJoin
static void Main(string[] args) { List<Person> persons = new List<Person> { }, }, }; Lis ...
- 新概念英语(1-31)Where's Sally?
新概念英语(1-31)Where's Sally? Is the cat climbing the tree ? A:Where is Sally, Jack ? B:She is in the ga ...
- mysql的账户管理
mysql中账户管理:1 查看所有用户: 所有用户及权限信息都存储在mysql数据库中的user表中 查看user表的结构 desc user\G; 主要字段: host: 表示允许访问的主机 use ...
- maven环境变量的配置及+eclipse的配置使用
1. 环境搭建(Maven+eclipse) 进入CMD 输入: mvn –v 查看是否配置好 输入: mvn -version 可以查看其安装的版本 在eclipse中配置maven: 在h ...
- 百度echarts使用--y轴label数字太长难以全部显示
问题: 今天遇到个小问题,我们系统前端呈现使用了百度echarts.在绘制折线图的时候,因为数字过大,导致显示出现了问题. 解决方案: 左边y轴的值默认是根据我们填充进去的值来默认分割的,因为原始值就 ...