前言:第一次打\(CF\),因为经验不足以及英语水平很烂,即便在机房大佬的带领下也是花了好久才读懂题目。。\(A\)题直到\(11\)分钟才\(A\),题目一共才做了\(4\)题,太菜了。。

A. Heist

Description

有\(n\)个正整数,设最小的数为\(minn\),最大的数为\(maxn\),求\(minn\sim maxn\)的正整数连续区间里有多少数不属于这\(n\)个正整数。

Solution

显然答案就是\(maxn-minn-n+1\)

#include<cstdio>
using namespace std;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline int maxn(int x, int y)
{
return x > y ? x : y;
}
inline int minn(int x, int y)
{
return x < y ? x : y;
}
int main()
{
int i, n, mi = 1e9, ma = 0, x;
n = re();
for (i = 1; i <= n; i++)
{
x = re();
mi = minn(mi, x);
ma = maxn(ma, x);
}
printf("%d", ma - mi + 1 - n);
return 0;
}

B. Buying a TV Set

Description

给出\(4\)个正整数\(a,b,x,y\),求满足\(\dfrac{w}{h}=\dfrac{x}{y},1\leqslant w\leqslant a,1\leqslant h\leqslant b\)的二元组\((w,h)\)有几组。

Solution

对\(x,y\)进行约分,而答案显然是\(\min\{ \left\lfloor\dfrac{a}{x}\right\rfloor , \left\lfloor\dfrac{b}{y}\right\rfloor\}\)

#include<cstdio>
using namespace std;
typedef long long ll;
inline ll re()
{
ll x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline ll minn(ll x, ll y)
{
return x < y ? x : y;
}
ll gcd(ll x, ll y)
{
if (!y)
return x;
return gcd(y, x % y);
}
int main()
{
ll a, b, x, y, g;
a = re();
b = re();
x = re();
y = re();
g = gcd(x, y);
x /= g;
y /= g;
printf("%I64d", minn(a / x, b / y));
return 0;
}

C. Coffee Break

Description

一天有\(m\)个时间点,现有\(n\)个时间点是\(Monocarp\)想喝咖啡的时间点(保证不重复),但他的老板不让他一直喝咖啡,所以要求他每次喝咖啡的时间点必须和上一次喝咖啡的时间点间隔\(d\)个时间点。

试问\(Monocarp\)至少需要几天才能在这\(n\)个时间点中的每一个点都喝过咖啡。

Solution

贪心+二分查找

对时间点从小到大排序,枚举每个时间点。

设枚举到第\(i\)个时间点\(a_i\),用二分查找第一个满足\(\geqslant a_i + d +1\)且没有喝过咖啡的时间点,然后继续查找,直到没有满足条件的时间点为止,显然这些点可以在同一天喝咖啡。

最后继续枚举时间点并查找,直到\(n\)个点全喝过咖啡。

这里的二分查找使用\(C++\ STL\ Set\)更方便。

#include<cstdio>
#include<set>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 2e5 + 10;
struct dd {
int id, x;
bool operator < (const dd &o) const
{
return x < o.x;
}
};
dd a[N], X;
int bl[N];
set<dd>se;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
int main()
{
int i, n, m, d, k = 0, s;
n = re();
m = re();
d = re();
for (i = 1; i <= n; i++)
{
a[i].x = re();
a[i].id = i;
se.insert(a[i]);
}
sort(a + 1, a + n + 1);
for (i = 1; i <= n; i++)
if (!bl[a[i].id])
{
bl[a[i].id] = ++k;
X.x = a[i].x;
s = 1;//这个s可以忽略,因为题目保证ai小于m,当时比赛时脑抽没看到就打上了,实际上这s没有什么用。
se.erase(X);
X.x = a[i].x + d + 1;
set<dd>::iterator it = se.lower_bound(X);
while (it != se.end() && s < m)
{
s++;
bl[it->id] = k;
X.x = it->x + d + 1;
se.erase(it);
it = se.lower_bound(X);
if (it == se.end())
break;
}
}
printf("%d\n", k);
for (i = 1; i <= n; i++)
printf("%d ", bl[i]);
return 0;
}

D. Glider

Description

一架滑翔机在一个平面直角坐标系上飞行,坐标为\((x,h)\),每次滑翔一秒会使得\(x+1,h-1\),当\(h=0\)时滑翔机已经落地,无法继续滑翔。

而在飞行过程中会有\(n\)个上升气流(不会重叠,是一个关于\(x\)的区间),当滑翔机在上升气流中飞行时,只会使得\(x+1\),而\(h\)不变。

现告诉你这\(n\)个上升气流两端的坐标和滑翔机初始的高度\(h\),\(x\)由你选择,求滑翔机最远能滑翔多少距离。

(下图为原题中所附图)

如果从\(1\)开始滑翔,最远到\(10\),而从\(2\)开始滑翔,最远到\(12\)。

Solution

官方正解是二分+前缀和。

而我机房里有大佬写了倍增的做法(传送门)。

至于我写的就更加奇葩。。类似单调队列的维护+贪心,不过复杂度比上述两种方法都要优,为\(O(n)\)。

这题有个很明显的贪心策略,从上升气流的左端开始飞行更优。

所以我用一个类似单调队列的东西来维护两个参数\(k,s\),\(k\)表示从当前队首的上升气流左端开始滑翔到队尾需要消耗多少高度,\(s\)表示从当前队首的上升气流左端开始滑翔到队尾飞行的总距离。

若\(k\)加上到下一个上升气流的距离已经大于等于\(m\)了,就说明无法飞到下一个气流,将队首弹出,同时维护\(s,k\)的值,并对新的队首继续判断;若能到达则直接将下一个气流加入队列,同时维护\(s,k\)的值。

而在维护过程中不断对\(s+m-k\)取\(\max\)即可。

#include<cstdio>
#include<set>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 2e5 + 10;
struct dd{
int x, y, z;
};
dd a[N];
int q[N];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline int maxn(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int i, n, m, k = 0, s = 0, head = 1, tail = 1, ma;
n = re();
m = re();
for (i = 1; i <= n; i++)
{
a[i].x = re();
a[i].y = re();
a[i].z = a[i].y - a[i].x;
}
q[1] = 1;
ma = s = a[1].z;
for (i = 2; i <= n; i++)
{
while (head < tail && k + a[i].x - a[i - 1].y >= m)
{
ma = maxn(ma, s + m - k);
k -= a[q[head] + 1].x - a[q[head]].y;
s -= a[q[head] + 1].x - a[q[head]].x;
head++;
}
if (k + a[i].x - a[i - 1].y >= m)
{
ma = maxn(s + m - k, ma);
s = a[i].z;
ma = maxn(s, ma);
q[++tail] = i;
head++;
continue;
}
k += a[i].x - a[i - 1].y;
s += a[i].y - a[i - 1].y;
ma = maxn(ma, s);
q[++tail] = i;
}
ma = maxn(ma, s + m - k);
printf("%d", ma);
return 0;
}

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

  1. CF Round #510 (Div. 2)

    前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...

  2. CF Round #551 (Div. 2) D

    CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...

  3. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  4. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

  5. cf Round#273 Div.2

    题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...

  6. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  7. Codeforces Round #509 (Div. 2)

    咕咕咕了好多天终于有时间写篇博客了_(:з」∠)_ 打网赛打到自闭的一周,终于靠这场CF找回了一点信心... 1041A - Heist \(ans=max\left \{ a_i \right \} ...

  8. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

  9. 【codeforces】【比赛题解】#869 CF Round #439 (Div.2)

    良心赛,虽然我迟了半小时233333. 比赛链接:#869. 呃,CF的比赛都是有背景的……上次是<哈利波特>,这次是<物语>…… [A]巧妙的替换 题意: Karen发现了石 ...

随机推荐

  1. Ros系列_学习一

    刚入门ROS,不,没入门,还在门口,这是今天的总结: (一)创建一个工作空间 1.创建一个初始工作空间: mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src cat ...

  2. 从源码安装Node

    [从源码安装Node] Nodejs官网未并提供i686架构的bin,为了在i686架构cpu下使用Nodejs,需要从源码编译. 1../configure 2.make 3.make instal ...

  3. datetime空值设置

    Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column ...

  4. 学习笔记001之[Android开发视频教学].01_06_Android当中的常见控件

    文本框,按钮 菜单按钮(需复写两个方法) 后续需完成联系代码.

  5. msf客户端渗透(五):注册表

    先获取到一个session 上传nc到被攻击主机上 建立一个键值 创建一个策略 kali上查看是否成功创建键值 后台开启cmd 查看防火墙的策略 打开防火墙的端口 添加一条防火墙策略 在win7上查看 ...

  6. uwsgi+nginx+django生产环境部署

    1.升级python到2.7版本 2.安装uwsgi 出现uwsgi未找到 yum groupinstall "Development tools"yum install zlib ...

  7. 830. Positions of Large Groups

    In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...

  8. oracle锁---原理篇

    在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些 ...

  9. python--第四天总结

    lambda表达式 处理简单函数自动返回 学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: # 普通条件语句 if 1 == 1: name = 'wupeiqi' el ...

  10. JavaScript各种继承方式(三):组合继承(combination inheritance)

    一 原理 组合继承仅仅是同时使用了原型链继承和构造函数继承. 具体做法是,将父类的实例作为子类的构造函数的原型对象,并在子类的构造函数中调用父类的构造函数. function Fruit(name){ ...