[工程师死绝的世界D5004]錆びついた電波塔 翻译及题解
生锈了的无ń …
May all the beauty be blessed.
Translation by KSkun
原题:問題「荒れ果てたオフィス」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜
你现在在整理乱七八糟的文件。
文件的重要性可以分为1、2和3三类,数字越大文件就越重要。
现在你知道了n份文件的标题字符串S_i和重要度e_i。
请按输入顺序输出重要度为3的文件名。
n
S_1 e_1
...
S_n e_n
请按输入顺序输出重要度为3的文件名。
输入:
5
paiza 1
coding 3
answer 3
input 2
aaaaa 1
输出:
coding
answer
输入:
1
Paiza 3
输出:
Paiza
// Code by KSkun, 2019/1
#include <cstdio>
#include <cctype>
#include <algorithm>
typedef long long LL;
inline char fgc() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
? EOF : *p1++;
}
inline LL readint() {
LL res = 0, neg = 1; char c = fgc();
for(; !isdigit(c); c = fgc()) if(c == '-') neg = -1;
for(; isdigit(c); c = fgc()) res = res * 10 + c - '0';
return res * neg;
}
inline char readsingle() {
char c;
while(!isgraph(c = fgc())) {}
return c;
}
char S[105];
int n, e;
int main() {
scanf("%d", &n);
while(n--) {
scanf("%s%d", S, &e);
if(e == 3) {
printf("%s\n", S);
}
}
return 0;
}
有0就会有1,我是不会咕的!
最近学校八十天誓师,槽点太多,非常想把它写下来。最近几天也是比较低落,正好吐槽一下算是个发泄。
本期似乎没有合适的BGM。
本期主题:关于励志演讲的一些杂谈
这次八十天誓师学校请了个叫*飞高考励志教育的机构来做演讲,上来就是*飞本人大头照海报加上宣传短片(SOUND ONLY),显得非常有逼格的样子。
暖场期间,工作人员引导我们鼓掌(确定是鼓掌?),然后有了这么一段话。
有些同学鼓掌的时候双手是放在心脏以下的,有一个非常有趣的研究表明,双手放在心脏以下鼓掌的人是没有良心的人,所以我们正确的鼓掌方式,就是把你的双手高高举过头顶。
合着我们这些一般人都是没良心的人,您这话也太大了吧。莫名其妙被地图炮骂了?感觉不太好。
这里想要插一段中招时候发生的故事。中招有东*高中在我所在的初中举办座谈会,负责招生的老师发表了这样的观点
如果你去了郧阳中学(我所在的高中),他们招收县里面的学生比较多,城里面的孩子和从农村来的孩子是玩不到一起去的,blabla
仅是这样一句话让我从内心里完全否定了这一所中学的态度,更加坚定了我填报我所在的高中的志愿的决定。实话说,这种损人不利己的宣传话术实在是很无聊,甚至可以说很恶心。工作人员的这样一番话也是如此。
在演讲期间,我们被要求使用纸笔记下他演讲的主要内容。且不说记下的东西是否有价值,这一股命令式的语气是怎么回事啊?我们是请您来做演讲鼓动人心的,而不是被您随意摆弄的吧。况且这些内容一点价值都没有,基本算是尝试或者在这个阶段能够自己领悟到的内容。我选择拒绝记下任何东西。
中间有一个挑战自我的环节,就是让一个体质看上去不太强壮的人狂做俯卧撑。在开始之前,他向我们隐瞒活动内容,并说只请男生上来,不会请女生上来。当时,我感受到了一股强烈的性别歧视的气息。虽然之后他解释了活动内容,不请女生只是因为俯卧撑对女生来说比较勉强,不是什么性别歧视,但是这里应该有更好的表达方法,完全没必要说得这么不合适。
喊出来一些东西确实有一些激励人心的作用吧,我不否认这是个办法,但是全场跟着一起从头疯喊到尾是哪门子的热情,反正我的嗓子受不了(当时有点感冒的征兆)。
从头到尾他一直在拿钱当包袱,先是讲他在其他学校给那些学生是如何开价打赌的,说什么考XX分就给学生X千,没考上反过来给他X千,还鼓动学校领导出钱。后来说在机场买的礼物,掏出来结果是两百现金,又是哪门子的礼物。最真实的是,在我校的时候还鼓动了我班的两个学生相互抬价抬分数,还从学校领导那骗来了五千一万的。这都9102年了,咱能不能别老钱不钱的,有什么意义呢?对于这个环节,我觉得用钱激励人是充满了功利和铜臭味的垃圾价值观。我不认同这种方法。
以及说自己打了8年的电话终于获得了四川某学校的演讲的机会,这8年电话真的不算是电话骚扰吗?以及说打我校的电话打了3年,其实3年前校长都不是现在这个,你是咋找到正确的学校的啊……
尽管这里还是有一点我比较认同的东西,就是他对早恋的解读。
早恋是在错误的时间、错误的地点做正确的事情。
的确如此,虽然我没有这样的经历和经验(不是我不想,只是因为我太垃圾了)。早恋本身并没有什么大的过错,问题在于早恋对正处青春期的这帮高中生带来的影响。恋爱这个事情会让心理起伏大,总牵挂着那个TA,而我们尚未成熟,处理心理问题总有些不合适之处,可能会影响到一方的生活甚至人生。这才是为什么我们不提倡早恋的理由。
在这里我想特别提一下班主任对早恋的解读。他倾向于比较老的观点,即把早恋妖魔化,说成是龌龊不堪的事情,且表达过程中有明显的歧视女性的说法。作为教师和班主任,这位老师平时说话都会掂量一下,但是这些话却说得如此的理所当然,实在是让人恐惧。曾经看到一个说法,一些年轻人恋爱谈不好,也有这些不正确的价值观使他们产生恐惧的原因。
我是没见过什么所谓的励志演讲,但是这一次让我很失望。它除了逗我笑了一下午以外,没什么实质性的收获。开心地过个下午倒是可以缓解一下最近的紧张和焦虑,但是这一下午的性价比是真的很低。干货完全没有,励志全靠哄抬目标和乱吼,作为一个高三学生,我想我想要的不是这样的励志。
作为演讲者,首先你的价值观必须正确。如今的青少年心智较从前已经成熟很多了,一些古老的听上去有些歪曲的话术在我们这代人身上并不管用,反而还会让我们产生厌恶的心理。以及,根据我的经历,我觉得依托于故事的激励是很管用的。例如某一篇文章《为什么上北大》比较有感染力,价值观上还行,就是不太适用于我这种堕落的情况(失败之后没动力继续,很难获得成就感和满足感)。在这个演讲中,这位演讲者的故事实在讲的不是很好,不是掺了私货就是钱来钱去,极为无聊和世俗。以及,从头到尾的风格等都有些不对劲,对于我这种稍微有点较劲或者有自己看法的人会起很大的反作用。
其实最睿智的操作在后面。第二天,班主任问我们收昨天记得笔记。我没有搞懂为什么他这么看重这个很不对劲的演讲,然而还有些认同。这样随波逐流的态度真的好吗?
其实对班主任的部分操作有不满很久了,但是影响不是很大,所以没有怎么表达出来。
这篇文章差不多就是一篇自我发泄和吐槽的垃圾文,大家完全可以不用看,当然如果你看到这句话了,我很抱歉浪费了你宝贵的读一篇文章的时间。不过写完之后心里面倒是轻松了一些,希望在接下来的80多天里能提升一点分数,实现那个写下来的目标吧。
参考阅读:
题目地址:洛谷:【P2827】蚯蚓 – 洛谷
本题中,我们将用符号 $\lfloor c \rfloor$ 表示对 c 向下取整,例如: $\lfloor 3.0 \rfloor = \lfloor 3.1 \rfloor = \lfloor 3.9 \rfloor = 3$。
蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。
蛐蛐国里现在共有 n 只蚯蚓( n 为正整数)。每只蚯蚓拥有长度,我们设第 i 只蚯蚓的长度为 ai ( i = 1, 2, … , n ),并保证所有的长度都是非负整数(即:可能存在长度为0的蚯蚓)。
每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半。神刀手切开蚯蚓的位置由常数 p (是满足 0 < p < 1 的有理数)决定,设这只蚯蚓长度为 x ,神刀手会将其切成两只长度分别为 $\lfloor px \rfloor$ 和 $\lfloor x – px \rfloor$ 的蚯蚓。特殊地,如果这两个数的其中一个等于 0 ,则这个长度为 0 的蚯蚓也会被保留。此 外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加 q(是一个非负整常数)。
蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐 蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要 m 秒才能到来……(m 为非负整数)蛐蛐国王希望知道这 m 秒内的战况。
具体来说,他希望知道:
蛐蛐国王当然知道怎么做啦! 但是他想考考你……
输入格式:
第一行包含六个整数 n, m, q, u, v, t ,其中: n, m, q 的意义见【问题描述】; u, v, t 均 为正整数;你需要自己计算 p = u/v (保证 0 < u < v );t 是输出参数,其含义将会在【输出格式】中解释。
第二行包含 n 个非负整数,为 a1, a2, … , an ,即初始时 n 只蚯蚓的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。
保证 1 ≤ n ≤ 10^5 , 0 ≤ m ≤ 7 × 10^6 , 0 < u < v ≤ 10^9 , 0 ≤ q ≤ 200 , 1 ≤ t ≤ 71 ,
0 ≤ ai ≤ 10^8 。
输出格式:
第一行输出$\left\lfloor \frac{m}{t} \right\rfloor$个整数,按时间顺序,依次输出第 t秒,第 2t 秒,第 3t 秒,……被切 断蚯蚓(在被切断前)的长度。
第二行输出$\left\lfloor \frac{n+m}{t} \right\rfloor$个整数,输出 m 秒后蚯蚓的长度:需要按从大到小的顺序,依次输出排名第 t ,第 2t ,第 3t ,……的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要输出,你也应输出一个空行。
请阅读样例来更好地理解这个格式。
输入样例#1:
3 7 1 1 3 1 3 3 2
输出样例#1:
3 4 4 4 5 5 6 6 6 6 5 5 4 4 3 2 2
输入样例#2:
3 7 1 1 3 2 3 3 2
输出样例#2:
4 4 5 6 5 4 3 2
输入样例#3:
3 7 1 1 3 9 3 3 2
输出样例#3:
2
很容易想到用三个堆来维护原来的蚯蚓、切后的两段蚯蚓,通过一定的修正将堆内的各个元素统一至某一时间点(如,最开始的长度),便于堆内元素值的比较。可以用当前值-当前秒数作为修正值。
在这种做法的基础上,我们观察到,由于每次都是取最大的来切,切后的两段蚯蚓分别对应的两个序列内部实际上有随时间递增而不减的单调性。我们直接将堆换为队列即可得到本题的正解。
正解复杂度$O(m)$。
// Code by KSkun, 2018/11
#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <functional>
#include <vector>
typedef long long LL;
inline char fgc() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
? EOF : *p1++;
}
inline LL readint() {
register LL res = 0, neg = 1; register char c = fgc();
for(; !isdigit(c); c = fgc()) if(c == '-') neg = -1;
for(; isdigit(c); c = fgc()) res = res * 10 + c - '0';
return res * neg;
}
inline char readsingle() {
register char c;
while(!isgraph(c = fgc())) {}
return c;
}
const int MAXN = 100005, MAXM = 7000005;
int n, m, q, u, v, t, a[MAXN];
double p;
std::vector<int> vec;
struct Queue {
int l, r, a[MAXM];
Queue(): l(1), r(1) {}
inline void push(int x) {
a[r++] = x;
}
inline void pop() {
if(l >= r) return; l++;
}
inline int query(int p, int t) {
if(l >= r) return -1;
return a[l] + (p - 1) * q * (1 - t) + (p - l - 1) * q * t;
}
inline bool empty() {
return l >= r;
}
} que[3];
inline void query(int x, int &res, int &t) {
int r1 = que[0].empty() ? -1 : que[0].query(x, 0),
r2 = que[1].empty() ? -1 : que[1].query(x, 1),
r3 = que[2].empty() ? -1 : que[2].query(x, 1);
if(r1 > res) {
res = r1; t = 0;
}
if(r2 > res) {
res = r2; t = 1;
}
if(r3 > res) {
res = r3; t = 2;
}
}
int main() {
n = readint(); m = readint(); q = readint();
u = readint(); v = readint(); t = readint();
p = double(u) / v;
for(int i = 1; i <= n; i++) a[i] = readint();
std::sort(a + 1, a + n + 1, std::greater<int>());
for(int i = 1; i <= n; i++) que[0].push(a[i]);
for(int i = 1; i <= m; i++) {
int res = -1, t = -1;
query(i, res, t);
if(i % ::t == 0) printf("%d ", res);
que[t].pop();
que[1].push(floor(p * res));
que[2].push(res - floor(p * res));
}
puts("");
while(!que[0].empty()) {
vec.push_back(que[0].query(m + 1, 0));
que[0].pop();
}
while(!que[1].empty()) {
vec.push_back(que[1].query(m + 1, 1));
que[1].pop();
}
while(!que[2].empty()) {
vec.push_back(que[2].query(m + 1, 1));
que[2].pop();
}
std::sort(vec.begin(), vec.end(), std::greater<int>());
for(int i = 0; i < vec.size(); i++) {
if((i + 1) % t == 0) printf("%d ", vec[i]);
}
return 0;
}