微信小程序换肤功能实现方法详细步骤与探讨
1036
2022-08-29
uoj132&&bzoj4200 【NOI2015】小园丁与老司机
Description 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面。田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2,3,…,n,每棵树可以看作平面上的一个点,其中第 ii 棵树 (1≤i≤n1≤i≤n) 位于坐标 (xi,yi)(xi,yi)。任意两棵树的坐标均不相同。 老司机 Mr. P 从原点 (0,0)(0,0) 驾车出发,进行若干轮行动。每一轮,Mr. P 首先选择任意一个满足以下条件的方向: 为左、右、上、左上 45∘45∘ 、右上 45∘45∘ 五个方向之一。 沿此方向前进可以到达一棵他尚未许愿过的树。 完成选择后,Mr. P 沿该方向直线前进,必须到达该方向上距离最近的尚未许愿的树,在树下许愿并继续下一轮行动。如果没有满足条件的方向可供选择,则停止行动。他会采取最优策略,在尽可能多的树下许愿。若最优策略不唯一,可以选择任意一种。 不幸的是,小园丁 Mr. S 发现由于田野土质松软,老司机 Mr. P 的小汽车在每轮行进过程中,都会在田野上留下一条车辙印,一条车辙印可看作以两棵树(或原点和一棵树)为端点的一条线段。 在 Mr. P 之后,还有很多许愿者计划驾车来田野许愿,这些许愿者都会像 Mr. P 一样任选一种最优策略行动。Mr. S 认为非左右方向(即上、左上 45∘45∘ 、右上 45∘45∘ 三个方向)的车辙印很不美观,为了维护田野的形象,他打算租用一些轧路机,在这群许愿者到来之前夯实所有“可能留下非左右方向车辙印”的地面。 “可能留下非左右方向车辙印”的地面应当是田野上的若干条线段,其中每条线段都包含在某一种最优策略的行进路线中。每台轧路机都采取满足以下三个条件的工作模式: 从原点或任意一棵树出发。 只能向上、左上 45∘45∘ 、右上 45∘45∘ 三个方向之一移动,并且只能在树下改变方向或停止。 只能经过“可能留下非左右方向车辙印”的地面,但是同一块地面可以被多台轧路机经过。 现在 Mr. P 和 Mr. S 分别向你提出了一个问题: 请给 Mr .P 指出任意一条最优路线。 请告诉 Mr. S 最少需要租用多少台轧路机。
Input 输入文件的第 1 行包含 1 个正整数 n,表示许愿树的数量。
接下来 n 行,第 i+1 行包含 2个整数 xi,yi,中间用单个空格隔开,表示第 i 棵许愿树的坐标。
Output 输出文件包括 3 行。 输出文件的第 1 行输出 1 个整数 m,表示 Mr. P 最多能在多少棵树下许愿。 输出文件的第 2 行输出 m 个整数,相邻整数之间用单个空格隔开,表示 Mr. P 应该依次在哪些树下许愿。 输出文件的第 3 行输出 1 个整数,表示 Mr. S 最少需要租用多少台轧路机。
Sample Input 6 -1 1 1 1 -2 2 0 8 0 9 0 10 Sample Output 3 2 1 3 3 explanation
最优路线 2 条可许愿 3 次:(0,0)→(1,1)→(−1,1)→(−2,2)(0,0)→(1,1)→(−1,1)→(−2,2) 或 (0,0)→(0,8)→(0,9)→(0,10)(0,0)→(0,8)→(0,9)→(0,10)。 至少 3 台轧路机,路线是 (0,0)→(1,1)(0,0)→(1,1),(−1,1)→(−2,2)(−1,1)→(−2,2) 和 (0,0)→(0,8)→(0,9)→(0,10)(0,0)→(0,8)→(0,9)→(0,10)。
之前写过这题但是复杂度不对 在uoj被hack path用来记录层与层之间的转移 虽然最多只有三个 还是开vector pre用来记录层内的转移 有可能很多需要vector 原来n^2转移限制可以暴力o(n)扫描一遍 用pre1记录之前有多少个可以转移到我这个点的最优值 注意初值给-inf 否则会被hack 其他详细做法看我曾经的blog 虽然这题并不需要判断是否有解 但最小流要求我们如果只是最小流的题目 第一遍跑网络流的时候需要判断是否误解 就把所有正的d加起来看是否和网络流值相同即可
#includedp[id]){ path[id].clear();dp[id]=dp[lsx[x]]+1; path[id].push_back(lsx[x]); }lsx[x]=id; if (dp[lss[s]]+1>dp[id]){ path[id].clear();dp[id]=dp[lss[s]]+1; path[id].push_back(lss[s]); }else if (dp[lss[s]]+1==dp[id]) path[id].push_back(lss[s]);lss[s]=id; if (dp[lsd[d]]+1>dp[id]){ path[id].clear();dp[id]=dp[lsd[d]]+1; path[id].push_back(lsd[d]); }else if (dp[lsd[d]]+1==dp[id]) path[id].push_back(lsd[d]);lsd[d]=id; }int preans=0; for (int i=fr;i<=to;++i){ int id=p[i].id;bk[i]=dp[id]; if (preans&&preans+i-fr>dp[id]){ dp[id]=preans+i-fr;pre[id].clear();pre[id]=pre1; }else{ if (preans&&preans+i-fr==dp[id]) for (int j=0;j
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~