壹鲦热带鱼 发布的文章

建议先阅读个人对于 身高歧视 的评价 - 壹鲦热带鱼的小窝

正文

标题的意义

直意

吾辈既居权威之下,所成之事必谬,意思即我们这代人活在权威之下,所有的事情必当是错误的,显而易见
这里是权威指尊敬的教师
说实话,这也是一篇讽刺文,因为时间缘故,有些东西,不会藏的很深,这可能是一场赤裸裸的讽刺
我接受义务教育也已经有6年多了,谬,必,从学习成绩到实际行动,无处不在的权威,我们永远是被批判者,毫无反驳之权

批注

在教室里,真理的标准往往不是事实,而是讲台上那个人的脸色。

具体事例

在本文中,我们将会列举几个事例,来说明我的看法

事例一:【2025年-初一】课堂上的“阴阳怪气”与“当众处刑”

让我先从最近发生的“笔记事件”说起

这是10月13日的英语课上,我们老师一如既往地让我们做笔记,老师走到我们的 方同学(化名) 面前,看到他的书上,一个字也没动过,老师的眉头逐渐难看,
接下来,又是这熟悉的流程...

老师走回到讲台,大声的说:哎呀,我们的方同学是没有手啊?连笔记都不会做呀?

我们老师当时就跟小南娘似的,虽然女老师也可以骂娘炮

【阅读链接】以下是我们英语老师在开学的自我介绍
Hello everyone, I am Alice. In this academic year, I will be your English teacher. I have been teaching for 12 years, including 2 years in the UK and 10 years in China, so I am very experienced and can communicate with people in the UK as well. I am really looking forward to learning together with you.
此处省略20单词

从上面的阅读链接中,虽说能体会到我们的英语老师英语很牛逼,但是,去英国,难道不是只有有钱人才能去的吗?没钱去个屌,在入境的时候都被拦了

继续,老师开始体现她的权威了:我不是在批评你,我是在批评你的态度!态度决定一切!你这个样子,能考出什么样子???

欣喜的是,老师没说他是她带过的最差的一个学生

总结:整个过程依旧新云流水,从“笔记像屎”到“态度问题”,顶级转场,方同学,也是成功成为了“学习态度不端正”的坏学生,这一切,三分钟不到

事例二:【2025年-初一】称呼

依旧是我们英语老师与方同学的事情

起因:我们的方同学忘记交英语听写本了
英语老师找到方同学,说:方同学,你的听写本呢?
方同学递给老师听写本,在这呢
猎奇,老师说:哎呀,我们的方同学连我的姓也忘记啦?算了,忘记就忘记了吧?但是方同学你怎么连我的英文名Alice都不知道了啊?

我是没什么想说的了
说实话,到了初一,我倒是没见过有人叫老师还加姓氏的,虽说这样也不礼貌,但是初一了,胆子肥了,不说还好吧
我们的英语老师感觉有点过于较真儿了,有点抽象

事例三:【2024年-小六】坏学生一定会被权威所压迫吗:老师是可以有借口的

这是小学六年级的事情,事情中的老师指我们的学生班主任徐老师,沈同学依旧是化名

沈同学在下课的时候问同学一道题
徐老师看见,问:沈同学,你在讲什么?期末考能考100分了??就这么放纵???
沈同学说:我问题啊,咋了,下课都不能问题了?
老师说:你自己上课不好好听,有什么好问的,自己去做

【阅读材料】
子贡问曰:“孔文子何以谓之‘文’也?”子曰:“敏而好学,不耻下问,是以谓之‘文’也。”
选自《论语·公冶长》

语文老师:

  • 上课:敏而好学
  • 下课:不能好学,自己的问题

抽象,虽然说我们的语文老师也是大学生毕业,得过且过,算了算了,毕竟给我们的好处也足够多了吧?

事例四:【2024年-小学】奠定的对应关系

简说

$$ \text{没带作业=没写作业} $$

$$ \text{上课走神=不尊重老师} $$

$$ \text{忘记给家长签字=不敢给家长签字} $$

$$ \text{忘记把作业带回家=懒得写作业} $$

$$ \text{解释=顶嘴} $$

$$ \text{低头看书=看没用的书} $$

$$ \text{问老师问题=没预习到位} $$

$$ \text{错题多=没用心练} $$

$$ \text{忘记值日=没有责任心} $$

已经没什么好说的了

细说(Deepseek)

经过仔细观察,我发现了教师权威运作的“完美”逻辑链:

逻辑一:错误必然化
只要你在老师的权威范围内,你必然会有错误。没有明显的错误?那就找潜在的错误。作业全对?那可能是你抄袭的。积极发言?那可能是你爱出风头。

逻辑二:错误道德化
任何具体错误,最终都会上升到“态度问题”“人品问题”。忘记带作业=不负责任;上课走神=不尊重老师;回答问题错误=不认真听讲。

逻辑三:批评公开化
批评必须公开进行,因为私下的批评无法起到“杀鸡儆猴”的作用。当众羞辱是维护权威最有效的手段。

逻辑四:解释无效化
学生的任何解释都被视为“顶嘴”“狡辩”。在权威的法庭上,被告没有辩护权。

逻辑五:结论绝对化
“我教书二十年”成为最常用的终极武器。时间的长度自动转化为正确的程度,质疑老师就是质疑真理。

这套逻辑链的可怕之处在于它的自我闭环——你无法从内部打破它,因为你的任何反抗行为都会被这个系统自动识别为新的错误证据。

“为你好”——最无懈可击的暴力

如果长辈的权威有万能盾牌,那,一定是为你好

这三个字的神奇之处在于:

  • 它将一切不合理变得合理
  • 它将一切暴力转化为“关爱”
  • 它让受害者产生“不识好歹”的负罪感

我曾经亲眼目睹一个家长把孩子叫到公园,当着所有人的面训斥了整整40分钟。回来后,那个同学眼睛红肿,整整一天没有说话。
当有人质疑这种方式是否太伤人时,家长的回答是:“我现在严格一点,是为他好!等他将来到社会上,就知道感谢我了!”
多么完美的逻辑呀:现在的伤害是为了未来的受益。至于这个伤害到底有多大,这个受益是否真的会来,都不重要。重要的是,“为你好”这个咒语,让施暴者心安理得

我们,永远是:抗争->接受

没什么好说的
来自实验中学某个人说的:

初一上学期:积极抗争
刚进入初中时,我们还保有着小学生的直率。被冤枉时会大声辩解,觉得不公平时会提出异议。结果呢?大多数人都碰得头破血流

初一下学期:学会沉默
经过一个学期的“教育”,我们明白了:解释=顶嘴,质疑=挑衅。最安全的方式是保持沉默,即使内心波涛汹涌,表面也要波澜不惊

初二:逐渐麻木
当沉默成为习惯,麻木就开始蔓延。不再思考对错,只记住标准答案;不再坚持自我,只学会察言观色

初三:完全适应
到了初三,我们已经能熟练地在权威体系中生存。知道什么该说,什么不该说;知道如何讨好老师,如何避免冲突。我们成了这个体系合格的“产品”

这个过程,被美其名曰“成长”。而我认为,这更像是一个独立思考能力被逐渐剥夺的过程。

说了半天,到底,什么才算“教育权威?”

我不认为所有的教育权威都是该讽刺的,分以下几种

  • 专业权威
  • 人格权威
  • 理性权威
  • 职业权威[贬]
  • 暴力权威[贬]

说着好像没什么大不了的,那么,我问你,Look in my eyes, I ask you, how many situations have you seen?,嗯,如果是第一到第三种见的比较多,那么,我的评价是:羡慕死了,有一个好老师

权威,不是全部

某些温柔的人,值得我们记住

如果一个长辈,只是用权威来维护自己的权威性,那么,只能说:$\text{树立自己的权威形象}$,毫无任何意义

当一个人只会用暴力来维持权威的时候,恰恰证明,$\text{他是个表面的巨人,实际的懦夫}$

感觉这篇文章结构还是有点乱,总之,我的意思就是,我有点反对那种权威=一切的思想,当然,个人观点,个人观点,个人观点,没什么好说的,散会

用#标题还是有原因的
我从来不否认我写blog不会用AI

【知识要点】栈、队列、堆、优先队列

1. 栈(Stack)和队列(Queue)基础

1.1 基本概念对比

数据结构特性操作位置C++声明插入操作删除操作
栈(Stack)LIFO (后进先出)同一端(栈顶)stack<T> s;s.push()s.pop()
队列(Queue)FIFO (先进先出)一端插入(队尾),另一端删除(队头)queue<T> q;q.push() (enqueue)q.pop() (dequeue)

1.2 队列的详细定义

  • 队列是C++标准库中的重要数据结构
  • 允许删除的一端称为队头(Front)
  • 允许插入的一端称为队尾(Rear)
  • 空队列:队列中没有元素的状态
  • 操作原则:先进先出(FIFO)

1.3 C++队列基本操作示例

#include<bits/stdc++.h>
using namespace std;

int main() {
    queue<int> q; // 定义一个空队列
  
    for(int i=0; i<5; i++) {
        q.push(i); // 将i插入到队尾
    }
  
    q.emplace(32); // 将32放置到队尾,作用和push一样
  
    cout << q.size() << endl; // 输出队列中元素的个数
  
    while(!q.empty()) { // 当队列不为空时,继续循环
        cout << q.front() << endl; // 输出队列中的首元素
        q.pop(); // 将元素从队头删除
    }
  
    return 0;
}

1.4 队列queue的完整函数列表

  • q.pop() - 删除queue的队头元素
  • q.front() - 返回队列的队头元素,但不删除
  • q.back() - 返回队列的队尾元素,但不删除
  • q.push(arg) - 将元素arg插入到队列的队尾
  • q.emplace(arg) - 将元素arg放置到队列的尾部(效果同push)
  • q.size() - 返回队列中元素的个数
  • q.empty() - 队列为空时返回true,否则false
  • q.swap(q1) - 交换q和q1中的元素(交换底层数据结构)
  • swap(q,q1) - 非成员函数,效果同成员函数swap

1.5 队列的应用场景

  • BFS(广度优先搜索)算法
  • 单调队列
  • 缓冲区管理
  • 任务调度

2. 堆(Heap)与优先队列(Priority Queue)

2.1 堆的基本概念

  • 堆是一类特殊的数据结构,常用的是二叉堆
  • 形式上是一个数组,本质上是一棵完全二叉树
  • 分为大根堆和小根堆:

    • 大根堆:除根节点外,每个节点的值都大于等于其子节点的值

      • 公式表示:A[parent(i)] >= A[i]
    • 小根堆:除根节点外,每个节点的值都小于等于其子节点的值

      • 公式表示:A[parent(i)] <= A[i]
  • 堆中的任一子树也还是堆

2.2 堆的基本操作

  • push操作(插入):往堆尾加入元素,并通过从下往上调整保持堆性质
  • get操作(删除):取出堆顶元素,用堆尾元素覆盖堆顶,再从上往下调整

2.3 优先队列的实现

C++中用 priority_queue实现堆的功能:

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 默认大根堆
    priority_queue<int> max_heap;
  
    // 小根堆定义方式
    priority_queue<int, vector<int>, greater<int>> min_heap;
  
    // 自定义结构体的优先队列
    struct Node {
        int u, len;
        bool operator < (const Node &x) const {
            return x.len < len; // 注意这里是反向定义,实现小根堆效果
        }
    };
  
    priority_queue<Node> custom_heap;
  
    return 0;
}

2.4 优先队列的操作函数

  • push(Elem e) - 插入元素,时间复杂度O(log n)
  • pop() - 删除顶部元素,O(log n)
  • top() - 返回顶部元素,O(1)
  • size() - 返回元素数量
  • empty() - 判断是否为空

2.5 优先队列的特殊注意事项

  1. 不支持除顶部外其他元素的访问和操作
  2. 没有内置的clear()操作,需要手动实现:
void clear(priority_queue<int> &q) {
    while (!q.empty()) q.pop();
}
  1. 访问top()前必须检查队列是否为空

3. 经典问题与解决方案

3.1 合并果子问题

问题描述:有n堆果子,每次合并两堆消耗体力值为两堆果子数之和,求最小总消耗。

解决方案:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, ans = 0;
    cin >> n;
    priority_queue<int, vector<int>, greater<int>> q;
  
    for(int i = 0; i < n; i++) {
        int x; cin >> x;
        q.push(x);
    }
  
    while(q.size() > 1) {
        int x = q.top(); q.pop();
        int y = q.top(); q.pop();
        ans += x + y;
        q.push(x + y);
    }
  
    cout << ans;
    return 0;
}

时间复杂度分析:O(n log n)

3.2 互数问题

问题描述:给定素数集合S,生成由S中素数乘积构成的"互数集合",求第n小的互数。

解决方案:

typedef long long ll;

int main() {
    ll k, n;
    cin >> k >> n;
    vector<ll> primes(k);
    priority_queue<ll, vector<ll>, greater<ll>> heap;
    set<ll> seen;
  
    for(int i = 0; i < k; i++) {
        cin >> primes[i];
        heap.push(primes[i]);
        seen.insert(primes[i]);
    }
  
    ll humble = 1;
    for(int i = 0; i < n; i++) {
        humble = heap.top(); heap.pop();
        for(auto p : primes) {
            ll num = humble * p;
            if(seen.find(num) == seen.end()) {
                seen.insert(num);
                heap.push(num);
            }
        }
    }
  
    cout << humble;
    return 0;
}

时间复杂度分析:O(nk log n)

3.3 两个序列的最小N个和

问题描述:有两个长度为N的有序序列A和B,求A和B中各取一个数相加得到的N²个和中最小的N个。

解决方案:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;

struct HeapNode {
    int x, val;
    bool operator < (const HeapNode &other) const {
        return val > other.val; // 小根堆
    }
};

int main() {
    int n, a[maxn], b[maxn], pos[maxn] = {0};
    priority_queue<HeapNode> q;
  
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < n; i++) cin >> b[i];
  
    // 初始时每个a[i]配b[0]
    for(int i = 0; i < n; i++) {
        q.push({i, a[i] + b[0]});
    }
  
    for(int i = 0; i < n; i++) {
        HeapNode tmp = q.top(); q.pop();
        cout << tmp.val << " ";
        int x = tmp.x;
        if(++pos[x] < n) {
            q.push({x, a[x] + b[pos[x]]});
        }
    }
  
    return 0;
}

时间复杂度分析:O(n log n)

4. 高级应用提示

  1. Dijkstra算法优化:堆/优先队列可用于优化Dijkstra最短路径算法,将时间复杂度从O(V²)降低到O(E + V log V)
  2. 单调队列:一种特殊的队列,可以高效解决滑动窗口最值问题
  3. 多路归并:优先队列可以高效解决多路归并问题,如上面的最小N个和问题
  4. Huffman编码:优先队列可用于构建最优前缀编码树

5. 总结

数据结构特点主要操作时间复杂度典型应用
栈(Stack)LIFOpush, pop, topO(1)函数调用、表达式求值
队列(Queue)FIFOpush, pop, frontO(1)BFS、缓冲区
优先队列(Priority Queue)自动排序push, pop, toppush/pop: O(log n), top: O(1)Dijkstra、Huffman编码、合并果子

掌握这些基础数据结构及其应用场景,对于算法学习和编程竞赛至关重要。优先队列作为堆的高级抽象,在实际应用中更为方便,但理解其底层堆的原理同样重要。

【熟能生巧】

P9588 「MXOI Round 2」队列

题目描述

小 C 有一个队列,他要对这个队列进行 $q$ 次操作。操作共四种,参数分别如下:

$1\ x$:这是第一种操作,表示从队尾依次插入 $1,2,3,\cdots,x$;

$2\ y$:这是第二种操作,表示弹出队头的前 $y$ 个元素;

$3\ z$:这是第三种操作,表示查询队列中的第 $z$ 个元素;

$4$:这是第四种操作,表示查询队列中所有元素的最大值。

你需要帮助他维护这个队列,并对于每个第三种操作和第四种操作,输出查询的答案。

输入格式

第一行两个整数 $c,q$,其中 $c$ 表示测试点编号。$c=0$ 表示该测试点为样例。

接下来 $q$ 行,每行 $1 \sim 2$ 个整数,表示一个操作,格式见【题目描述】。

输出格式

对于每个第三种操作和第四种操作,输出一行一个整数,表示查询的答案。

输入输出样例 #1

输入 #1

0 9
1 5
1 3
2 2
1 4
3 6
3 8
2 4
4
3 3

输出 #1

3
2
4
1

说明/提示

【样例解释 #1】

在进行第四次操作后,队列中的元素依次为 $3,4,5,1,2,3,1,2,3,4$。

在进行第七次操作后,队列中的元素依次为 $2,3,1,2,3,4$。

【数据范围】

设 $\sum x$ 表示单个测试点内 $x$ 之和。

对于 $100\%$ 的数据,$1 \le q \le 2\times 10^5$,$1 \le x,y,z \le 10^9$,$0 \le \sum x \le 2\times10^{14}$,保证在进行第二种操作前队列内元素个数不小于 $y$,在进行第三种操作前队列内元素个数不小于 $z$,在进行第四种操作前队列内元素个数大于 $0$。

测试点编号$q \le$$x \le$$\sum x \le$特殊性质
$1\sim3$$500$$500$$2\times10^5$C
$4\sim8$$5000$$5000$$2\times10^7$无
$9\sim10$$2\times10^5$$10^9$$2\times10^{14}$AB
$11\sim12$$2\times10^5$$10^9$$2\times10^{14}$B
$13\sim14$$2\times10^5$$10^9$$2\times10^9$AC
$15\sim16$$2\times10^5$$10^9$$2\times10^9$C
$17\sim18$$2\times10^5$$500$$2\times10^7$无
$19$$2\times10^5$$10^9$$2\times10^9$无
$20$$2\times10^5$$10^9$$2\times10^{14}$无

特殊性质 A:没有第二种操作。

特殊性质 B:没有第三种操作。

特殊性质 C:没有第四种操作。

P2723 [USACO3.1] 丑数 Humble Numbers

题目描述

对于一给定的素数集合 $S = \{ p_1, p_2, ..., p_k \}$, 考虑一个正整数集合,该集合中任一元素的质因数全部属于 $S$。这个正整数集合包括,$p_1$、$p_1 \times p_2$、$p_1 \times p_1$、$p_1 \times p_2 \times p_3$ ...(还有其它)。该集合被称为 $S$ 集合的“丑数集合”。注意:我们认为 $1$不是一个丑数。

你的工作是对于输入的集合 $S$ 去寻找“丑数集合”中的第 $n$ 个“丑数”。保证答案可以用 32 位有符号整数表示。

补充:丑数集合中每个数从小到大排列,每个丑数都是素数集合中的数的乘积,第 $n$ 个“丑数”就是在能由素数集合中的数相乘得来的(包括它本身)第 $n$ 小的数。

输入格式

输入的第一行是两个的整数,分别代表集合 $S$ 的大小 $k$ 和给定的参数 $n$。

输入的第二行有 $k$ 互不相同的整数,第 $i$ 个整数代表 $p_i$。

输出格式

输出一行一个整数,代表答案。

输入输出样例 #1

输入 #1

4 19
2 3 5 7

输出 #1

27

说明/提示

数据规模与约定

对于 $100\%$ 的数据,保证:

  • $1 \leq k \leq 100$。
  • $1 \leq n \leq 10^5$。
  • $2 \leq p_i < 2^{31}$,且 $p_i$ 一定为质数。

说明

题目翻译来自 NOCOW。

USACO Training Section 3.1

P1323 删数问题

题目描述

一个集合有如下元素:$1$ 是集合元素;若 $P$ 是集合的元素,则 $2\times P+1$,$4\times P+5$ 也是集合的元素。

取出此集合中最小的 $k$ 个元素,按从小到大的顺序组合成一个多位数,现要求从中删除 $m$ 个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字。

注:不存在所有数被删除的情况。

输入格式

只有一行两个整数,分别代表 $k$ 和 $m$。

输出格式

输出为两行两个整数,第一行为删除前的数字,第二行为删除后的数字。

输入输出样例 #1

输入 #1

5  4

输出 #1

137915
95

说明/提示

数据规模与约定

  • 对于 $30\%$ 的数据,保证 $1\le k,m\le300$。
  • 对于 $100\%$ 的数据,保证 $1\le k,m\le3\times10^4$。

P2085 最小函数值

题目描述

有 $n$ 个函数,分别为 $F_1,F_2,\dots,F_n$。定义 $F_i(x)=A_ix^2+B_ix+C_i(x\in\mathbb N*)$。给定这些 $A_i$、$B_i$ 和 $C_i$,请求出所有函数的所有函数值中最小的 $m$ 个(如有重复的要输出多个)。

输入格式

第一行输入两个正整数 $n$ 和 $m$。

以下 $n$ 行每行三个正整数,其中第 $i$ 行的三个数分别为 $A_i$、$B_i$ 和 $C_i$。

输出格式

输出将这 $n$ 个函数所有可以生成的函数值排序后的前 $m$ 个元素。这 $m$ 个数应该输出到一行,用空格隔开。

输入输出样例 #1

输入 #1

3 10
4 5 3
3 4 5
1 7 1

输出 #1

9 12 12 19 25 29 31 44 45 54

说明/提示

数据规模与约定

对于全部的测试点,保证 $1 \leq n,m\le10000$,$1 \leq A_i\le10$,
$0 \leq B_i\le100$,
$0 \leq C_i\le10^4$。

【答案校对】

队列

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=800010;
int c,T,t,i,cnt,op,x,del,qwq,f[N],l[N],r[N],a[N*2],h=1,n=400005;
int read(){
    int f=1,x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){ 
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return f*x;
}
void update(int x,int l,int r,int ql,int qr,int k){
    int mid=(l+r)>>1;
    if(ql<=l&&r<=qr){
        a[x]=k;return;
    }
    if(ql<=mid) update(x*2,l,mid,ql,qr,k);
    if(qr>mid) update(x*2+1,mid+1,r,ql,qr,k);
    a[x]=max(a[x*2],a[x*2+1]);
}
int query(int x,int l,int r,int ql,int qr){
    int mid=(l+r)>>1,sum=0;
    if(ql<=l&&r<=qr){
        return a[x];
    }
    if(ql<=mid) sum=max(sum,query(x*2,l,mid,ql,qr));
    if(qr>mid) sum=max(sum,query(x*2+1,mid+1,r,ql,qr));
    return sum;
}
signed main(){
    cin>>c>>T;
    while(T--){
        op=read();
        if(op==1)
            x=read(),l[++t]=1,r[t]=x,update(1,1,n,t,t,x),f[t]=f[t-1]+x;
        else if(op==2){
            x=read();cnt=0;
            for(i=h;i<=t;++i){
                cnt+=r[i]-l[i]+1;
                if(cnt>=x){
                    cnt-=r[i]-l[i]+1;
                    l[i]+=x-cnt;del+=x-cnt;
                    if(l[i]>r[i])update(1,1,n,i,i,0),++h;
                    break;
                }
                del+=r[i]-l[i]+1;r[i]=l[i]=0;++h;
                update(1,1,n,i,i,0);
            }
        }
        else if(op==3){
            x=read();
            qwq=lower_bound(f+h,f+t+1,del+x)-f;
            printf("%lld\n",del+x-f[qwq-1]);
        }
        else printf("%lld\n",query(1,1,n,h,t));
    }
}

丑数

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,i,j,a[105],b[105],s[100005],zx;
signed main(){
    cin>>n>>m;
    for(i=1;i<=n;i++)
        cin>>a[i];
    s[0]=1;
    for(i=1;i<=m;i++){
        zx=pow(2,31)-1;
        for(j=1;j<=n;j++){
            while(a[j]*s[b[j]]<=s[i-1])
                b[j]++;
            if(a[j]*s[b[j]]<zx)
                zx=a[j]*s[b[j]];
        }
        s[i]=zx;
    }
    cout<<s[m];
}

删数问题

#include <bits/stdc++.h>
#define int long long
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
string p;
int k,m,s;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cin>>k>>m;
    q.push(1);
    while(k){
        int s=q.top();
        p=p+to_string(s);
        q.pop();
        q.push(s*2+1);
        q.push(s*4+5);
        k--;
    }
    cout<<p<<"\n";
    while(true){
        for(int i=0;i<p.size();i++){
            if(p[i+1]>p[i]){
                s++;
                p.erase(i,1);
                if(s>=m){
                    cout<<p;
                    exit(0);
                }
                break;
            }
        }
    }
}

最小函数值

#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[10001],b[10001],c[10001],n,m,s[10000001],i,j,t;
signed main(){
    cin>>n>>m;
    for(i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
    for(i=1;i<=n;i++) for(j=1;j<=100;j++) s[++t]=a[i]*j*j+b[i]*j+c[i];
    sort(s+1,s+1+t);
    for(i=1;i<=m;i++) cout<<s[i]<<" ";
}

T1

【题面】T678583 A美丽数 (beauty)

题目描述

小 B 对数字有着独到的见解,他认为一个数是美丽数当且仅当这个数的相邻两位都不相同。

例如12345、12121是美丽数,而123321、11不是美丽数。
现在小B想知道,对于所有满足以下条件的数中,最小的那个数是什么?如果不存在这样的美丽数,则输出-1。

· 对 于i(0≤i≤9), 这个数中是i 的位数一共有ai 个。

· 这个数不能有前导0,即012是不合法的。
有多组测试点,每组测试点现在给你a0~a9, 请你回答小B 的问题。

输入格式

第一行包含一个整数T。

接下来T 行,每行10个整数, a0~a9, 含义如题。

输出格式

输出T, 每行一个整数,表示答案。

输入输出样例 #1

输入 #1

12
6 0 0 0 0 0 0 0 0 5
0 1 0 2 0 0 0 0 0 0
3 0 0 0 2 0 0 1 0 0
0 1 2 3 4 5 6 7 8 9
1 2 0 1 5 0 1 0 0 0
2 1 1 0 1 5 0 0 0 0
6 0 1 0 2 0 0 0 1 0
8 1 0 0 1 0 0 0 0 0
5 2 0 0 2 0 1 0 0 0
3 0 0 0 0 3 0 2 1 1
3 1 0 5 0 0 1 0 0 0
0 1 2 0 0 1 0 1 0 5

输出 #1

-1
313
404070
123234345454565656767676787897979898989898989
1404143464
1505052545
-1
-1
1010404060
5050507879
1303030363
1929295979

说明/提示

对于100%的数据,保证:T≤10,1≤n,ai≤ 10⁵, 其中$n=∑ai(0≤i≤9)$
测试点编号数据范围特殊性质
1~2n≤10无
3~4n≤10³无
5~6无限制A
7~8无限制B
9~10无限制无

A: 保证最多只有2个ai>0。

B: 保证最多只有3个ai>0。

【代码】T678583 A美丽数 (beauty)

#include <bits/stdc++.h>
using namespace std;
int t,i,d,p,m,c,w,l,g,a[11],cnt[11],f;
string s;
bool j(int t,int b=-1){
    int mx=0;
    for(i=1;i<=10;i++){
        if(i-1==b) continue;
        if(cnt[i]>mx) mx=cnt[i];
    }
    return mx\*2<=t+1;
}
int main(){
    cin>>t;
    while(t--){
        for(i=1;i<=10;i++) cin>>a[i];
        m=c=0;l=-1;s="";
        for(i=1;i<=10;i++) m+=a[i];
        if(m==0){cout<<-1<<"\\n";continue;}
        for(i=1;i<=10;i++) if(a[i]>c) c=a[i];
        if(c>(m+1)/2){cout<<-1<<"\\n";continue;}
        for(i=1;i<=10;i++) cnt[i]=a[i];
        for(p=0;p<m;p++){
            f=0;
            for(d=1;d<=10;d++){
                g=d-1;
                if(cnt[d]==0) continue;
                if(g==l) continue;
                if(p==0&&g==0) continue;
                cnt[d]--;
                if(j(m-p-1,g)){
                    s+=char('0'+g);
                    l=g;
                    f=1;
                    break;
                }
                cnt[d]++;
            }
            if(!f){cout<<-1<<"\\n";break;}
        }
        if(f) cout<<s<<"\\n";
    }
}

URL

【MX-X23】梦熊 X 组 · 月亮赛(同步赛) - 洛谷 | 计算机科学教育新生态

【MX-J26】梦熊 J 组 · 月亮赛(同步赛) - 洛谷 | 计算机科学教育新生态

我的分数

X组:10分

J组:210分

MX-J26/X23 月亮赛 官方题解

A. 丢手绢

小朋友的编号为 $1 \sim n$,直接处理不够便捷,因此将所有编号减去 1,转换为 $0 \sim n-1$。这样调整后,便能通过取模运算轻松计算出每个被放手绢的小朋友编号。

具体规则如下:设编号为 $x$ 的小朋友被记录的数字为 $a_{x}$,则被放手绢的小朋友编号为 $(x + a_{x}) \mod n$。需特别注意,此处涉及负数取模的情况,计算时需遵循相应的取模规则。

后续操作流程为:统计每个小朋友被投放手绢的次数,找出其中的最大值,再依次输出所有出现最大值的小朋友的位置(此处位置需根据最初编号规则还原,若最终结果需对应 $1 \sim n$ 的编号,需将计算得到的 $0 \sim n-1$ 编号加 1)。

该算法的时间复杂度为 $O(n)$,其中 $n$ 为小朋友的总数,仅需遍历一次所有小朋友的记录即可完成统计与计算。

B. 括号序列

首先进行初步判断:若括号序列中左括号和右括号的数量不相等,则该括号序列一定无法构成合法序列,直接判定为无解。接下来仅针对左右括号数量相等的情况展开分析。

判断括号序列是否合法可通过前缀和的方法实现,具体定义前缀和数组 $a_i$ 如下:

$$ a_{i}= \begin{cases} 0, & i=0 \\ a_{i-1}+1, & s_{i}='(' \\ a_{i-1}-1, & s_{i}=')' \end{cases} $$

当遇到相邻的 “)(” 时,将其修改为 “()”,这一操作的本质是将初始时 “)” 对应位置的前缀和加 1,而其他位置的前缀和保持不变。括号序列合法的核心条件是:所有位置的前缀和 $a_i \geq 0$。

基于此条件,判断流程如下:找到第一个满足 $a_i < 0$ 的位置,若该位置附近存在可修改的 “)(” 结构(即能通过修改使该位置及后续位置的前缀和均非负),则进行修改操作,随后再次检查修改后的括号序列是否满足所有前缀和 $a_i \geq 0$,以此确定序列是否合法。

该算法的时间复杂度为 $O(n)$,$n$ 为括号序列的长度,仅需遍历一次序列即可完成前缀和计算与合法性判断。

C. 猜拳游戏

首先定义 $g = \gcd(n, m)$(即 $n$ 和 $m$ 的最大公约数),并令 $n' = \frac{n}{g}$,$m' = \frac{m}{g}$。

在猜拳游戏中,$10100$ 是一个足够大的数字(其值超过 $\text{lcm}(n, m)$,即 $n$ 和 $m$ 的最小公倍数),因此只需考虑游戏不断进行过程中可能出现的所有状态。

将字符串 $a$(长度为 $n$)和字符串 $b$(长度为 $m$)分别按照下标对 $g$ 取模的余数进行分组,共可分为 $g$ 组。以第 $k$ 组($0 \leq k < g$)为例,字符串 $a$ 中属于该组的有 $n'$ 个招式,字符串 $b$ 中属于该组的有 $m'$ 个招式,这两组招式两两组合形成的 $n' \times m'$ 种情况,一定会在同一局游戏中全部出现。

若要避免平局,必须保证字符串 $a$ 中该组的 $n'$ 个招式组成的集合与字符串 $b$ 中该组的 $m'$ 个招式组成的集合没有交集(即两组招式完全不同)。

接下来需讨论 “石头(R)、剪刀(P)、布(S)” 这三种招式在字符串 $a$ 和 $b$ 中的可选情况,在所有合法的情况中选择操作次数最少的方案,最后将 $g$ 组的最少操作次数相加,得到最终的答案。

该算法的时间复杂度为 $O(n + m)$,其中 $n$ 和 $m$ 分别为字符串 $a$ 和 $b$ 的长度,需分别遍历两个字符串完成分组与招式集合的判断。

D. 卡常数

首先分析单个数列的情况:对于某一数列,选择其中一个位置 $j$,会使该数列的代价乘以系数 $\frac{a_{i,j} - b_{i,j}}{a_{i,j}}$(其中 $a_{i,j}$ 和 $b_{i,j}$ 为该数列第 $j$ 个元素的相关参数)。由于该系数为真分数,将数列中所有这样的真分数按照从小到大的顺序排列后,从左到右选择这些真分数(即优先选择较小的真分数),能使数列代价的减少量最大,是最优的选择策略。

进一步计算每个数列中,按照上述顺序选择每个元素时,该元素能让数列代价比选择上一个元素后再减少的量,将这个减少量定义为该元素的“价值”。通过分析可发现,在同一个数列中,元素的价值是单调递减的(即越靠后选择的元素,其减少代价的能力越弱)。

基于单个数列的价值特性,将所有数列中所有元素的价值整合到一个集合中,对该集合按照从大到小的顺序排序,然后依次选择价值最大的元素,即可实现整体代价的最小化。

贪心策略正确性证明:由于单个数列内部元素的价值单调递减,后续元素的价值必然小于前面元素的价值,因此在选择时,后续元素不可能先于前面元素被选中,这就保证了将所有元素价值排序后从大到小选择的贪心策略是正确的。

设 $m = \sum l_i$(其中 $l_i$ 为第 $i$ 个数列的长度),则该算法的时间复杂度为 $O(m \log m)$,主要耗时在于对所有元素价值的排序操作。

E. 向死存魏

首先采用离线处理的方式,将所有的“二操作”(具体操作含义需结合题目背景,此处默认是对序列的修改或查询操作)加入到操作序列中。在执行操作的过程中,实时记录当前序列的长度,若某一查询操作要求的答案超过当前序列的长度,则判定该查询无解。设所有操作全部结束后,序列的最终长度为 $k$。

对于删除操作,由于每个元素至多被删除一次,且序列的最终长度为 $k$,因此可使用 $set$ 数据结构对序列进行暴力修改(如标记删除或直接移除元素),操作效率可满足需求。

对于查询操作,首先利用双指针法预处理出初始状态下从序列每个位置开始查询的答案。在后续的删除操作中,针对被删除的元素 $x$,先确定其删除区间:设删除区间左边第一个未被删除的位置为 $p$(若不存在这样的位置,则令 $p = 0$),删除区间右边第一个未被删除的位置为 $q$(若不存在这样的位置,则令 $q = k + 1$)。删除该区间内所有的 $x$ 后,会对起始位置在 $[p + 1, q - 1]$ 范围内的查询产生影响——从这些起始位置开始查询时,需要到位置 $q$ 才能找到元素 $x$。

为高效处理上述区间影响,需对 $[p + 1, q - 1]$ 范围内的当前查询答案进行更新(将答案设为 $q$),此处可使用线段树维护“区间取最值、单点查询”的操作,确保查询与更新的效率。

该算法的时间复杂度为 $O((k + m) \log k)$,其中 $k$ 为序列最终长度,$m$ 为操作总数,线段树的查询与更新操作均为 $O(\log k)$ 复杂度,且需处理 $m$ 次操作。

F. 网格 III

在网格操作中,每一次操作至多会影响 $O(n)$ 个格子($n$ 为网格的边长或相关维度参数),因此只需关注当前操作实际改变的格子数量即可。

由于行列混合操作较为复杂,可将其拆分为两个独立的部分讨论:一是计算有多少行对当前列的修改产生贡献,二是计算有多少列对当前行的修改产生贡献。下文以“计算行对当前列修改的贡献”为例展开分析。

首先为每行和每列分别记录两个关键信息:最后一次修改的时间、最后一次修改的颜色(如红色或白色)。对于网格中 $k \times k$ 的正方形区域,其对应的所有行列信息仅存在两种不同的有效情况:

  1. 该正方形区域内所有列的修改颜色均为红色,且最晚的白色行修改时间在最早的红色列修改时间之前;
  2. 该正方形区域内存在列的修改颜色为白色,且所有行的修改颜色均为红色,同时最早的红色行修改时间在最晚的白色列修改时间之后。

由于 $k$ 的取值较小,可直接枚举包含当前列且长度为 $k$ 的区间,暴力查询该区间内的行列信息,进而统计满足上述两种情况的行的数量。为提高效率,对于每行,预先记录所有长度为 $k$ 的区间的信息,每次修改操作仅会改变 $O(k)$ 个区间的信息,后续可通过一维偏序的方法查询满足条件的行数量。

为简化时间与颜色的判断逻辑,对修改时间进行如下处理:若修改颜色为红色,时间值保持不变;若修改颜色为白色,时间值取其相反数。初始状态下,所有行列的修改颜色默认为红色,时间值可设为初始常量(如 0)。经过这样的处理,上述两种情况的判断可转化为对区间内时间值取最小值的操作。

可使用树状数组或线段树维护区间最小值,若直接暴力求区间最小值,算法的时间复杂度为 $O(n k^2 + n k \log n)$;若采用单调队列对区间最小值查询进行优化,时间复杂度可降至 $O(n k \log n)$,其中 $n$ 为网格的相关维度参数,$k$ 为正方形区域的边长。

G. 我爱数数

设 $t_i$ 表示使 $b_i \geq a_i$ 所需的操作次数($a_i$ 和 $b_i$ 为题目给定的数组元素),则本题的答案等价于求 $E[\max_{i=1}^{n} t_i]$(即 $t_i$ 最大值的期望)。

可通过容斥原理计算该期望,具体公式为:答案等于对所有非空子集 $S \subseteq [n]$,求和 $(-1)^{|S| - 1} \times E[\min_{i \in S} t_i]$(其中 $|S|$ 表示子集 $S$ 的元素个数,$E[\min_{i \in S} t_i]$ 表示子集 $S$ 中 $t_i$ 最小值的期望)。

期望计算分析

假设有 $x$ 个区间满足:对任意 $i \in [l_p, r_p] \cap S$,均有 $c_p < a_i$($[l_p, r_p]$ 为区间的左右端点,$c_p$ 为区间的相关参数)。此时,剩余的 $m - x$ 个区间($m$ 为总区间数)一旦被选中,就会覆盖子集 $S$ 中的某个元素,导致 $t_i$ 的值固定。

在上述假设下,$E[\min_{i \in S} t_i]$ 的计算过程如下:

$$ E[\min_{i \in S} t_i] = \sum_{i=0}^{+\infty} \frac{x^i (m - x) (i + 1)}{m^{i + 1}} = \frac{m}{m - x} $$

基于此,定义 $w_x$ 为:对所有满足“恰好有 $x$ 个区间符合上述条件”的子集 $S$,求和 $(-1)^{|S| - 1}$。则最终答案可表示为:

$$ \text{答案} = \sum_{x=0}^{m - 1} w_x \times \frac{m}{m - x} $$

动态规划与优化

为计算 $w_x$,引入辅助函数 $h_i$,定义如下:

$$ h_i = \begin{cases} a_i - 1 & i \in S \\ +\infty & \text{Otherwise} \end{cases} $$

此时,“对任意 $i \in [l_p, r_p] \cap S$,$c_p < a_i$”这一限制条件可转化为“对任意 $i \in [l_p, r_p]$,$c_p \leq h_i$”。

进一步构建小根笛卡尔树(基于 $h_i$ 的值),并在树上进行动态规划。定义状态 $f_{L, R, u, x, 0/1}'$,其含义为:

  • 考虑区间 $[L, R]$,仅关注 $h_i \geq u$ 的位置,且 $[L, R]$ 是一个连续段(即 $h_{L - 1} < u$ 且 $h_{R + 1} < u$);
  • 满足 $L \leq l_p \leq r_p \leq R$ 且 $c_p \leq x \leq \min_{i \in [l_p, r_p]} h_i$ 的区间 $p$ 共有 $x$ 个;
  • 子集 $T = S \cap [L, R]$ 的元素个数为偶数(对应“0”)或奇数(对应“1”);
  • 该状态的值表示满足上述条件的子集 $T$ 的数量。

令 $f_{L, R, u, x} = f_{L, R, u, x, 0}' - f_{L, R, u, x, 1}'$,并引入辅助数组 $g$,则动态规划的转移公式如下:

$$ g_{L, R, u, x} = f_{L, R, u + 1, x} - \sum_{i=L}^{R} [h_i = u] \sum_{y=0}^{x} f_{L, i - 1, u + 1, y} \times g_{i + 1, R, u, x - y} $$

$$ f_{L, R, u, x} = g_{L, R, u, x - s_{L, R, u}} $$

其中 $s_{L, R, u}$ 表示满足 $L \leq l_p \leq r_p \leq R$ 且 $c_p = u$ 的区间 $p$ 的数量。

时间复杂度优化

若直接按照上述转移公式计算,时间复杂度为 $O(n^4 m^2)$($n$ 为数组长度,$m$ 为总区间数)。但通过观察可知,$h_i = u$ 的位置对于所有 $u$ 而言,总数仅为 $n$ 个,因此可将时间复杂度优化至 $O(n^3 m^2)$。

进一步利用经典的拉格朗日插值(拉插)技巧,可将转移过程中的卷积运算转化为点乘运算,此时时间复杂度可降至 $O(n^3 m + m^2)$。关于拉格朗日插值技巧的具体应用,可参考题目 CF1874E Jellyfish and Hack。

我的评价

首先,让我吐槽一下这次比赛XJ的题目分配

题目分配

MX-J+XABCDEFG
洛谷T1T2T3T4T5T6T7
MX-J26√√√√√
MX-X23 √√√√√
知识点入门入门入门提高提高NOINOI

开始吐槽

在我的印象里,CSP-X是小学组的难度,但是,这里为什么X组的难度有NOI,我就感觉很猎奇,而且,为什么J组的第一二题在X组没,Who can tell me?

关于各题

【MX-X23-T1】丢手绢

这道题我大概提交了有好几次,主要是老是TLE,原因是因为写了太多没用的循环,这是AC的代码

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,x,i,f[N],ma,s;
int main(){
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>x;s=i+x;
        while(s<1) s+=n;
        while(s>n) s-=n;
        f[s]++;
        ma=max(ma,f[s]);
    }
    for(i=1;i<=n;i++) if(f[i]==ma) cout<<i<<" ";
}

注意超n和小1的数据处理

【MX-X23-T2】括号串

这道题,我当时是在洛谷搜一道题,叫做括号串匹配,然后,找到了,但是没用,然后我在CSXX上找答案,找到了,但是没用

所以只好独立思考

namespace pts70{
bool check(string s){
    int tmp,i;
    for(i=tmp=0;i<s.length();i++){
        if(s[i]=='(') tmp++;
        else if(s[i]==')'){
            tmp--;
            if(tmp<0) return 0;
        }
    }
    return tmp==0;
}
int main(){
    cin>>T;
    while(T--){
        cin>>n>>s;fl1=0;
        if(check(s)) fl1=1;
        if(n>1000){cout<<(fl?"Yes":"No")<<"\n";continue;}
        ss=s;
        for(i=0;i<ss.length()-1;i++){
            ss=s;
            if(ss[i]==')'&&ss[i+1]=='('){
                ss[i]='(';ss[i+1]=')';
                if(check(ss)) fl=1;
                else ss=s;
            }
        }
        cout<<(fl?"Yes":"No")<<"\n";
    }
    return 0;
}
}

思路其实也很明显了,就是死暴力,check函数就是判断这个字符串的括号是否合法,然后,20-29行就是两个字符串一个一个往后做,替换,然后判断,可以就输出,不可以就下一个

测试点编号结果时间内存
1AC4ms788.00KB
2AC4ms788.00KB
3AC4ms832.00KB
4AC8ms788.00KB
5AC8ms832.00KB
6AC34ms788.00KB
7AC33ms788.00KB
8WA32ms788.00KB
9WA32ms788.00KB
10WA34ms788.00KB

然后我看了一眼前面那个人的代码,发现是我想多了,代码

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int T,n,t,w,wz,i,fl1,fl2,sts;
char s[N];
void count(){
    if(s[i]=='(') t++;
    if(s[i]==')') w++;
}
int main(){
    cin>>T;
    while(T--){
        cin>>n;t=w=0;fl1=1;
        for(i=1;i<=n;i++){
            cin>>s[i];
            count();
            if(t<w){fl1=0;wz=i;}
        }
        if(t==w){
            sts=1;
            if(fl1==1){cout<<"Yes\n";sts=0;continue;}
            swap(s[wz],s[wz+1]);
            t=w=0;fl2=1;
            for(i=1;i<=n;i++){
                count();
                if(t<w) fl2=0;
            }
            if(wz==n) fl2=0;
            if(sts==1) cout<<(fl2?"Yes":"No")<<"\n";
        }else{cout<<"No\n";continue;}
    }
}

【MX-X23-T3】猜拳游戏

不会做,这个代码 10pts

#include <bits/stdc++.h>
using namespace std;

int main(){
    cout<<1;
}

【繁忙的工艺 FMCRAFT】服务器许可条款

一、简介

  • 欢迎加入【繁忙的工艺 FMCRAFT】服务器!为了确保所有玩家都能在一个友好、公平、有序且合法合规的环境中畅享游戏,服务器管理团队制定了以下许可条款。请您务必仔细阅读并严格遵守这些规则和制度,共同维护服务器的和谐、乐趣与持久性。
  • 特别注意,如果是招人的方式获取服务器人数,务必需要让其阅读这份服务器许可条款,否则将对招人者进行处罚。
  • 在以下内容中,服务器管理团队将称作我们。

二、服务器规则

(一)尊重他人

  • 概述:在服务器上,我们要求所有玩家彼此尊重。请遵循以下准则:
  • 禁止进行人身攻击、恶意言辞或骚扰其他玩家。初次违反此规定的玩家将收到警告;再次违反将被置于旁观者模式 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。
  • 严禁散布仇恨、种族歧视、性别歧视、地域歧视或其他不当言论。初次违反此规定的玩家将被置于旁观者模式 $3 - 7$ 天;情节严重或再次违反者将被永久封禁。
  • 不得试图盗用他人账号、密码或伪造身份。一旦发现此类行为,玩家将被永久封禁。
  • 请不要频繁、恶意击杀其他玩家(PVP以及比赛的单方面碾压不算在情况内,但仅适用于服务器管理团队举行的比赛)。违反此规定的玩家将被置于旁观者模式 $15 - 30$ 天,情节特别严重者将被永久封禁。
  • 尊重其他玩家的隐私,不得未经允许泄露或传播其他玩家的个人信息。初次违反此规定的玩家将被暂时封禁 $7 - 14$ 天;情节严重或再次违反者将被永久封禁。

(二)禁止作弊

  • 概述:我们严禁任何形式的作弊行为。以下是明确禁止的作弊行为和相应处罚:
  • 使用任何外挂、修改器、自动化脚本或其他非法工具来修改游戏数据、获得不公平优势,如无限生命、无限资源、快速建造等。初次违反将被暂时封禁 $7 - 30$ 天。
  • 利用游戏漏洞、特性或错误来复制物品、刷取经验、跳过游戏进程等获取非法利益。违反此规定的玩家将被暂时封禁 $7 - 60$ 天甚至永久封禁。
  • 与作弊者合作或共享作弊工具、方法,协助他人作弊。参与者将受到与直接作弊者相同的处罚。
  • 篡改游戏文件或数据包以达到作弊目的。一旦发现,将被暂时封禁 $7 - 60$ 天,情节特别严重者将被永久封禁。
  • 禁止多开游戏账号。一旦发现,永久封禁非主号,二次发现封禁所有账号。
  • 使用未经授权的第三方软件或插件干扰游戏正常运行或获取不公平优势。初次违反此规定的玩家将被置于旁观者模式 $3 - 7$ 天;再次违反或情节严重者将被暂时封禁 $7 - 60$ 天。
  • 潜规则:不被发现、举报即可

(三)禁止黑客行为

  • 概述:任何试图入侵服务器系统、窃取玩家数据、破坏服务器安全防护机制或进行其他恶意网络攻击的行为都是严格禁止的。
  • 不得利用网络技术手段干扰服务器的正常网络连接,导致其他玩家游戏卡顿及非正常情况退出游戏(例如* left the game.,消息后面有一个英文的点)。初次违反此规定的玩家将被暂时封禁 $7 - 60$ 天,情节特别严重者将被永久封禁。
  • 若发现有玩家进行此类黑客行为,将立即被永久封禁,并可能承担相应的法律责任。

(四)保护服务器与维护

  • 概述:我们需要每个玩家的协助来保护服务器的稳定和安全。请遵循以下准则:
  • 禁止尝试用各种方式攻击服务器的硬件设施、软件系统或破坏服务器的网络架构。违反此规定的玩家将被永久封禁,如造成服务器财产损失,需承担法律责任。
  • 不得泄露服务器的敏感信息,如服务器(软件和硬件都包括在内)的信息。初次违反此规定的玩家将被暂时封禁 $7 - 30$ 天;情节严重或再次违反者将被永久封禁。
  • 严禁故意传播病毒、恶意软件或其他有害内容(违法内容),影响服务器的正常运行或其他玩家的设备安全。违反此规定的玩家将被永久封禁,且需承担法律责任。
  • 遵守服务器的资源使用规则,不得过度占用服务器的内存、带宽等资源(特别注意不要放太多箱子,尽量使用木桶),影响其他玩家的游戏体验。初次违反此规定的玩家将收到警告;再次违反将被置于旁观者模式 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。

(五)合理建造

  • 概述:我们鼓励玩家在服务器上建造创意和精美的建筑。请遵循以下准则:
  • 禁止在不允许的区域建造或破坏他人的建筑,包括但不限于公共设施。初次违反此规定的玩家将收到警告;再次违反将被置于旁观者模式 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。
  • 不得建造或使用任何违法、淫秽、恐怖、暴力或冒犯性的建筑,包括但不限于血腥场景、邪教象征等。初次违反此规定的玩家将被置于旁观者模式 $3 - 7$ 天;情节严重或再次违反者将被永久封禁。
  • 禁止滥用建筑权利,遵循服务器的建筑规划和限制,如高度限制等。初次违反此规定的玩家将收到警告;再次违反将被置于旁观者模式 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。

(六)社交互动

  • 概述:遵守服务器内的聊天规范,不得发送大量无意义的重复信息、垃圾广告或恶意刷屏。初次违反此规定的玩家将收到警告;再次违反将被禁言 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。
  • 不得在聊天频道传播虚假信息、谣言或误导其他玩家。初次违反此规定的玩家将被置于禁言 $1 - 3$ 天;再次违反或情节严重者将被暂时封禁 $7 - 30$ 天。
  • 不得在服务器官方社群、服务器内非法宣传其他 MC 服务器,违者将直接被踢出社群并封禁游戏账户,第一次 $1$ 个月,第二次直接永久封禁。
  • 禁止在服务器内组织或参与任何非法或违反道德的社交活动,如赌博、诈骗等。一旦发现此类行为,玩家将被永久封禁且需承担法律责任。

(七)团队合作与竞争

  • 概述:在团队活动中,如组队打怪、团队竞赛等(注意:背叛团队、故意损害团队利益是被允许的,前提是情况合理)。初次违反此规定的玩家将被移出团队并置于旁观者模式 $1 - 3$ 天;再次违反或情节严重者将被暂时封禁 $7 - 30$ 天。
  • 遵循公平竞争原则,不得在竞赛活动中使用不正当手段获取胜利,如干扰对手、作弊等。初次违反此规定的玩家将被取消竞赛成绩并置于旁观者模式 $1 - 3$ 天;再次违反或情节严重者将被暂时封禁 $7 - 30$ 天。

(八)资源管理

  • 概述:合理利用服务器内的各种资源,包括但不限于矿产、木材、食物等,不得过度开采或浪费,得到我们的同意的玩家不受此规定的约束。初次违反此规定的玩家将收到警告;再次违反将被置于旁观者模式 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。
  • 不得通过不正当手段囤积资源,影响服务器内的资源平衡和其他玩家的正常获取。初次违反此规定的玩家将被置于旁观者模式 $3 - 7$ 天;再次违反或情节严重者将被暂时封禁 $7 - 60$ 天。

三、增值服务说明

  • 概述:本服务器提供了增值服务的选项。但需要注意:
  • 玩家可以在服务器内的特定充值页面,使用安全的支付渠道(如微信支付、支付宝)进行充值,注意:在没有经过服务器管理员的同意下,不可以擅自增值服务。
  • 增值服务可获得的内容包括但不限于:独特的游戏道具、额外的游戏内功能或特权、增加资源获取速度或数量等。
  • 如果你是增值服务兑换物品,你务必需要在氪金前与服务器操作员说明,不然将视为无偿捐赠。
  • 本服务器的增值服务渠道,不可以退款,则代表你支付后不可退款,即使是非成年人,也不可退款。
  • 充值成功后,相应的虚拟物品、服务或特权将及时发放至玩家的游戏账号。

四、制度

(一)管理团队

  • 概述:服务器设有管理团队,负责维护服务器秩序和处理问题。 请遵循以下准则:
  • 尊重并遵守管理团队的指示和决定。初次违反此规定的玩家将收到警告;再次违反将被置于旁观者模式 $1 - 3$ 天;多次违反或情节严重者将被暂时封禁 $7 - 30$ 天。服主有权永久封禁违规账号与 IP。
  • 不得干扰管理团队的工作或阻碍其履行职责。初次违反此规定的玩家将被暂时封禁 $7 - 30$ 天;情节严重或再次违反者将被永久封禁。
  • 合理提出问题、建议或投诉,并与管理团队进行积极的沟通。玩家可以通过QQ社群提出建议,优秀建议者将获得不等的奖励。
  • 禁止要求任何管理员做某些事。初次违反此规定的玩家将被禁言 $5 - 10$ 天;再次违反或情节严重者将被封禁 $10 - 30$ 天。

(二)惩罚制度

  • 概述:服务器将根据违反规则的严重性采取相应的惩罚措施:
  • 第一次违规通常会收到警告或口头警告。
  • 严重违规行为可能导致旁观者模式、封禁或其他惩罚措施。
  • 惩罚决定由管理团队根据具体情况做出,具有最终决定权。
  • 部分未定义的规定,将按上述的描述进行处理。

(三)投诉和申诉

  • 概述:如果您对管理团队的决定有异议或希望提出投诉:
  • 提交书面申诉,详细说明您的问题、理由和证据。
  • 管理团队将仔细审查您的申诉,并在 $7 - 14$ 个工作日内作出回应。
  • 请尊重管理团队的决定,遵守其最终裁决。

(四)您的游戏账号

  • 概述:您在服务器上取得的任何成就,其相关数据和权益归服务器管理团队所有。服务器管理团队有权封禁、删除您的账号以及对您在服务器上的所有操作进行管理。 您的游戏账号归属于FMCRAFT所有

五、免责声明

  • 服务器管理团队将竭尽全力维护服务器的正常运行,但不对以下情况承担责任:
  • 由于不可抗力因素(如自然灾害、战争、政府行为等)导致的玩家数据丢失[故意使服务器出现问题类型除外]。
  • 玩家之间的交易、合作或争端所产生的损失或纠纷。
  • 玩家在服务器上的行为所导致的任何后果或损失。
  • 因服务器的升级、修改或优化导致的玩家数据丢失,但我们会提前通知并尽最大努力备份数据。

六、条款修改

  • 概述:服务器管理团队保留随时修改许可条款的权利。任何修改将在服务器官网和游戏内显著位置公告,并在生效前提前 $7$ 天通知玩家。若玩家在修改生效后继续使用服务器,则视为同意修改后的许可条款。

七、权利制定

(一)服主

  • 对服务器拥有最高的修改权、执行权和所有权,包括但不限于制定服务器规则、处理重大违规事件、决定服务器的发展方向等。特别注意:服主不受限上述许可。

(二)服务器管理员(除服主)

  • 对普通玩家拥有一定的修改权和执行权,包括但不限于处理日常违规行为、维护服务器秩序、协助服主进行管理决策等。特别注意:服务器管理员不受限上述部分许可。

(三)普通玩家

  • 享有在服务器内进行正常游戏和交流的权利,但没有直接管理其他玩家或干涉服务器运营的权利。

八、最后

  • 感谢您选择【繁忙的工艺 FMCRAFT】,如您已加入服务器,则代表您同意上述许可条款。祝您在我们的我的世界服务器中玩得愉快!

乙巳岁九月十四修博客服务器感怀

2025年10月5日修理博客服务器有感

时间线

2025年10月2日

?一夜醒来,服务器崩溃了

不知道咋修

2025年10月3日

忘了

2025年10月4日

开始琢磨怎么修

但又不知道怎么修

尝试过重启服务器、重装主题

不敢动数据库

2025年10月5日

重装数据库(保留数据),无用

我草他妈的,直接删掉数据(导出)

我草他妈的,能进去了

然后在查看导出的数据

image.png

???少了一个括号

猎奇

项目地址

DHEnry-FMCRAFT/websocket-chat: 来自AI编写的websocket版的聊天程序

💬 WebSocket 聊天室应用

一个基于 WebSocket 的实时聊天室应用,支持多频道聊天、管理员功能和用户管理。

🚀 功能特性

👥 用户功能

  • 🆓 自动用户名分配 - 首次进入自动生成5位随机用户名
  • 🔄 多频道切换 - 支持在多个频道间自由切换
  • 👀 用户列表查看 - 查看指定频道的在线用户
  • 💬 实时消息收发 - 基于 WebSocket 的实时通信
  • 🎨 彩色消息显示 - 不同类型消息使用不同颜色区分

⚡ 管理员功能

  • 🔐 管理员认证 - 使用密码验证管理员身份
  • 👮 用户管理 - 踢出用户、断开用户连接
  • 📢 频道管理 - 清退频道、关闭频道
  • 👁️ 全服监控 - 查看全服在线用户
  • 📩 私信功能 - 向指定用户发送私信

🛠️ 技术栈

  • 后端: Python + asyncio + websockets
  • 前端: 纯 Python 命令行客户端
  • 通信: WebSocket + JSON
  • 安全: SHA-256 密码哈希

📦 安装与运行

1. 克隆项目

git clone https://github.com/DHEnry-FMCRAFT/websocket-chat
cd websocket-chat

2. 安装依赖

pip install websockets

3. 配置服务器的允许频道

请编辑server.py中的ALLOWED_CHANNELS数组,逗号分隔,引号包裹允许的频道,注意允许的频道一定要包含public

4. 配置服务器管理员密码HASH

请编辑hash.py中的test_string变量,为初始密码,然后使用以下代码运行

python hash.py

然后将生成后的hash设置为server.py中的ADMIN_PASSWORD_HASH变量的值,然后保存server.py

5. 启动服务器

python server.py

服务器默认监听 0.0.0.0:8765,允许的频道:public、1、2、3

6. 启动客户端

python client.py

🎯 使用指南

基本命令

命令功能示例
::login [用户名]设置用户名::login Alice
::choose [频道ID]切换频道::choose 2
::list [频道ID]查看频道用户::list 1
exit / quit退出聊天exit

管理员命令

命令功能示例
::lists查看全服用户::lists
::say [频道] [用户] [消息]发送私信::say 1 Bob "Hello"
::kicks [频道] [用户] [理由]踢出用户::kicks 1 Bob "违规发言"
::kick [频道] [理由]清退频道::kick 1 "频道维护"
::closes [频道] [用户] [理由]断开用户::closes 1 Bob "多次违规"
::close [频道] [理由]关闭频道::close 1 "封禁频道"

🔒 管理员登录

要使用管理员功能,请使用用户名 administrator 登录,系统会提示输入密码。

⚙️ 配置说明

当前默认EXAMPLE服务器配置

  • 默认端口: 8765
  • 允许频道: public, 1, 2, 3
  • 管理员密码哈希: 在 server.py 中配置

客户端配置

  • 调试模式: 修改 DEBUG 变量切换默认服务器地址,1为使用localhost:8765,用于本地调试server.py,0为需要用户自行输入服务器地址
  • 消息颜色: 不同类型消息使用不同颜色标识

🐛 故障排除

常见问题

  1. 连接被拒绝 - 确保服务器已启动且地址正确
  2. 用户名已存在 - 更换用户名或切换到其他频道
  3. 频道不允许 - 只允许使用预定义的频道ID

日志查看

服务器会在控制台输出运行状态和错误信息,客户端会显示连接状态和错误提示。

📝 开发说明

项目结构

websocket-chat/
├── server.py          # 服务器主程序
├── client.py          # 客户端主程序
└── README.md          # 项目说明

来源

这个项目其实是 $Deepseek \times Doubao$ 一起写出来的(乱用LaTex),也是有很多的BUG,但也是在我的命令下写出来的

这个项目最终会放到 $FMCRAFT$

历程

2025年10月1日 PR V1.0 Release V1.0 · DHEnry-FMCRAFT/websocket-chat V1.0

已知BUG

  • 登录时直接进入频道会导致无法发送消息,需要先自定义一个用户名

感谢AI

起因

是这样的

在我们班,疑似身高成为了判断一个人的标准捏

今天,2025年9月30日,学校举行校运动会,可我看到了这样猎奇的现象:

课间休息的时候,我们的体委开启了日常操作:走到一个比较矮的同学面前,把手平放在对方头顶,然后又放到自己脖子,比划着身高差嘛,周围响起一阵笑声,被比划的同学勉强扯出笑容,眼神却有些闪烁,其实这里被比划的人是我,但是感觉我们的体委有点软弱,我当时还是对他进行了教育(bushi,他也说他不会再犯了,当时说的是如果他再犯我把他*了,写的时候已经忘了是啥了,忘了就忘了,最后也和解了

[scode type="yellow"]信息:慈溪市上林初级中学 2028 届 2 班陈成[/scode]

另外一种情况

一个比较高的人给一个比较矮的人摸头,其实这里摸的是我,这个我不是很放在心上,因为印象不高,具体忘了 不会只有男的才知道,摸头杀是侮辱人的吧

剩下的不多说了,说了要被喷的

我的评价是:😂😂😂(表示嘲讽)

这种情况已经不想多说了,美其名曰的开玩笑,但这个玩笑是不是开得有点逆天了

但是我还是忍不住想批判亿小下,所以就诞生出了本文

也许是我过于敏感,才会注意这种猎奇事情

此文章包含大量的侮辱性词汇,也是blog第一篇多次进行侮辱的文章,也运用了大量的夸张的修辞手法,会用*标注,仅个人观点

身高歧视无处不在

  • 男生不到175cm就是傻逼
  • 排队的时候矮个子永远排在前面
  • 体育课选人的时候,矮个子滚一边去
  • 矮个子永远是被高个子肘击,不小心被肘击的对象
  • 小不点

这玩意儿为什么会引起他人的强烈反感?

看似亲昵,实则越界

我认为,这种摸头杀是不正确的,摸头这种行为,应该只会被用于家长为表达对孩子的喜爱,摸头表达喜爱,或师生之间。但上面案例的情景,是一种居高临下的状态吧?说直白点,只有当一个人觉得自己比对方“高一级”的时候,才会自然地做出这种动作

被同学嘲笑的《尴尬》

在全班同学面前被比划身高,就类似于被当众测体重,个人想想,不尴尬吗?

那个瞬间吧,几乎是所有的人,所有的目光都望向那个被比划身高的人类,被比划的人只能尴尬的笑,毫无他法,说一种偏向于校园霸凌的语言:你是开不起玩笑吗???小不点

这真的是权威吗?这是游戏吗?

通过我个人的仔细观察,我发现了班里只有高个子对矮个子进行“摸头杀”操作,从来没有反过来的现象,再说,矮个子也摸不到高个子啊,我个人认为,这是一种权力的象征,说人话,我在身高上压倒了你,我就比你牛逼,我就可以用摸头杀来对待你

这是权威吗?在霸凌者眼前确实

这是游戏吗?如果是被双方认可的,我认为这算是游戏,但既然被称作摸头杀,那么我认为这不属于游戏

*而是赤裸裸的霸凌(bushi

物理接触

*有些人本身就因为身高问题,而导致内向,所以就会很讨厌物理接触(bushi

为什么我认为身高歧视是错误的(DEEPSEEK建议我写这个)

身高不全是个人能决定的!

身高这个东西,和天生有关联

$$ \text{男孩身高} = \frac{\text{父亲身高} + \text{母亲身高} + 13}{2} $$

$$ \text{女孩身高} = \frac{\text{父亲身高} + \text{母亲身高} - 13}{2} $$

看不懂分数的可以回炉重造了

根据上述内容,可以知道的是,身高跟父母身高有一定的关联,还有跟出生地区有一定的关联,例如东北于姐、山东大妈,有天生的优势,哦对,如果你爸是浙江人,你妈是东北人,那么你不一定能长得很高(我的情况)

说人话,有些东西天生就是被固定的,定义的,身高取决于基因,就像double和float,有本质上的数据存储限制,关于double和float精度丢失的问题 - 壹鲦热带鱼的小窝,这是先天性的,因为身高上嘲笑他人,就约等于嘲笑他人出生一样,根本没有道理

后天发育

虽然上面说是说,但只是理论,现实上,你完全可以一天吃10千克的粮食,总有一天可以长到八米一

但是但是,如果你投胎的家庭很穷,那么基本上可以不用奢望了,只能在学校好好干饭了

好好吃饭,吊打同龄人完全没问题

(当然我是不可能会好好吃饭的)

身高不是一切,身高不等于能力QWQ

先质问霸凌者:

$$ \text{身高高,成绩好吗} $$

成绩也好的请跳过

霸凌者自己ask一下自己

而且,有些东西本身就是不能比较的,举一个例子,100平方厘米 ○ 100厘米,我问,这能比吗

某些人,成绩不好,不要拿身高比,天生优势比你大坝,莫非是为了给自己增加自信???那么你可以唱一句歌,叫做:姐就是女王,自信放光芒(bushi

身高嘛,不同人,基因不同,有什么好比的

总结:每个东西都有自己的价值,身高不等于能力,如果你认为身高=能力,那么你可以去打NBA了

侮辱他人(very 重要)

关于为什么这个部分要放到这个章节的最后,因为有一种手法,叫做先抑后扬

我见过有同学因为身高自卑,走路都不敢挺直腰板。这种伤害是真实存在的,就像代码里的bug,虽然看不见,但影响很大

(FROM DEEPSEEK)

我认为deepseek的说法有些奇怪, 他说的是姚明吧QWQ,xmsl
这个身高鄙视本身就算侮辱他人,但没有特别直白吧?

被霸凌者的内心想法(up联想)

  • 其实挺反感这种人,但不知道怎么报复,没身高,没钱,没实力,忍者
  • 感觉自己像个幼儿园小屁孩,很没面子,想打地洞
  • 为什么要拿这个jb来侮辱我qwq

What should we do? | 我们应该怎么做?

对于霸凌者,我想说的话

建议换位思考,不会的话,可以参考回复消息,怎么才能不当语言终结者? 如何正确回复对方消息【笔记】【备忘录】 - 壹鲦热带鱼的小窝

或者自行询问deepseek

尊重别人的身体边界,不要随便触碰他人

真正的友好不是通过摸头来表现的,而是通过平等的交流和尊重

如果被霸凌者是女生,那么霸凌者死定了(bushi

等到有一天被霸凌者比你taller一个head,那么你死定了

如果你是旁观者

不要跟着起哄,起哄、嘲笑只会让被霸凌者死的很难看

等到有一天被霸凌者比你taller一个head,那么你死定了

建议沉默,或者

$$ \text{向后转,起步走!} $$

你甚至还可以转移话题,帮助被霸凌者解围(最好的选择)

但是是是是是是是,最好的选择,Hello, Teacher! There is height discrimination here, or harshly speaking, school bullying.

不懂的可以回炉重造了

image.png

如果你是被霸凌者

方法1

Hello, Teacher! There is height discrimination here, or harshly speaking, school bullying.

image.png

方法2

$$ \text{向后转,起步走!} $$

换个角度,上帝视角看身高

会编程的人, 普遍身高并不高,就我们学校有一个五年级拿到CSP-J一等的人,初一目前身高一米五五,但是,真的没有人会对他进行身高歧视,因为实力,你懂不懂?开玩笑的:),一个人的价值从来不是用厘米来衡量的,而是能实现什么作用,什么功能?

最后

真正的高大,从来不是物理上的高度,而是人格的高度,面对这种情况做出的反应

希望这篇文章能帮助到你,感谢您的阅读,BG是AI生成的

我对身高歧视其实是特别厌恶的,就像lx(zsr)特别厌恶《二四十孝图》中某些图一样

  • upd on 2025 11 19

关于double和float精度丢失的问题

起因

这个问题,我记得我是在五年级的时候就有了,情况大概如下

现在,你需要将π放进一个变量中,需要保留到小数点后100位

过程

完成代码

第一次代码

当时,我想着,不是so easy嘛,然后编写出了如下代码

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     float x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<x;
 }

然后,我怀着激动的心情,颤抖的手,内心OS:马上就可以AK了!哈哈哈哈!!! ,但是,现实给我了种种一拳

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.14159

我:

?

What FUCK???

这感觉不太对啊,这输出怎么能这样子

哦!我忘了,还有double!

使用double完成

然后编写出了如下代码

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     double x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<x;
 }

一键运行:

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.14159

?

没保存吗

Try again

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.14159

What FUCK?

怎么还是这样?

那时候我情绪崩溃了,不知道咋回事

然后,我突然想起来了保留小数点的方法!即setprecision

使用setprecision的方法完成

然后写出了如下代码

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     double x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<setprecision(100)<<x;
 }

嘿嘿嘿,兄弟们,终于可以AK了!!!

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.141592653589793115997963468544185161590576171875

az

好像确实精确了亿点,但没有完全精确吧?

怀疑人生中。。。

哦!还有printf!!!

使用printf的方法完成

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     double x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     printf("%.100lf",x);
 }

这下总不能错了,printf可是C语言的,怎么可能错??

可是...

现实又给我了重重一锤

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
PS E:\output> & .\'double.exe'
3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000

我是不配学编程吗???

为什么显示总是这么打击我

呜呜呜呜呜呜呜呜

呜呜呜呜呜呜

现在的情况

2024年,Deepseek-R1模型发布

我草,牛逼!

2025年9月24日,一学校老师向我询问此问题,又够引了我的兴趣

  1. IEEE 754 浮点数标准

计算机使用固定的位数来存储浮点数:

  • float(单精度):32位,约6-7位有效数字
  • double(双精度):64位,约15-16位有效数字
  • long double:通常80位或128位
  1. double 的存储结构

double 使用64位存储:

  • 1位符号位
  • 11位指数位
  • 52位尾数位

这意味着 double 只能精确表示大约15-16位十进制数字。

以上内容来自Deepseek-R1

EMM,似懂非懂,但是大概了解了

浮点数在计算机中以二进制分数形式存储,无法精确表示所有十进制小数。

以上内容来自Deepseek-R1

《二进制分数》

我嘞个二进制分数

依旧是补码,对吧???

二进制存储原理

double 的52位尾数只能表示有限精度的分数:

3.141592653588888... = 无法用有限二进制精确表示

计算机找到最接近的可表示二进制分数,这就是你看到的"奇怪"数字。

以上内容来自Deepseek-R1

我的评价:六百六十六

  1. 浮点数都是近似值
  2. 不要用 == 直接比较浮点数
  3. 需要高精度时使用特殊库或整数运算

以上内容来自Deepseek-R1

我的评价:近似值???

现在看来,我为什么不使用先乘再除呢?

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     unsigned long long x=31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<double(x/99);
 }

于是,我就发现了

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 ​
 e:\double.cpp:5:26: warning: integer constant is too large for its type
     5 |     unsigned long long x=31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
       |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 PS E:\output> & .\'double.exe'
 1.07941e+17

哦对对对对对对对,范围啊,我草

奇怪了,为什么我们不使用高精度数组呢?

使用数组

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     string x="31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
     cout<<x;
 }

运行!

PS E:\output> & .\'double.exe'
 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

耶!成功!

完

致谢