CF922 CodeForces Round #461(Div.2)

这场比赛很晚呀

果断滚去睡了

现在来做一下

A

CF922 A

翻译:

一开始有一个初始版本的玩具

每次有两种操作:

放一个初始版本进去,额外得到一个初始版本和一个复制版本

放一个复制版本进去,额外得到两个复制版本

一开始有\(1\)个初始版本,是否能恰好得到\(x\)个复制版本和\(y\)个初始版本

Solution

傻逼题

要特判一些特殊情况(没有\(1A\)...)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int x,y;
int main()
{
x=read();y=read();
if(y==0){puts("No");return 0;}
if(y==1&&x!=0){puts("No");return 0;}
x-=y-1;
if(x<0){puts("No");return 0;}
if(x&1){puts("No");return 0;}
puts("Yes");
return 0;
}

B

CF992 B

翻译:

给定一个长度\(n\)

回答有多少个边长都小于\(n\)

并且边长的异或和为\(0\)的三角形

Solution

还是傻逼题

看到\(n<=2500\)

又有\(x\wedge y\wedge z=0\)

所以\(x\wedge y=z\)

暴力枚举\(x,y\)判断\(x\wedge y\)是否满足条件就好

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int ans=0;
int main()
{
int n=read();
for(int i=1;i<=n;++i)
for(int j=i;j<=n;++j)
if((i+j)>(i^j)&&(i<(i^j))&&(j<(i^j))&&((i^j)<=n))
++ans;
printf("%d\n",ans);
return 0;
}

C

CF992 C

翻译:

给定\(n,k\)(\(n,k\leq 10^{18}\))

回答\(n\ mod \ i,i\in [1,k]\)是否都不同

Solution

这题很有意思

我们来观察一下:

\(n\%1=0\)

\(n\%2=0,1\)

\(n\%3=0,1,2\)

既然\(n\%1=0\)

所以\(n\%2=1\)

所以\(n\%3=2\)

这样推下去,发现\(n\%i=i-1\)

所以给\(n\)加上\(1\)

它就能够被\(k!\)整除

当然不用算\(k!\)是什么

直接从\(k\)开始倒着枚举每一个数就好啦

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
ll n,k;
int main()
{
cin>>n>>k;
n++;
for(ll i=k;i;--i)
if(n%i){puts("No");return 0;}
puts("Yes");
return 0;
}

D

CF992 D

翻译:

有\(n\)个由\(s,h\)组成的串

这些串可以按照任意顺序连接

最大化\(sh\)子序列(不用连续)的数量

Solution

我好傻呀

这题其实挺简单的

记得原来做过一道题目叫做“数字积木”

就是给你若干个数字串,让你以一定顺序拼在一起

使得组成的数字最大

我们假设顺序已经定好

只能进行冒泡排序

如果比较两个相邻位置的顺序?

把两个串按照顺序分别接在一起,比较哪个放在前面更优

这题是一样的

对于只考虑两个相邻位置

前面其他串和后面其他串产生的贡献是不变的

变的只有这两个串组合在一起的贡献

所以计算两个是正着放更优还是反着放更优就好啦

upd:

感谢高神提醒,观察如果比较两个串拼接顺序产生的贡献

每个串自己内部的贡献也是一定的,

所以只需要考虑不同的串的贡献

就是前面串的\(s\)数量乘上后面的\(h\)数量

等价于按照\(s\)数量与\(h\)数量的比值排序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 120000
int n;
string t[MAX],S;
ll ans,tot;
int ss[MAX],hh[MAX],id[MAX],SS,HH;
ll calc(string s)
{
ll ret=0,tot=0;
for(int i=0,l=s.length();i<l;++i)
if(s[i]=='s')++tot;
else ret+=tot;
return ret;
}
bool cmp(string a,string b)
{
return calc(a+b)>calc(b+a);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;++i)cin>>t[i];
sort(&t[1],&t[n+1],cmp);
for(int i=1;i<=n;++i)S+=t[i];
cout<<calc(S)<<endl;
return 0;
}

E

CF922 E

翻译:

一条直线上有\(n\)棵树

每棵树上有\(ci\)只鸟

在一棵树底下召唤一直鸟的魔法代价是\(costi\)

没召唤一只鸟,魔法上限会增加\(B\)

从一棵树走到另一棵树,会增加魔法\(X\)

一开始的魔法和魔法上限都是\(W\)

问最多能够召唤的鸟的个数

Solution

发现关于魔法值的量的范围都非常大

但是鸟的个数很少

所以考虑\(dp\)的时候就不压魔法值

压鸟的只数

设\(f[i][j]\)表示前\(i\)棵树上,已经召唤了\(j\)只鸟,剩余的最大魔力值

转移应该很显然了

此时每次的最大魔力值也都能够算出

很高兴的\(AC\)了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1111
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n;
ll W,B,X;
ll f[1010][10010];
int c[MAX],v[MAX];
ll s[MAX];
int main()
{
n=read();W=read();B=read();X=read();
for(int i=1;i<=n;++i)s[i]=s[i-1]+(c[i]=read());
for(int i=1;i<=n;++i)v[i]=read();
memset(f,-63,sizeof(f));
f[0][0]=W-X;
for(int i=1;i<=n;++i)
{
for(int j=0;j<=s[i-1];++j)
{
if(f[i-1][j]<-1e9)continue;
ll tm=f[i-1][j];
tm=min(W+j*B,tm+X);
for(int k=0;k<=c[i];++k)
{
if(tm<v[i]*k)break;
f[i][j+k]=max(f[i][j+k],tm-v[i]*k);
}
}
}
for(int i=s[n];i;--i)
if(f[n][i]>=0)
{
printf("%d\n",i);
return 0;
}
puts("0");
return 0;
}

F

CF922 F

翻译:

对于一个数集\(I\)

\(f(I)\)表示\(I\)中\((a,b)\)的对数

满足\(a<b,b\%a=0\)

找出一个所有元素都不大于\(n\)的集合\(I\)

使得\(f(I)=k\)

Solution

如果所有数都被选了的话

那么,每个数的贡献就是它的约数个数

所以,对于约数个数可以求一个前缀和

找到第一个\(\geq K\)的位置就停下

那么,现在相当于只要用这些数就可以组成\(K\)组了

(默认从这个位置是\(n\)了)

现在考虑怎么组合

如果删掉一个数

就要考虑他的倍数和约数的贡献的影响

很麻烦,那么我们可以不可以抛开其中一个?

当然可以,约数是一定存在的,

但是倍数不一定,所以考虑一下没有倍数的数

那就是\(n/2~n\)

把这些数拿出来,按照约数个数排序

如果这个数被删掉,就一定会减少他约数个数的贡献

那么,从大到小排序之后,能删就删掉,这样就构造出了一组解

(不会证明为什么这样子一定存在)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 300003
int n,K;
ll d[MAX];
pair<int,int> c[MAX];
int tot;
bool vis[MAX];
int main()
{
ios::sync_with_stdio(false);
cin>>n>>K;
for(int i=1;i<=n;++i)
for(int j=i<<1;j<=n;j+=i)++d[j];
for(int i=1;i<=n;++i)d[i]+=d[i-1];
if(K>d[n]){puts("No");return 0;}
for(int i=1;i<=n;++i)
if(d[i]>K){n=i;break;}
for(int i=n;i*2>n;--i)c[++tot]=make_pair(d[i]-d[i-1],i);
sort(&c[1],&c[tot+1]);
int ss=d[n]-K;
for(int i=tot;i;--i)if(ss>=c[i].first)ss-=c[i].first,vis[c[i].second]=true;
tot=0;
for(int i=1;i<=n;++i)if(!vis[i])++tot;
puts("Yes");
printf("%d\n",tot);
for(int i=1;i<=n;++i)
if(!vis[i])printf("%d ",i);puts("");
return 0;
}

总结

其实这几道题目难度感觉不是很大

前面\(5\)题自己都能够做出来

其中\(E\)题其实是原来一道很相似的题目

但是想了很久才做出来,思维还是有点局限了

\(F\)题构造题

这种题目完全不擅长

也不会做,看了别人的\(AC\)代码才写出来

看来写完一场\(CF\)还是挺涨能力的

CF922 CodeForces Round #461(Div.2)的更多相关文章

  1. Codeforces Round #461 (Div. 2) B C D

    题目链接:http://codeforces.com/contest/922 B. Magic Forest time limit per test 1 second memory limit per ...

  2. Codeforces Round #461 (Div. 2)

    A - Cloning Toys /* 题目大意:给出两种机器,一种能将一种原件copy出额外一种原件和一个附件, 另一种可以把一种附件copy出额外两种附件,给你一个原件, 问能否恰好变出题目要求数 ...

  3. Codeforces Round #461 (Div. 2) D. Robot Vacuum Cleaner

    D. Robot Vacuum Cleaner time limit per test 1 second memory limit per test 256 megabytes Problem Des ...

  4. Codeforces Round #461 (Div. 2) C. Cave Painting

    C. Cave Painting time limit per test 1 second memory limit per test 256 megabytes Problem Descriptio ...

  5. Codeforces Round #461 (Div. 2) B. Magic Forest

    B. Magic Forest time limit per test 1 second memory limit per test 256 megabytes Problem Description ...

  6. Codeforces Round #461 (Div. 2) A. Cloning Toys

    A. Cloning Toys time limit per test 1 second memory limit per test 256 megabytes Problem Description ...

  7. Codeforces Round #461 (Div. 2)B-Magic Forest+位运算或优雅的暴力

    Magic Forest 题意:就是在1 ~ n中找三个值,满足三角形的要求,同时三个数的异或运算还要为0: , where  denotes the bitwise xor of integers  ...

  8. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  9. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

随机推荐

  1. 给Ocelot做一个Docker 镜像

    写在前面 在微服务架构中,ApiGateway起到了承前启后,不仅可以根据客户端进行分类,也可以根据功能业务进行分类,而且对于服务调用服务也起到了很好的接口作用.目前在各个云端中,基本上都提供了Api ...

  2. 基于Docker构建带有Rsync的Jenkins

    1.编辑Dockerfile文件 FROM jenkins USER root ADD sources.list /etc/apt/sources.list RUN apt-get update &a ...

  3. volatile简要解析

    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值 ...

  4. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  5. MySQL主从复制_复制过滤

    关于主从过滤,建议只在从服务器做设定,在Master 端为保证二进制日志的完整, 不建议使用二进制日志过滤. Master 可用参数: binlog-do-db= #定义白名单,仅将制定数据库的相关操 ...

  6. Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)

    运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的.. 这一章我们就来处理子弹和飞机的碰撞问题. 我们所有的操作都是基于Main这个容器来做的.所以我就把这个处理放到M ...

  7. Java--JDBC连接与Django--DATABASES设置

    JDBC 简介 JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行 SQL 语句的 JavaAPI,可以为多种关系 数据库提供统一访问,它由一组用 ...

  8. UVA 10534最长上升子序列运用

    在给定序列中寻找一个1~n+1递增,n~2n+1递减的序列,我的想法是直接对原序列和原序列的反序列用nlgn算法求递增序列,例如序列a[]={1,2,4,1,2,6},它的反序列为b[]={6,2,1 ...

  9. 吾八哥学Selenium(四):操作下拉框select标签的方法

    我们在做web页面自动化测试的时候会经常遇到<select></select>标签的下拉框,那么在Python里如何实现去操作这种控件呢?今天就给大家分享一下这个玩法.为了让大 ...

  10. C语言老司机学Python (五)

    今天看的是标准库概览. 操作系统接口: 用os模块实现. 针对文件和目录管理,还有个shutil模块可以用. 例句: import os os.getcwd() # 返回当前的工作目录 os.chdi ...