Codeforces Round #670 (Div. 2)
CF1406A Subset Mex
分析
从小到大考虑每一个数的出现次数,最小未出现的数就是A的mex值,
然后将A选完的数删掉一个接着以同样的方式找B的mex值,这显然是最优的
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,ans,c[111];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
for (rr int T=iut();T;--T){
n=iut(); rr int ans=0,j=0;
for (rr int i=0;i<101;++i) c[i]=0;
for (rr int i=1;i<=n;++i) ++c[iut()];
for (;j<101&&c[j];++j); ans=j;
for (rr int i=0;i<j;++i) --c[i];
for (rr int i=0;i<101;++i)
if (!c[i]) {ans+=i; break;}
printf("%d\n",ans);
}
return 0;
}
CF1406B Maximum Product
分析
考虑枚举负数的选择个数,如果为偶数个就使得所有数绝对值的乘积尽量大,
奇数个就使得所有数绝对值的乘积尽量小,0特判一下答案至少为0,将正数负数分别降序排序即可
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=100011; typedef long long lll;
int n1,n2,a[N],b[N]; lll ans;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(lll ans){
if (ans<0) putchar('-'),ans=-ans;
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline lll max(lll a,lll b){return a>b?a:b;}
signed main(){
for (rr int Test=iut();Test;--Test,putchar(10)){
rr lll ans=-1e18; n1=0,n2=0;
for (rr int T=iut();T;--T){
rr int x=iut();
if (!x) ans=0;
else if (x>0) a[++n1]=x;
else b[++n2]=x;
}
if (n1+n2<5) {print(ans); continue;}
sort(a+1,a+1+n1),reverse(a+1,a+1+n1),
sort(b+1,b+1+n2),reverse(b+1,b+1+n2);
if (n1>4) ans=(lll)a[1]*a[2]*a[3]*a[4]*a[5];
rr int mx=n1>4?1:(5-n1),mn=n2<5?n2:5;
for (rr int i=mx;i<=mn;++i)
switch (i){
case 1:{
ans=max(ans,(lll)b[1]*a[n1]*a[n1-1]*a[n1-2]*a[n1-3]);
break;
}
case 2:{
ans=max(ans,(lll)b[n2]*b[n2-1]*a[1]*a[2]*a[3]);
break;
}
case 3:{
ans=max(ans,(lll)b[1]*b[2]*b[3]*a[n1]*a[n1-1]);
break;
}
case 4:{
ans=max(ans,(lll)b[n2]*b[n2-1]*b[n2-2]*b[n2-3]*a[1]);
break;
}
case 5:{
ans=max(ans,(lll)b[1]*b[2]*b[3]*b[4]*b[5]);
break;
}
}
print(ans);
}
return 0;
}
CF1406C Link Cut Centroids
分析
考虑一棵树的重心最多只有两个,纵使有也必须相邻,
那么考虑将一个叶子节点拼接到一个重心上,那另外一个就不是重心了
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011; struct node{int y,next;}e[N<<1];
int siz[N],big[N],as[N],et,deg[N],root,Y,X,SIZ,n;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed max(int a,int b){return a>b?a:b;}
inline void dfs(int x,int fa){
siz[x]=1,big[x]=0;
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa){
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
big[x]=max(big[x],siz[e[i].y]);
}
big[x]=max(big[x],SIZ-siz[x]);
if (big[x]<big[root]) root=x;
}
signed main(){
for (rr int T=iut();T;--T){
n=iut(),et=1;
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et,++deg[y],
e[++et]=(node){x,as[y]},as[y]=et,++deg[x];
}
for (rr int i=2;i<=n;++i) if (deg[i]==1) {Y=i; break;}
X=e[as[Y]].y,big[0]=SIZ=n-1,root=0,dfs(X,Y);
printf("%d %d\n%d %d\n",X,Y,root,Y);
for (rr int i=1;i<=n;++i) deg[i]=as[i]=siz[i]=big[i]=0;
}
return 0;
}
CF1406D Three Sequences
分析
考虑一种构造形式,\(a\)上升的部分由\(b\)完成,\(a\)下降的部分由\(c\)完成,
实际上区间加只会影响左端点和右端点,可以差分完成,注意向上取整
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011;
typedef long long lll;
lll a[N],n,ans;
inline lll iut(){
rr lll ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(lll ans){
if (ans<0) putchar('-'),ans=-ans;
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline lll max(lll a,lll b){return a>b?a:b;}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) a[i]=iut();
for (rr int i=n;i>1;--i) a[i]-=a[i-1];
for (rr int i=2;i<=n;++i) ans+=max(a[i],0);
print((ans+a[1]+1)>>1),putchar(10);
for (rr int Q=iut();Q;--Q){
rr int l=iut(),r=iut()+1,x=iut();
if (l>1) ans+=max(a[l]+x,0)-max(a[l],0); a[l]+=x;
if (r<=n) ans+=max(a[r]-x,0)-max(a[r],0),a[r]-=x;
print((ans+a[1]+1)>>1),putchar(10);
}
return 0;
}
CF1406E Deleting Numbers
分析
考虑对答案\(x\)进行质因数分解,直接询问质数的指数幂会超过询问次数,
考虑根号内的质数这么处理求得当前结果\(now\),根号外的质数最多出现一次
如果\(now>1\)直接判断\(p*now\)是否出现,否则答案就是大质数,考虑将大质数分块,
每100个先全部删完再\(A\ 1\)判断是否有剩余,有剩余直接再判断一次,最大询问次数不超过给定询问次数
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,prime[10011],v[100011],ans,Cnt,Y;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed A(int x){
printf("A %d\n",x);
fflush(stdout);
return iut();
}
inline signed B(int x){
printf("B %d\n",x);
fflush(stdout);
return iut();
}
signed main(){
n=iut();
if (n==1){
printf("C 1\n"),fflush(stdout);
return 0;
}
for (rr int i=2;i<=n;++i){
if (!v[i]) prime[++Cnt]=i;
for (rr int j=1;j<=Cnt&&prime[j]<=n/i;++j){
v[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
for (Y=1;prime[Y]*prime[Y]<=n;++Y); --Y;
ans=1;
for (rr int i=1;i<=Y;++i){
B(prime[i]);
for (;prime[i]<=n/ans&&A(ans*prime[i]);ans*=prime[i]);
}
if (ans>1){
for (rr int i=Y+1;i<=Cnt&&prime[i]<=n/ans;++i)
if (A(ans*prime[i])) {ans*=prime[i]; break;}
printf("C %d\n",ans),fflush(stdout);
return 0;
}
for (rr int i=Y+1,las=A(1);i<=Cnt;i+=100){
rr int mn=i+99>Cnt?Cnt:(i+99),now;
for (rr int j=i;j<=mn;++j) B(prime[j]);
now=A(1);
if (las-now<mn-i+1){
for (rr int j=i;j<=mn;++j)
if (A(prime[j])) {ans=prime[j]; break;}
printf("C %d\n",ans),fflush(stdout);
return 0;
}
las=now;
}
printf("C %d\n",ans),fflush(stdout);
return 0;
}
Codeforces Round #670 (Div. 2)的更多相关文章
- Codeforces Round #670 (Div. 2) 深夜掉分(A - C题补题)
1406A. Subset Mex https://codeforces.com/contest/1406/problem/A Example input 4 6 0 2 1 5 0 1 3 0 1 ...
- Codeforces Round #670 (Div. 2) D. Three Sequences 题解(差分+思维+构造)
题目链接 题目大意 给你一个长为n的数组a,要你构造一个非严格单调上升的数组b和一个非严格单调下降的数组c,使得\(b_i+c_i=a_i\) 要你使这两个数组b,c中最大的元素最小,还有q次修改(q ...
- Codeforces Round #670 (Div. 2) C. Link Cut Centroids (dfs,树)
C. Link Cut Centroids Fishing Prince loves trees, and he especially loves trees with only one centro ...
- Codeforces Round #670 (Div. 2) B. Maximum Product (暴力)
题意:有一长度为\(n\)的序列,求其中任意五个元素乘积的最大值. 题解:先排序,然后乘积能是正数就搞正数,模拟一下就好了. 代码: int t; ll n; ll a[N]; int main() ...
- Codeforces Round #670 (Div. 2) A. Subset Mex (贪心)
题意:给你一长度为\(n\)的序列,将其分为两个集合,求两个集合中未出现的最小元素的最大值, 题解:用桶存一下每个元素的个数,两次枚举\([1,100]\),找出两个最小值即可. 代码: int t; ...
- 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 ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
随机推荐
- 走进Kaggle的未知领域:性别和年龄推断算法解析
1.环境设置: 此环节将加载实现笔记本无缝功能的基本模块,包括NumPy.Pandas和TensorFlow等库.此外,它还建立了关键的环境常数,如图像尺寸和学习率,这对后续分析和模型训练至关重要 ...
- 学习go语言编程之并发编程
并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...
- requests请求超时尝试重连的3种方式
参考文档 https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#module-urllib3.util.retry ...
- MySQL和Redis基本安装和配置
MySQL 下载和安装 mysql官网下载:https://dev.mysql.com/downloads/mysql/ 下载后将目录下的bin路径加入到环境变量中 在安装目录下创建 my.ini 配 ...
- 在矩池云安装使用PaddleHub 和 PaddlePaddle
之前在安装 PaddleHub 导入的时候遇到各种错误,不是这个包没这个模块,就是哪个包没这个属性 ...很头痛,网上也没有 PaddleHub 和 PaddlePaddle 对应的版本,只能自己慢慢 ...
- 通过Glide加载不可见的图片
今天遇到一个需求,需要点击分享的时候生成图片以及二维码. 即:将带有图片以及二维码的布局文件生成Bitmap,当然这个布局文件是后台生成的,并不可见,这时候会发现使用Glide加载图片没有反应. 源码 ...
- 2022_vue3笔记
由于公司项目有vue2.5,自己电脑又要3.2,总不可能总是安装删除环境,这儿使用安装nvm版本管理 安装node前配置一下镜像地址 node_mirror: https://npm.taobao.o ...
- SSH原理与实践(二)
主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在上一篇文章[ssh原理与实践(一)]中我们详细介绍了SSH两种 ...
- 摆脱鼠标系列 - vscode 软件 最大化快捷键 - win + ↑
摆脱鼠标系列 - vscode 软件 最大化快捷键 - win + ↑ vscode默认打开不是最大化,所以按 win + 上箭头 使其最大化 不想按 F11 那个不太方便,左上角就没有项目名称了 优 ...
- 摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 - 然后F4 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件
摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件 F1的设置可能在其他贴子了 最新特大好消息 F4 是搜索完的跳转 等于F1 ...