咕咕咕了好多天终于有时间写篇博客了_(:з」∠)_

打网赛打到自闭的一周,终于靠这场CF找回了一点信心...

1041A - Heist

\(ans=max\left \{ a_i \right \}-min\left \{ a_i \right \}+1-n\)

#include<bits/stdc++.h>
using namespace std;
#define N 1001
int n,a[N],mx,mi;
int main()
{
mi=;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),
mx=max(mx,a[i]),
mi=min(mi,a[i]);
printf("%d\n",mx-mi+-n);
return ;
}

1041B - Buying a TV Set

设\(d=gcd(x,y), X=\frac{x}{d}, Y=\frac{y}{d}\),则\(ans=min(\frac{a}{X},\frac{b}{Y})\)

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL a,b,x,y;
LL gcd(LL x,LL y){return y?gcd(y,x%y):x;}
int main()
{
scanf("%I64d%I64d%I64d%I64d",&a,&b,&x,&y);
LL d=gcd(x,y);x/=d,y/=d;printf("%I64d\n",min(a/x,b/y));
}

1041C - Coffee Break

难点在于理解题意,题意大致就是把\(n\)分成\(x\)块,使得每块里的数两两相差大于\(d\),求最小的\(x\)

直接排序之后莽就好了,贪心是能保证正确性的

#include<bits/stdc++.h>
using namespace std;
#define N 200001
#define mp make_pair
struct rua{int v,id;}a[N];
set<pair<int,int> >s;
int n,m,d,cnt,f[N];
bool cmp(rua x,rua y){return x.v<y.v;}
int main()
{
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=n;i++)
scanf("%d",&a[i].v),a[i].id=i;
sort(a+,a+n+,cmp);
s.insert(mp(a[].v,)),f[a[].id]=++cnt;
for(int i=;i<=n;i++)
{
if((*s.begin()).first+d<a[i].v)
f[a[i].id]=(*s.begin()).second,s.erase(s.begin()),s.insert(mp(a[i].v,f[a[i].id]));
else s.insert(mp(a[i].v,++cnt)),f[a[i].id]=cnt;
}
printf("%d\n",cnt);
for(int i=;i<=n;i++)
printf("%d%c",f[i],i<n?' ':'\n');
}

1041D - Glider

显然在气流的开头跳是最优的,因此枚举在哪个气流的开头跳,二分求出能撑到第几个气流结束,通过预处理可以得到在一个区间内可以被抬多久,从而得出答案

#include<bits/stdc++.h>
using namespace std;
#define N 200001
int n,h,ans,s[N];
struct rua{int l,r;}a[N];
bool check(int st,int i,int j)
{
return h-(a[i].r-st)+(s[i]-s[j-])>;
}
int get(int st,int i)
{
int l=i,r=n;
while(l<r)
{
int mid=l+r+>>;
if(check(st,mid,i))l=mid;
else r=mid-;
}
return h+(s[l]-s[i-]);
}
int main()
{
scanf("%d%d",&n,&h);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r),s[i]=s[i-]+a[i].r-a[i].l;
for(int i=;i<=n;i++)
ans=max(ans,get(a[i].l,i));
printf("%d\n",ans);
return ;
}

1041E - Tree Reconstruction

显然\(n\)这个数一定会出现\(n-1\)次,现在只需考虑其他数字的出现情况

考虑\(n-1\)这个数,它出现的次数是等于\(n-1\)所在点到\(n\)所在距离的,且在从\(n\)到\(n-1\)这条路径上出现的数字是不会在输入中出现的。若将剩余出现的数从大到小排序,则有 当前数字出现次数=当前数字所在点到已知路径的距离,这里的已知路径是指已加入点之间的路径。可以发现构造一条链是足以满足题意的,对于空出的点将数字从大到小依次填入,并判断合法性即可。

代码中\(c_i\)为数字\(i\)出现的次数,\(p_i\)为数字\(i\)在答案中的位置,\(x_i\)则代表第\(i\)个位置是否已经被使用

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int n,a[N],b[N],l,j=,c[N],p[N],ans[N],f[N],g[N];
bool x[N];
int main()
{
scanf("%d",&n),c[n]=p[n]=,l=n,x[]=true;
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
if(a[i]<b[i])swap(a[i],b[i]);
if(a[i]<n)return printf("NO\n"),;
c[b[i]]++;
}
for(int i=n-;i>=;i--)if(c[i])
p[i]=p[l]+c[i],l=i,x[p[i]]=true;
for(int i=n;i>=;i--)if(!c[i])
{
while(j<=n && x[j])j++;p[i]=j,x[j]=true;
}
for(int i=;i<=n;i++)ans[p[i]]=i;
for(int i=;i<=n;i++)f[i]=max(f[i-],ans[i]);
for(int i=n;i>=;i--)g[i]=max(g[i+],ans[i]);
for(int i=;i<n;i++)
{
int A=f[i],B=g[i+],xx=;
for(int j=;j<=n;j++)
if(A==a[j] && B==b[j])
{a[j]=b[j]=,xx=;break;}
if(!xx)return printf("NO\n"),;
}
printf("YES\n");
for(int i=;i<=n;i++)printf("%d %d\n",ans[i-],ans[i]);
}

1041F - Ray in the tube

\(y1\)和\(y2\)是没用的,不用管它

由于\(n\)和\(m\)均大于等于1,因此答案至少为2,不少人因此FST

考虑射出去的线打到对面板上所需要走的距离\(d\),假设出发点为0,则打在自己这边上的点的坐标为\(\left \{ 0,2d,4d,6d,8d,... \right \}\),打在对面板上的则是\(\left \{ d,3d,5d,7d,9d,... \right \}\)。若将距离改为\(k\cdot d\),则两个点集分别为\(\left \{ 0,2kd,4kd,6kd,8kd,... \right \}\),\(\left \{ kd,3kd,5kd,7kd,9kd,... \right \}\),可以发现若\(k\)为奇数,两个集合中的点都只会减少不会增加,\(k\)为偶数时则有存在增减的情况,因此设\(k=2^{l}\)一定是最优的

接下去就直接暴力开个map做就好了,比赛的时候害怕FST还加了个优化,就是当\(k\)比较小时直接从\(0\)到\(k-1\)枚举余数,\(k\)较大时才遍历\(n+m\)个坐标。后来发现这个优化只优化了100ms...

#include<bits/stdc++.h>
using namespace std;
#define N 100001
int n,m,y,a[N],b[N];
map<int,int>f,g;
int main()
{
scanf("%d%d",&n,&y);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d%d",&m,&y);
for(int i=;i<=m;i++)
scanf("%d",&b[i]);
int ans=;
for(int k=;k;k*=)
{
f.clear(),g.clear();
for(int i=;i<=n;i++)
f[a[i]%k]++;
for(int i=;i<=m;i++)
g[b[i]%k]++;
if(k<=)
for(int i=;i<k;i++)
ans=max(ans,f[i]+g[(i+k/)%k]);
else
{
for(auto j:f)ans=max(ans,f[j.first]+g[(j.first+k/)%k]);
for(auto j:g)ans=max(ans,g[j.first]+f[(j.first+k/)%k]);
}
if(k==)
break;
}
printf("%d\n",ans);
return ;
}

Codeforces Round #509 (Div. 2)的更多相关文章

  1. Codeforces Round #509 (Div. 2) F. Ray in the tube(思维)

    题目链接:http://codeforces.com/contest/1041/problem/F 题意:给出一根无限长的管子,在二维坐标上表示为y1 <= y <= y2,其中 y1 上 ...

  2. Codeforces Round #509 (Div. 2) E. Tree Reconstruction(构造)

    题目链接:http://codeforces.com/contest/1041/problem/E 题意:给出n - 1对pair,构造一颗树,使得断开其中一条边,树两边的最大值为 a 和 b . 题 ...

  3. codeforces 1041d// Glider// Codeforces Round #509(Div. 2)

    题意:给出,n和飞行员高度h,n是区间数.在区间里飞行员高度不变,其它地方每秒高度-1,x坐标+1.问在高度变为0以前,x坐标最多加多少? 用数组gap记录本区间右端到下一个区间左端的距离.用sum记 ...

  4. Codeforces Round#509 Div.2翻车记

    A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. Codeforces Round #509 (Div. 2) A. Heist 贪心

    There was an electronic store heist last night. All keyboards which were in the store yesterday were ...

  6. 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 ...

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

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

  8. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. [物理学与PDEs]第4章第2节 反应流体力学方程组 2.4 反应流体力学方程组的数学结构

    1.  粘性热传导反应流体力学方程组是拟线性对称双曲 - 抛物耦合组. 2.  理想反应流体力学方程组是一阶拟线性对称双曲组 (取 ${\bf u},p,S,Z$ 为未知函数). 3.  右端项具有间 ...

  2. [物理学与PDEs]第1章第2节 预备知识 2.2 Ampere-Biot-Savart 定律, 静磁场的散度与旋度

    1. 电流密度, 电荷守恒定律 (1) 电荷的定向移动形成电流. (2) 电流密度 ${\bf j}$, 是描述导体内一点在某一时刻电流流动情况的物理量, 用单位时间内通过垂直于电流方向的单位面积的电 ...

  3. LCA学习笔记

    写在前面 目录 一.LCA的定义 二.暴力法求LCA 三.倍增法求LCA 四.树链剖分求LCA 五.LCA典型例题 题目完成度 一.LCA的定义 LCA指的是最近公共祖先.具体地,给定一棵有根树,若结 ...

  4. (二)校园信息通微信小程序从后台获取首页的数据笔记

    在从后台获取数据之前,需要先搭建好本地服务器的环境. 确保Apache,MySql处于开启状态.下图为Apache,MySql处于开启时状态 然后进入后台管理平台进行字段和列表的定义 然后在后台添加数 ...

  5. Thread和Runnable的区别

    Runnable源码 Thread源码 结论 Thread实现了Runnable接口的类,使得run支持多线程. 因类的单一继承原则,推荐使用Runnable接口实现多线程

  6. js高级知识---词法分析和AO 链

    转载自https://www.cnblogs.com/OceanHeaven/p/4957704.html 上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代 ...

  7. 【原创】大叔问题定位分享(29)datanode启动报错:50020端口被占用

    集群中有一台datanode一直启动报错如下: java.net.BindException: Problem binding to [$server1:50020] java.net.BindExc ...

  8. 解构声明(Destructuring Declarations)

    解构声明的概念和作用 把一个对象成员解构(destructure)成多个变量,称为解构声明(destructuring declaration). component1(),component2()等 ...

  9. 用JS实现实时显示系统时间

    废话我就不多说了,直接上图和代码了 效果图: 代码视图: 下面为大家附上代码,复制即可用: <!DOCTYPE html> <html lang="en"> ...

  10. UiAutomator1.0 与 UiAutomator2.0

      在使用2.0之前,对android自动化框架也做过一些了解<Android 自动化测试框架>.使用UiAutomator2.0也有一段时间,这里将1.0与2.0进行一个对比总结. Ui ...