ARC105

2023-11-19

C - Camels and Bridge

题意:一堆骆驼过桥,每个桥有承重和长度,问骆驼从头到尾的最近距离

假设这时候骆驼的过桥顺序已经安排好

每一个桥相当于一个限制条件,限制了[l,r]的最近距离,也就是说,对于每一个骆驼 j,要保证

\forall_{i} dis[j]-dis[i]\geq[i,j]

好了把每个骆驼看作一个节点,跑最长路,NP

最终的图是一个DAG,DP求解最长路

考虑求出来[i,j],因为运用了差分约束的思想,所以不需要让[i,j]严格的表示为这一段的最大长度,只需要令[i,j]表示为承受不住这一段的桥的最大长度就行,可能[i,j]的值比此时求出的值要更大,剩下的交给其他情况处理(因为如果满足了所有的限制条件,这个解一定是一个合法解)

二分处理即可

#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int l,vmx;
	void read(){
		scanf("%d%d",&l,&vmx);
	}
};
bool cmp(node x,node y){
	if(x.l==y.l) return x.vmx>y.vmx;
	return x.l<y.l;
}
node mes[100010];
int dis[10],ans=1e18;
int v[10];
int now[10],id[10];
bool use[10];
int a,b,pre[101000],sum[10],dp[10];
void dfs(int gs);
int binary_search(int x);
signed main(){
	scanf("%lld%lld",&a,&b);
	for(int i=1;i<=a;i++) scanf("%lld",&v[i]);
	for(int i=1;i<=b;i++) mes[i].read();
	for(int i=1;i<=b;i++){
		for(int j=1;j<=a;j++){
			if(v[j]>mes[i].vmx){
				cout<<-1;
				return 0;
			}
		}
	}
	sort(mes+1,mes+b+1,cmp);
	for(int i=b-1;i>=1;i--) mes[i].vmx=min(mes[i].vmx,mes[i+1].vmx);
	dfs(1);
	printf("%lld",ans);
	return 0;
}
void dfs(int gs){
	if(gs>a){
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=a;i++) sum[i]=sum[i-1]+v[id[i]];
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=a;i++){
			for(int j=1;j<i;j++){
				dp[i]=max(dp[i],dp[j]+binary_search(sum[i]-sum[j-1]));
			}
		}
		ans=min(ans,dp[a]);
	}
	for(int i=1;i<=a;i++){
		if(!use[i]){
			use[i]=true,id[gs]=i;
			dfs(gs+1);
			use[i]=false;
		}
	}
}
int binary_search(int x){
	int l=0,r=b;
	while(l<r){
		int mid=ceil((double)(l+r)/2);
		if(mes[mid].vmx>=x) r=mid-1;
		else l=mid;
	}
	return mes[l].l;
}

D - Let's Play Nim

题意:先将n袋金币放到盘子里(每次随意放到任意盘子,盘子无数),再做nim游戏

对于出现偶数次的数量,可以抵消掉,故只需要看出现奇数次数量的

若n是偶数

没有数量出现过奇数次,最后金币异或和一定0,后手赢

否则去掉所有出现偶数次的数量,每次先手选取最大数量的放在一盘,这一盘的总数大于剩余金币的一半,故异或和大于0,先手胜

若n是奇数

先手必胜,就是能够取完一个后后手必胜

取完一个后,n为偶数,后手必胜条件为所有数量都出现偶数次

故先手必胜的条件为仅有一个数量出现了奇数次,否则后手必胜

#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int t;
int main(){
	scanf("%d",&t);
	while(t--){
		mp.clear();
		int a;
		scanf("%d",&a);
		for(int i=1;i<=a;i++){
			int w;
			scanf("%d",&w);
			mp[w]++;
		}
		if(a&1){
			int cnt=0;
			for(auto it=mp.begin();it!=mp.end();it++){
				cnt+=((it->second)^1);
			}
			if(cnt==1) printf("First\n");
			else printf("Second\n");
		}else{
			bool ok=false;
			for(auto it=mp.begin();it!=mp.end();it++){
				ok=max((int)ok,(it->second)&1);
			} 
			if(!ok) printf("Second\n");
			else printf("First\n");
		}
	}
	return 0;
}

E - Keep Graph Disconnected 

给定一个图,两个人往里面加边,保证无重边无自环且1,n不连通的情况下加不了边的人输,问谁会输

令最后1的连通块大小为x

故加边条数为 n*(n-1)/2-m-x*(n-x)

若n为奇数,此式奇偶性确定,故结局确定

若n为偶数,此式奇偶性与x有关

令y=n-x

易得每次能够影响x*y奇偶性的连通块大小为奇数

一开始1,n间不能连的边数为x*y

若x与y奇偶性不同,令x奇y偶,因为n为偶数,必然还有奇数块连通块大小为奇数

若先手想要x*y为奇数,将一块奇数大小添加到y上,否则填到x上

然后对方如果用一个奇数块加到x或y上,先手再加到另一块抵消,故先手必胜

若xy奇偶性相同

那么奇数块个数为偶数,此时若已经满足先手要求先手可以一直保持,否则后手可以一直保持(若是后手的要求一定为偶数)

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct dsu{
	int fa[100010],sz[100010];
	void init(int x){
		for(int i=1;i<=x;i++) fa[i]=i,sz[i]=1;
	}
	int get(int x){
		return x==fa[x]?x:fa[x]=get(fa[x]);
	}
	int get_sz(int x){
		return sz[get(x)];
	}
	void add(int x,int y){
		int xx=get(x),yy=get(y);
		if(xx!=yy) fa[xx]=yy,sz[yy]+=sz[xx];
	}
};
dsu ty;
int t;
signed main(){
	scanf("%lld",&t);
	while(t--){
		int a,b;
		scanf("%lld%lld",&a,&b);
		ty.init(a);
		for(int i=1;i<=b;i++){
			int o,k;
			scanf("%lld%lld",&o,&k);
			ty.add(o,k);
		}
		int ans=((a*(a-1)/2)&1)^(b&1);
		if(!(a&1)){
			int c1=0,c2=0;
			for(int i=1;i<=a;i++){
				c1+=(ty.get(i)==ty.get(1)),c2+=(ty.get(i)==ty.get(a));
			}
			if((ty.get_sz(1)&1)!=(ty.get_sz(a)&1)) ans=1;
			else ans=ans^((ty.get_sz(1)*ty.get_sz(a))&1);
		}
		ans?printf("First\n"):printf("Second\n");
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARC105 的相关文章

随机推荐

  • 最短Hamilton路径

    题目 题目链接 题解 状压dp f i j 表示从0点按照路径i走到j点的最短距离 其中i为二进制数 1表示走过某点 0表示未走过某点 比如10010表示经过了1 4两个点 而不经过0 2 3点 状态转移为 假设沿路径i走到j点经过k点 且
  • UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 0: illegal multibyte sequence

    f open testData testData pickle load f 错误提醒 gt UnicodeDecodeError gbk codec can t decode byte 0x80 in position 0 illegal
  • 如何在linux下开启FTP服务

    1 首先服务器要安装ftp软件 查看是否已经安装ftp软件下 which vsftpd 如果看到有vsftpd的目录说明服务器已经安装了ftp软件 2 查看ftp 服务器状态 service vsftpd status 3 启动ftp服务器
  • Ubuntu 16 安装IDEA

    1 安装JDK sudo mkdir usr local java cd usr loca java 将jdk 8u171 linux x64 tar gz移动到此处 然后 sudo tar zxvf jdk 8u171 linux x64
  • 三次iframe框架切换

    记录一次坑 做UI自动化 页面是嵌套的frame框架 整个页面是一个iframe 在iframe里面 上方是一个frame 下方是一个frame 下方frame里又分为左右两个frame 所以要定位右侧页面元素 需要三次切入frame框架
  • 强化学习基础三大优化方法:(一)动态规划

    文章目录 一 简介 二 动态规划 DP Dynamic Planning 方法 一 策略评估 二 策略迭代 1 策略改进 2 策略迭代 3 迭代算法 三 编程实践 一 环境介绍 二 策略编写 1 初始化 2 价值评估 3 策略改进 4 其他
  • 按哪个键进入BIOS设置

    按哪个键进入BIOS 一 笔记本电脑 1 主要按键 Delete ESC F1 F2 F10 2 不同品牌笔记本电脑进入BIOS按键 惠普hp 启动和重新启动时按f2或者F10 或者先按ESC再按F10 索尼sony 启动和重新启动时按f2
  • TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of t

    python类继承冲突问题 关键截图 描述 exa类同时继承了QtWidgets Ui MainWindow两个类 但是QtWidgets Ui MainWindow这两个类是冲突的 所以会报上述错误 可以修改为 class exa QtW
  • Educational Codeforces Round 98 (Rated for Div. 2)B-Toy Blocks

    B Toy Blocks time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Y
  • 转载-小白解惑-NUMA体系结构详解

    由于OpenStack Kilo增加很多针对NUMA体系结构的增强功能 所以又重新温习了下NUMA相关的知识 简单做个笔记 1 NUMA的几个概念 Node socket core thread 对于socket core和thread会有
  • Windows11 中 Vmware Workstations16 安装CentOS 7

    目录导航 准备 镜像导入安装及配置 CenOS7安装 准备 Windows版本是 Windows 11 专业版 版本 22H2 安装日期 2022 6 25 操作系统版本 22623 730 体验 Windows Feature Exper
  • php随机生成密码函数

    随机生成密码函数 param int length 密码长度 return string function generate password length 8 密码字符集 可任意添加你需要的字符 abc abcdefghijklmnopq
  • python常用编译器和解释器的区别_详解python编译器和解释器的区别

    详解python编译器和解释器的区别 高级语言不能直接被机器所理解执行 所以都需要一个翻译的阶段 解释型语言用到的是解释器 编译型语言用到的是编译器 编译型语言通常的执行过程是 源代码 预处理器 编译器 目标代码 链接器 可执行程序 某种意
  • Linux(CentOS 或者 Ubuntu都可以)安装docker

    Linux CentOS 或者 Ubuntu都可以 安装docker 介绍下如何在Linux下面安装docker 安装方式如下 1 关闭防火墙 systemctl stop firewalld systemctl disable firew
  • 【Unity Optimize】使用对象池(Object Pooling)优化项目

    目录 1 对象池 Object Pooling 介绍 2 实现对象池脚本 3 使用对象池生成Cube 4 效果展示 5 Unity资源商店的对象池插件 1 对象池 Object Pooling 介绍 Unity中的对象池 Object Po
  • 单例模式(小小单例,一点也不小)

    小小单例 一点也不小 今天终于发现了原来单例模式还有这么多道道 单例模式解决了两个基本问题 全局访问和实例化控制 出自 大话设计模式 懒汉式单例模式 定义 要在第一次被引用时 才会将自己实例化 所以就被称为懒汉式单例模式 也就是我们常用的单
  • C 标准库 - 《assert.h》

    原文链接 https www runoob com cprogramming c standard library assert h html 简介 C 标准库的 assert h头文件提供了一个名为 assert 的宏 它可用于验证程序做
  • R: R版本更新及R包迁移(详细步骤)

    在安装R包的过程中 有时候会提醒R版本不够等情况 当需要更新R版本 又需要保证旧版本安装的R包可以完整迁移到新版本R时 可通过 installr 包实现 install packages installr library installr
  • python使用SMTP发送邮件

    SMTP是发送邮件的协议 Python内置对SMTP的支持 可以发送纯文本邮件 HTML邮件以及带附件的邮件 Python对SMTP支持有smtplib和email两个模块 email负责构造邮件 smtplib负责发送邮件 首先 我们来构
  • ARC105

    C Camels and Bridge 题意 一堆骆驼过桥 每个桥有承重和长度 问骆驼从头到尾的最近距离 假设这时候骆驼的过桥顺序已经安排好 每一个桥相当于一个限制条件 限制了 l r 的最近距离 也就是说 对于每一个骆驼 j 要保证 好了