I - Cloud Retainer's Game
I - Cloud Retainer's Game
传送门: I. Cloud Retainer's Game (codeforces.com)
题意:
在坐标轴上有2个边界:y=0和y=H。有n个质点(木板),m个宝物(硬币)。一个小球从(0,0)点开始移动方向为。
小球遇到木板或边界之后,y轴方向上的速度取反,即变成。
问删掉任意个质点之后,小球最多遇到多少个宝物。
附上题面下面的图片帮助理解:

解法:
移动有两个方向:分别是方向和方向,表达式分别为 \((x+y)\%2H=m\)和\((2H-x+y)\%2H=m\)
也就是说,对于特征值m的路线,可以通过木板反弹在这两个表达式切换,或者删掉木板保持表达式。
令\(dp_i\)为特征值为i的线路中遇到的宝物的最大数量。
我们可以按照x的大小从大到小往起点方向dp。(因为起点是所有路线一定经过且唯一确定的,其他点不一定是经过的,所以\(dp_0\)一定是最大的,也即答案)
对于一个木板,我们可以算出经过这个木板的两个方向的线路的特征值 \((x+y)\%2H=m1\)和\((2H-x+y)\%2H=m2\)。因为可以删或不删从而在两个方向任意选择,所以\(dp_{m1},dp_{m2}\)都应该取\(max(dp_{m1},dp_{m2})\)。
对于一个宝物,我们可以算出经过这个宝物的两个方向的线路的特征值 \((x+y)\%2H=m1\)和\((2H-x+y)\%2H=m2\)。两个线路的贡献的加一即可。
代码实现:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+10;
signed main(){
    ios::sync_with_stdio(false);
    int T;cin>>T;
    while(T--){
        vector<array<int,3>>ve;
        map<int,int>ans;
        int H;cin>>H;
        int n;cin>>n;
        for(int i=1;i<=n;i++){
            int x,y;cin>>x>>y;
            ve.push_back({x,y,0});
        }
        int m;cin>>m;
        for(int i=1;i<=m;i++){
            int x,y;cin>>x>>y;
            ve.push_back({x,y,1});
        }
        sort(ve.begin(),ve.end(),[](array<int,3>x,array<int,3>y){
            return x[0]>y[0];
        });
        for(auto i:ve){
            int x=i[0],y=i[1];
            int a=(x+y)%(2*H),b=(2*H-y+x)%(2*H);
            if(i[2]){
                ans[a]++;
                ans[b]++;
            }
            else {
                ans[a]=ans[b]=max(ans[a],ans[b]);
            }
        }
        cout<<ans[0]<<"\n";
    }
}
I - Cloud Retainer's Game的更多相关文章
- On cloud, be cloud native
		本来不想起一个英文名,但是想来想去都没能想出一个简洁地表述该意思的中文释义,所以就用了一个英文名称,望见谅. Cloud Native是一个刚刚由VMware所提出一年左右的名词.其表示在设计并实现一 ... 
- 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(六)
		(六)在Website Cloud中添加site 1新建Website,并打开 使用前面创建的用户 newbee@waplab.com 登录租户Portal,新建一个website 新建完成后, 可以 ... 
- 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(五)
		(五)注册Website Cloud 1 注册Website Cloud 添加Website Cloud 连接Website Cloud 注意, endpoint 是使用Management Se ... 
- 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(四)
		(四)搭建Website Cloud环境 1安装CONTROLLER主机 在开始安装Web site Cloud之前,读者应该对该服务的拓扑结构有个大概了解. 如图: Controller是非常重要的 ... 
- 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(二)
		前言 (二)建立虚拟网络环境,以及域控和DNS服务器 1搭建虚拟网络环境 在Azure上创建虚拟网络.本例选择的是东南亚数据中心.后面在创建虚机的时候,也选择这个数据中心. VNet Name: ... 
- spring/spring boot/spring  cloud开发总结
		背景 针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ... 
- Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段
		在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ... 
- Oracle Sales Cloud:管理沙盒(定制化)小细节1——利用公式创建字段并显示在前端页面
		Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的CRM管理系统.由于 Oracle 销售云是基于 Oracle 云环境的,它与传统的管理系统相比,显著特点之一便 ... 
- Oracle Sales Cloud:报告和分析(BIEE)小细节2——利用变量和过滤器传参(例如,根据提示展示不同部门的数据)
		在上一篇随笔中,我们建立了部门和子部门的双提示,并将部门和子部门做了关联.那么,本篇随笔我们重点介绍利用建好的双提示进行传参. 在操作之前,我们来看一个报告和分析的具体需求: [1] 两个有关联的提示 ... 
- Oracle Sales Cloud:报告和分析(BIEE)小细节1——创建双提示并建立关联(例如,部门和子部门提示)
		Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的客户商机管理系统,通过提供丰富的功能来帮助提高销售效率,更好地去了解客户,发现和追踪商机,为最终的销售成交 (d ... 
随机推荐
- fragment加radio不可滑动
			public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { ... 
- js实现字符串得填充
			方法一: //填充截取法 function padding4(str, length) { //这里用slice和substr均可 return (Array(length).join("0 ... 
- Linux环境使用Docker安装MongoDb
			系统环境: CentOS 7.6 64位(同样适用于Ubuntu) 安装步骤: 1.创建文件夹 /home/docker/mongo/config /home/docker/mongo/data 2. ... 
- python如何提取word内的图片
			解压.docx文件实现提取图片 前言 .docx文件其实也就是一个压缩文件,当我们将一个.docx文件直接解压后可以看到如下目录 其中我们要找的图片就在word/media目录内,如图 所以,要提取w ... 
- js - console
			js - console 参考资料 JavaScript Console 对象 Node.js console.debug()用法及代码示例 nodejs.org console.log输出字体颜色 ... 
- Filament初探,全场景性能测试
			一直很想研究下Filament在移动端全场景(大约20万Triangle,约120个渲染实体)的实时帧率.终于在今天有时间腾出来研究下Filament在Android上的全场景PBR渲染性能. 这里以 ... 
- canvas 模糊
			让style以50%的效果展示 创建2倍的canvas <!DOCTYPE html> <html> <head> <meta charset="u ... 
- nodejs  express  服务代理
			//方法1 var proxy = require('express-http-proxy'); app.use('/map', proxy('https://test.baidu.com/', { ... 
- shell_Day01
			1.判断/etc/inittab文件是否大于100行,如果大于,则显示"/etc/inittab is a big file."否者显示"/etc/inittab is ... 
- 安装并学习git的基本使用;注册Github账号,并创建仓库,编辑自我介绍,并提交commit
			安装.学习.注册Git成功,也创建了仓库和自我介绍. 但Git clone没有做,再打开Git网页一直出现错误,不理解. 
