普通视图

发现新文章,点击刷新页面。
昨天以前失迹の博客
  • ✇失迹の博客
  • 建站技术 | 我的链接页面是如何实现的?
    前言 近期读了一位大佬的文章:谈谈独立博客友链 | 瓦解的生活记事,颇有感悟。 随即大改友链页面,以实现收藏和推荐的作用,你也可以访问 失迹の博客 - 链接。 默认样式 初次修改后 最终样式 主要的改动点在于: 两栏修改为更紧凑的三栏 区分板块 允许在链接右下角加入一个小图标(我称之为 “badge”)以增加一个链接 适配了暗黑模式和移动端 下面我会给出我的代码,并简单讲解作用。 由于我只针对我的博客,所以不保证能在其他地方使用,但思路必然可以参考。 实现代码 SCSS assets\scss\custom.scss: //链接页面 @media (min-width: 1024px) { .article-list--compact.links { display: grid; grid-template-columns: 1fr 1fr 1fr; background: none; box-shadow: none;
     

建站技术 | 我的链接页面是如何实现的?

2024年8月3日 08:00

前言

近期读了一位大佬的文章:谈谈独立博客友链 | 瓦解的生活记事,颇有感悟。

随即大改友链页面,以实现收藏和推荐的作用,你也可以访问 失迹の博客 - 链接

默认样式
默认样式

初次修改后
初次修改后
最终样式
最终样式

主要的改动点在于:

  • 两栏修改为更紧凑的三栏
  • 区分板块
  • 允许在链接右下角加入一个小图标(我称之为 “badge”)以增加一个链接
  • 适配了暗黑模式和移动端

下面我会给出我的代码,并简单讲解作用。

由于我只针对我的博客,所以不保证能在其他地方使用,但思路必然可以参考。

实现代码

SCSS

assets\scss\custom.scss

//链接页面
@media (min-width: 1024px) {
    .article-list--compact.links {
        display: grid;
        grid-template-columns: 1fr 1fr 1fr;
        background: none;
        box-shadow: none;

        article {
            background: var(--card-background);
            border: none;
            box-shadow: var(--shadow-l2);
            margin-bottom: 8px;
            border-radius: 10px;

            &:not(:nth-child(3n)) {
                margin-right: 8px;
            }
        }
    }
}

.article-list--compact.links {
    margin-top: 10px;
    margin-bottom: 40px;

    article {
        position: relative;

        .badge {
            position: absolute;
            width: 40px;
            height: 40px;
            line-height: 40px;
            border-radius: 100%;
            bottom: 10px;
            right: 10px;
            padding: 0 !important;
            display: block !important;
            text-align: center;
            font-size: 20px;
            background-color: var(--card-background);
            box-shadow: var(--shadow-l2);
        }
    }
}

.article-list--title {
    color: var(--accent-color);
    font-weight: 700;
    font-size: 1.6rem;
    margin-left: 10px;
}

具体而言,针对电脑端我们开启了三栏显示,同时增加了我们新增元素的相关样式。

json

当然,我们需要补充更多的数据且格式有所变化。

data\links.json

[
    {
        "title": "失迹的网站",
        "links": [
            {
                "title": "失迹の博客",
                "website": "https://blog.reincarnatey.net/",
                "image": "korita.png",
                "description": "猫与茶与代码与你:一位 编程 / 设计 / ACGN 爱好者的博客。"
            },
            ...
        ]
    }, {
        "title": "博客聚合网站",
        "links": [
            {
                "title": "开往 Travellings",
                "website": "https://www.travellings.cn/",
                "image": "travelling-light.png",
                "description": "「开往 Travellings」是一个友链接力项目,旨在通过网络跳转的方式将流量引入那些鲜为人知的独立站点,从而推动网络的开放性和多元性。",
                "badge": {
                    "icon": "🚇",
                    "link": "https://www.travellings.cn/go.html",
                    "description": "跳转到随机博客"
                }
            },{
                "title": "中文独立博客列表",
                "website": "https://github.com/timqian/chinese-independent-blogs",
                "image": "",
                "description": ""
            },
            ...
        ]
    },
    ...
]

html

layouts\page\links.html

{{ range $i, $category := $.Site.Data.links }}
    <span class="article-list--title">{{ $category.title }}</span>
    <div class="article-list--compact links">
        {{ $siteResources := resources }}
        {{ range $i, $link :=  $category.links }}
            <article>
                <a href="{{ $link.website }}" target="_blank" rel="noopener">
                    <div class="article-details">
                        <h2 class="article-title">
                            {{- $link.title -}}
                        </h2>
                        <footer class="article-time">
                            {{ with $link.description }}
                                {{ . }}
                            {{ else }}
                                {{ $link.website }}
                            {{ end }}
                        </footer>
                    </div>
            
                    {{ if $link.image }}
                        {{ $image := $siteResources.Get (delimit (slice "link-img/" $link.image) "") | resources.Fingerprint "md5" }}
                        {{ $imageResized := $image.Resize "120x120" }}
                        <div class="article-image">
                            <img src="{{ $imageResized.RelPermalink }}" width="{{ $imageResized.Width }}" height="{{ $imageResized.Height }}"
                                loading="lazy" data-key="links-{{ $link.website }}" data-hash="{{ $image.Data.Integrity }}">
                        </div>
                    {{ end }}
                </a>
                {{ if $link.badge }}
                    <a href="{{ $link.badge.link }}" target="_blank" title="{{ $link.badge.description}}" rel="noopener" class="badge">{{ $link.badge.icon }}</a>
                {{ end }}
            </article>
        {{ end }}
    </div>
{{ end }}

由于这一部分改动略大,所以直接一整段放上来了。

大致上就是改成了对应的布局。

附录

参考文献

  1. 本人 css 不好,多次请教了 ChatGLM

  2. 一些有关 css 的教程或文档

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 学习笔记 | Cloudflare 邮箱收到邮件时转发至多个邮箱
    起因 尽管官方提供的功能已经很足,但总有人会产生新的需求。 像我,这里需要使 Cloudflare 邮箱收到邮件时同时转发到数个邮箱。 官方并不提供这个功能,因此我们需要使用电子邮箱 Worker 实现。 实现 在”电子邮件路由“页面创建一个电子邮件 Worker,写入以下代码: export default { async email(message, env, ctx) { await message.forward("email@example.com"); await message.forward("email2@example2.com"); } } 当然你还可以继续添加更多个,但理论上来说转发到的邮箱都需要在“目标地址”中经过验证。 然后在“路由规则”中添加到 Catch-all 或者某个自定义地址。 之后可以给自己发送一封邮件进行测试,可以看到邮件成功被转发到了多个邮箱。 附录 参考文献 版权信息 本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。
     

学习笔记 | Cloudflare 邮箱收到邮件时转发至多个邮箱

2024年8月3日 08:00

起因

尽管官方提供的功能已经很足,但总有人会产生新的需求。

像我,这里需要使 Cloudflare 邮箱收到邮件时同时转发到数个邮箱

官方并不提供这个功能,因此我们需要使用电子邮箱 Worker 实现。

实现

在”电子邮件路由“页面创建一个电子邮件 Worker,写入以下代码:

export default {
  async email(message, env, ctx) {
    await message.forward("email@example.com");
    await message.forward("email2@example2.com");
  }
}

当然你还可以继续添加更多个,但理论上来说转发到的邮箱都需要在“目标地址”中经过验证。

然后在“路由规则”中添加到 Catch-all 或者某个自定义地址。

之后可以给自己发送一封邮件进行测试,可以看到邮件成功被转发到了多个邮箱。

附录

参考文献

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 建站技术 | 如何让 Bing 必应收录你的网站图标
    问题描述 网页成功被 Bing 搜索引擎收录,但图标却没有被收录。在 Bing 中搜索自己的网页,在网站的左侧无法显示图标,而是显示一个灰色小地球,别人的网站左侧却可以正常显示图标。 由于我之前的截图找不到了,所以对比一下其他的网站 问题的原因在于,Bing 没有收录你的网站的图标。 准备 想要 Bing 收录你的图标,首先你的网站应该有一个图标,并具备特定程度的资质。 事先声明 本文章分享了我所使用并成功的方法,但我无法保证本方法是正确的收录图标的方法,也不保证本方法在未来依旧有效。 但目前除此方法之外,据说只能等待资质达到标准后 Bing 主动抓取收录图标。 关于资质 这一点具体标准并不明确,可以确定的是显然你的网站需要被 Bing 收录,但若你的网站被收录的时间较长,内容较多且质量较高,相对来说我认为收录的概率会大一些。 这里放上我申请时的资质: 收录时间超过一年 超过二十篇原创文章 Bing 近半年点击次数 1.6k 由于具体标准未知,所以大家都可以尝试,欢迎在评论区分享你的资质与结果,为他人提供参考! 正确的添加你的图标 正确的标准
     

建站技术 | 如何让 Bing 必应收录你的网站图标

2024年8月2日 08:00

问题描述

网页成功被 Bing 搜索引擎收录,但图标却没有被收录。在 Bing 中搜索自己的网页,在网站的左侧无法显示图标,而是显示一个灰色小地球,别人的网站左侧却可以正常显示图标。

由于我之前的截图找不到了,所以对比一下其他的网站
由于我之前的截图找不到了,所以对比一下其他的网站

问题的原因在于,Bing 没有收录你的网站的图标。

准备

想要 Bing 收录你的图标,首先你的网站应该有一个图标,并具备特定程度的资质。

事先声明

本文章分享了我所使用并成功的方法,但我无法保证本方法是正确的收录图标的方法,也不保证本方法在未来依旧有效。

但目前除此方法之外,据说只能等待资质达到标准后 Bing 主动抓取收录图标。

关于资质

这一点具体标准并不明确,可以确定的是显然你的网站需要被 Bing 收录,但若你的网站被收录的时间较长,内容较多且质量较高,相对来说我认为收录的概率会大一些。

这里放上我申请时的资质:

  • 收录时间超过一年

  • 超过二十篇原创文章

  • Bing 近半年点击次数 1.6k

由于具体标准未知,所以大家都可以尝试,欢迎在评论区分享你的资质与结果,为他人提供参考!

正确的添加你的图标

正确的标准依旧未知,但显然你至少需要用某种方式添加你的图标:

<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">

推荐将图标文件放置在网站根目录。

提交 support request

在 Bing Webmaster Tools 中点击右上角的问号,点击"必应网站管理员支持"。

进入支持页面
进入支持页面

进入支持页面后,点击页面下方蓝色按钮 “Raise support request”。

发起 support request
发起 support request

填写表格,网站选择你申请收录的网站,问题类型选择 “Crawling issue”,再选择 “Other”,并描述你的问题(可以按照我申请时写的 “Bing didn’t crawl my site’s icon”),最后填写验证码,点击蓝色按钮 “Get Help”。

填写信息
填写信息

完成提交后,你会立即收到两封邮件,分别是你提交的信息以及官方收到你的提交。

后续

关注邮箱等待回复即可。

这里我在申请后的第三天便收到了回复:

I would like to inform you that the favicon has been updated from our end and it will take 7-8 days to reflect on the Bing search results.

表示已经成功更新我的网站图标,大约在一周后便可以在搜索引擎中看到。

然而实际上当天就已经可以在搜索引擎中看到图标了,详见 随笔杂谈 | 博客二三事

实际需要的时间也并不确定,例如:我申请的那一天是周五,收到的那天是周一,我等待三天可能与跨了一个周末有关。目前根据评论的反馈,最快的貌似一天就收录了。

你需要的时间可能更短也可能更长,欢迎尝试后在评论区分享你收到回复的用时以供参考。

写在最后

没想到困扰我这么久的方法这么轻松就解决了,以前怎么就没找到这么个入口呢,网上也搜索不到相关内容。

另外,如果你跟着我的文章进行了尝试,无论结果如何,欢迎在评论区分享你的相关情况(例如资质、用时、结果)以供更多人参考!

附录

参考文献

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 踩坑记录 | Windows 删除文件/文件夹提示“找不到该项目”
    问题描述 删除文件夹时,发现其中存在一个顽固文件,不管怎么删除都会提示”找不到该项目“,无法删除。 根据网络所见,貌似文件夹也存在这种情况。 问题猜想 我这里存在的问题推测是因为文件名末尾多带了一个 .,即类似于 example.file.txt.,正常操作是无法创建这样的文件的,貌似我这里是由于旧版本 adb 的 bug 所产生。 该文件并非无拓展名,具体肯定是属于异常情况,但这里不深究。 据说文件夹也存在这样的异常。 解决方法 方法一 这里提供我试验过后的成功方法。 创建一个 del.bat: del /f /a /q \\?\%1 rd /s /q \\?\%1 然后将要删除的东西拖到这个批处理文件上即可。 我这里直接拖入顽固文件不起作用,但是将顽固文件所在的文件夹直接拖入就删除成功了。 如果连正常文件都无法起作用,重新创建批处理文件并将编码修改为 ANSI。 方法二 右键,选择 Winrar 的添加到压缩文件,并勾选删除源文件(或者叫”压缩后删除原来的文件“)。 我这里直接对顽固文件进行操作未能成功,没有对所在文件夹尝试过,一些网友说有用,故也记录下来。 附录 参考文献 Wi
     

踩坑记录 | Windows 删除文件/文件夹提示“找不到该项目”

2024年7月29日 18:17

问题描述

删除文件夹时,发现其中存在一个顽固文件,不管怎么删除都会提示”找不到该项目“,无法删除。

根据网络所见,貌似文件夹也存在这种情况。

问题猜想

我这里存在的问题推测是因为文件名末尾多带了一个 .,即类似于 example.file.txt.,正常操作是无法创建这样的文件的,貌似我这里是由于旧版本 adb 的 bug 所产生。

该文件并非无拓展名,具体肯定是属于异常情况,但这里不深究。

据说文件夹也存在这样的异常。

解决方法

方法一

这里提供我试验过后的成功方法。

创建一个 del.bat

del /f /a /q \\?\%1
rd /s /q \\?\%1

然后将要删除的东西拖到这个批处理文件上即可。

我这里直接拖入顽固文件不起作用,但是将顽固文件所在的文件夹直接拖入就删除成功了。

如果连正常文件都无法起作用,重新创建批处理文件并将编码修改为 ANSI。

方法二

右键,选择 Winrar 的添加到压缩文件,并勾选删除源文件(或者叫”压缩后删除原来的文件“)。

我这里直接对顽固文件进行操作未能成功,没有对所在文件夹尝试过,一些网友说有用,故也记录下来。

附录

参考文献

  1. Windows桌面文件夹删除被提示“找不到该项目”——顽固目录、文件的删除_电脑桌面文件夹删除提示找不到该项目-CSDN博客

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 随笔杂谈 | 博客二三事
    前言 今天是我的博客建站 555 天。近来不止博客,我的网站均发生了许多的变化以及事件,以这篇文章作简述。 我的博客 这段时间里,我的博客是变化与事件最多的,其中最大的事件莫过于解决了此前博客在大陆访问一直不通畅的问题,我从 Netlify 迁移到了 Vercel。 迁移前 迁移后 令人感慨。 剩余的变化与事件,简而言之: 更好的接入了 Waline,同时记录了过程发表了一篇文章 加入了十年之约、开往、个站商店、博友圈、中文独立博客列表等项目 将上述项目加入了友链,都是非常好的项目,也算是助了一份力 除了原本就有的 Bing 与 Google 外,新增百度、360、Yandex 搜索引擎收录 更新了关于、友链、计划页面,开始记录博客大事记 侧栏加入了开往的接力链接,欢迎随意探索,发现更多的博客 更换了我的 Github 个人主页链接,因为改了名 新增了 Robots.txt 解决了 Bing 搜索页面不显示网站图标的问题 尽力优化了 SEO,真的 我的其他网站 除此之外,失迹云也历经数次更新,虽然看上去变化不大,但是修复了一些
     

随笔杂谈 | 博客二三事

2024年7月22日 23:25

前言

今天是我的博客建站 555 天。近来不止博客,我的网站均发生了许多的变化以及事件,以这篇文章作简述。

我的博客

这段时间里,我的博客是变化与事件最多的,其中最大的事件莫过于解决了此前博客在大陆访问一直不通畅的问题,我从 Netlify 迁移到了 Vercel

迁移前
迁移前
迁移后
迁移后

令人感慨。

剩余的变化与事件,简而言之:

  • 更好的接入了 Waline,同时记录了过程发表了一篇文章
  • 加入了十年之约、开往、个站商店、博友圈、中文独立博客列表等项目
  • 将上述项目加入了友链,都是非常好的项目,也算是助了一份力
  • 除了原本就有的 Bing 与 Google 外,新增百度、360、Yandex 搜索引擎收录
  • 更新了关于、友链、计划页面,开始记录博客大事记
  • 侧栏加入了开往的接力链接,欢迎随意探索,发现更多的博客
  • 更换了我的 Github 个人主页链接,因为改了名
  • 新增了 Robots.txt
  • 解决了 Bing 搜索页面不显示网站图标的问题
  • 尽力优化了 SEO,真的

我的其他网站

除此之外,失迹云也历经数次更新,虽然看上去变化不大,但是修复了一些较为严重的 bug。

同时,尽管我的个人主页原本在大陆的访问较为通常,不过我依旧选择从 Netlify 迁移到了 Vercel。

迁移前
迁移前
迁移后
迁移后

同时也类似于我的博客,尽力优化了 SEO,更换了 Github 链接,新增了 Robots.txt,也顺带解决了网站图标的事。

未来数月内的计划

接下来一段时间内不会有新文章更新,也不会有较大的改动,大约半个月后会进行一次较集中的更新。

此后内容更新会变得较为缓慢,字数可能不长,内容可能简单,但质量不会下降(我认为的)。

遇到的一些有趣的事情

按时间顺序排序。

  1. 关于第三方 Cookie 弃用(aka. 3PCD)

    谷歌,你先看看自家 Analytics。

    谷歌只需要在前方 3PCD 就可以了,而使用 GA 的博主要考虑的就多了
    谷歌只需要在前方 3PCD 就可以了,而使用 GA 的博主要考虑的就多了

    你们要不吵一架?根据官方仓库下的 issue,目前该问题谷歌内部正在商讨解决方案。

  2. 在 Cloudflare 配置里看到一个有意思的选项。

    笑死我了
    笑死我了

    我承认我的笑点很奇怪,但是本质上为关和 I’m under attack 真的很好笑。

  3. 等博客更新以后我要写在那篇文章最开头。

    被 Waline 开发者巡回了
    被 Waline 开发者巡回了

  4. 困扰了我许久的网站图标不收录问题,提了个工单四天就解决了。

    个人主页
    个人主页
    博客
    博客

    考虑到之前在网络上搜索不到可以参考的解决方案,之后或许会单独发一篇博客来分享我的解决方法。

  5. 写完这篇文章之后已经到第二天了,所以本文的第一句话就存在问题。

附录

参考文献

  1. 随笔还有参考文献?

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 建站技术 | 使博客更好地接入 Waline
    前言 近期为我的网站进行了一次整体的升级,修复了个人主页和云盘的诸多 bug,新增了更多功能。其中包括优化 Waline 的使用,在这里记录下来以供他人参考。 这里我使用的是 Hugo 以及 stack 主题,使用其他方式的可以更多的参考 waline 的官方文档。 迁移到最新版本 Waline 客户端 由于 stack 模板中所接入的 waline 版本为 V2,或者像我一样从更远古的版本就开始魔改的话引入的是 V1,因此这里我们先来迁移到 V3 版本。 直接按照官方文档中的引入方式修改代码即可,这里贴上我将 stack 模板修改后的代码。 layouts\partials\comments\provider\waline.html: <link rel="stylesheet" href="https://unpkg.com/@waline/client@v3/dist/waline.css"/> <div id="waline" class="waline-container"></div> <style> .waline-
     

建站技术 | 使博客更好地接入 Waline

2024年7月19日 17:57

前言

近期为我的网站进行了一次整体的升级,修复了个人主页和云盘的诸多 bug,新增了更多功能。其中包括优化 Waline 的使用,在这里记录下来以供他人参考。

这里我使用的是 Hugo 以及 stack 主题,使用其他方式的可以更多的参考 waline 的官方文档。

迁移到最新版本 Waline

客户端

由于 stack 模板中所接入的 waline 版本为 V2,或者像我一样从更远古的版本就开始魔改的话引入的是 V1,因此这里我们先来迁移到 V3 版本。

直接按照官方文档中的引入方式修改代码即可,这里贴上我将 stack 模板修改后的代码。

layouts\partials\comments\provider\waline.html

<link rel="stylesheet" href="https://unpkg.com/@waline/client@v3/dist/waline.css"/>
<div id="waline" class="waline-container"></div>
<style>
    .waline-container {
        background-color: var(--card-background);
        border-radius: var(--card-border-radius);
        box-shadow: var(--shadow-l1);
        padding: var(--card-padding);
        --waline-font-size: var(--article-font-size);
    }
    .waline-container .wl-count {
        color: var(--card-text-color-main);
    }
</style>

{{- $showReaction := (default true .Params.reaction) -}}
{{- with .Site.Params.comments.waline -}}
{{- $config := dict "el" "#waline" "dark" `html[data-scheme="dark"]` -}}
{{- $replaceKeys := dict "serverurl" "serverURL" "requiredmeta" "requiredMeta" "wordlimit" "wordLimit" "pagesize" "pageSize" "imageuploader" "imageUploader" "texrenderer" "texRenderer" "commentsorting" "commentSorting" "recaptchav3key" "recaptchaV3Key" "turnstilekey" "turnstileKey" -}}
{{- $replaceLocaleKeys := dict "reactiontitle" "reactionTitle" "gifsearchplaceholder" "gifSearchPlaceholder" "nickerror" "nickError" "mailerror" "mailError" "wordhint" "wordHint" "cancellike" "cancelLike" "cancelreply" "cancelReply" "uploadimage" "uploadImage" -}}

{{- range $key, $val := . -}}
    {{- if ne $val nil -}}  
        {{- $replaceKey := index $replaceKeys $key -}}
        {{- $k := default $key $replaceKey -}}

        {{- if eq $k "locale" -}}
            {{- $locale := dict -}}
            {{- range $lkey, $lval := $val -}}
                {{- if ne $lval nil -}}  
                    {{- $replaceLKey := index $replaceLocaleKeys $lkey -}}
                    {{- $lk := default $lkey $replaceLKey -}}

                    {{- $locale = merge $locale (dict $lk $lval) -}}
                {{- end -}}
            {{- end -}}
            {{- $config = merge $config (dict $k $locale) -}}
        {{- else if eq $k "reaction" -}}
            {{- $config = merge $config (dict $k (cond $showReaction $val false)) -}}
        {{- else -}}
            {{- $config = merge $config (dict $k $val) -}}
        {{- end -}}
    {{- end -}}
{{- end -}}

<script type="module">
    import { init } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';
    init({{ $config | jsonify | safeJS }});
</script>
{{- end -}}

这里我使用的 VSCode 虽然安装了 Hugo Language and Syntax Support 插件,但依旧无法正确判断 Hugo 语言语法,倒数第三行会报错,只要能正常运行即可。

另外,除了引入 V3 以外,这里也包括了 locale 大小写的修复,后文会提到,以及在 FrontMatter 中新增了一个自定义属性 reaction,用以开关文章反应,默认为 true

刷新网页,如果发现评论系统右下角变成了 Powered by Waline v3.3.0 就说明升级成功了。

如果你曾经已经接入 Waline 的更多功能例如统计,那么你可能需要注意按照官方的迁移指南修改你的代码。

服务端

由于数据库与服务端分开部署,所以升级服务端理所当然无需担心会丢失数据。

在管理端 UI 界面最上方可以看到当前最新版本为 @waline/vercel@1.32.0

官方给的方式是将自己的 waline github 库中的 package.json 中的 @waline/vercel 版本修改为最新的即可。当然理论上来说,我们这里用的是 latest,直接在 Vercel 控制台中重部署即可。

我这里版本差的有点多,所以选择将自己的库 pull 下来,然后替换成官方的 waline/example at main · walinejs/waline · GitHub 再 push 回去。

接着回到 Vercel 控制台,看到已经重新部署了,打开管理端也可以看到上方不再显示版本更新提示。

关于 Vercel 墙内 Dns 污染

这里顺带一提,污染会导致墙内无法访问,进而墙内无法加载 Waline。

解决方法:自定义域名,并且 CNAME 换成 cname-china.vercel-dns.com

本身访问速度已经较快了,建议关掉自定义域名 Cloudflare 代理,不然会出现 Cloudflare 的代理 ip 地址。

配置邮件提醒

本步骤需要修改较多的环境变量,你可以在这里查看相关的服务端环境变量配置的详细信息:服务端环境变量 | Waline

配置 Gmail 邮箱

首先需要对谷歌邮箱账号进行一些设置。

在邮箱设置的转发和 POP/IMAP 中启用 IMAP。

启用 IMAP
启用 IMAP

然后在这里生成谷歌账号的应用专用密码,复制下来一会用。

随后按照官方指南 评论通知 | Waline 配置 Vercel 上的环境变量即可:

  • SMTP_SERVICE:填 Gmail

  • SMTP_USER:填谷歌邮箱

  • SMTP_PASS:填刚刚获取的应用专用密码,有 16 位,记得删除空格

  • SITE_NAME:填博客的名字

  • SITE_URL:要带 https://,不带最后一个斜杠,例如 https://blog.reincarnatey.net

  • AUTHOR_EMAIL:填自己常用的邮箱,用来接受评论通知

套上自己的 Cloudflare 邮箱

当然直接用谷歌邮箱发还是过于粗糙,这里希望再套上自己的 Cloudflare 邮箱实现更好的效果。这里的操作就类似于创建 Cloudflare 邮箱然后绑定到谷歌邮箱的别名上,详细可以在网络上搜索相关博客,这里只简单记录一下步骤。

  1. 在 Cloudflare 电子邮件路由设置中创建邮箱地址,需要这一步是因为待会要收一个验证邮件(当然可以像我一样设置 Catch-All 就不用这一步)

  2. 谷歌账号需要开启一些设置(例如开启双重验证)

  3. 像刚刚一样再创建一个应用专用密码

  4. 在谷歌邮箱账号设置中在账号与导入页面选择添加其他电子邮件地址

    1. 第一步名称和电子邮件地址填写你要导入的名称和电子邮件地址,例如 失迹の博客noreply@reincarnatey.net,勾选作为别名

    2. SMTP服务器:填 smtp.gmail.com

    3. 用户名:填你的谷歌邮箱

    4. 密码:填刚刚获取的应用专用密码,记得删空格

  5. 别名电子邮件会收到一封邮件,完成验证

  6. 添加 Vercel 的环境变量为新的邮箱信息,与在谷歌那边填的一致即可

    1. SENDER_NAME:自定义发件人名字,如 失迹の博客

    2. SENDER_EMAIL:自定义发件地址,如 noreply@reincarnatey.net

这样就完成别名的设置了,如果要精致一点还可以为这个邮箱设置一个 gravatar。

我们发送一个回复,可以看到收到的邮件的发件人信息已经设置好了。

评论提醒邮件
评论提醒邮件

使用模板样式

这里我使用的模板修改自 SaraKale’s blog,非常感谢。

效果展示:

访客评论被回复收到的
访客评论被回复收到的
站长收到的
站长收到的

  • MAIL_SUBJECT{{parent.nick | safe}},您在 『{{site.name | safe}}』 上的评论收到了回复

  • MAIL_TEMPLATE

    <div
        style="background: url(https://tva3.sinaimg.cn/large/c56b8822ly1h62npb7s1ej201y01y0lh.jpg);padding:40px 0px 20px;margin:0px;background-color:#FFCDCE;width:100%;">
        <style type="text/css">
            @media screen and (max-width:600px) {
    
                .afterimg,
                .beforeimg {
                    display: none !important
                }
            }
        </style>
        <div
            style="border-radius: 10px 10px 10px 10px;font-size:14px;color: #555555;width: 530px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;max-width:100%;background: ##ffffff;">
            <img class="beforeimg" style="width:530px;height:317px;z-index:-100;pointer-events:none"
                src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/before.png">
            <img src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/violet.jpg"
                style="width:100%;overflow:hidden;pointer-events:none;margin-top: -120px;">
            <div
                style="width:100%;background:#f8d1ce;color:#9d2850;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;background: url(https://tva2.sinaimg.cn/large/c56b8822ly1h61tb7tagcj20ii01u3yc.jpg) left top no-repeat;display: flex;justify-content: center;flex-direction: column;">
                <p style="font-size:16px;font-weight: bold;text-align:center;word-break:break-all;margin:0;">
                    您在<a style="text-decoration:none;color: #9d2850;" href="{{site.url}}">『{{site.name |
                        safe}}』</a>上的留言收到一条回复</p>
            </div>
            <div class="formmain"
                style="background:#fff;width:100%;max-width:800px;margin:auto auto;overflow:hidden;margin-bottom: -155px;">
                <div style="margin:40px auto;width:90%;">
                    <p>😊Hi,{{parent.nick}},您曾发表的评论:</p>
                    <div
                        style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:15px;color:#555555;">
                        {{parent.comment | safe}}</div>
                    <p><strong>{{self.nick}}</strong> 回复您:</p>
                    <div
                        style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:15px;color:#555555;">
                        {{self.comment | safe}}</div>
                    <p><a style="text-decoration:none; color:#cf5c83" href="{{site.postUrl}}" target="_blank"> 查看回复的完整內容
                        </a>,欢迎再次访问<a style="text-decoration:none; color:#cf5c83" href="{{site.url}}" target="_blank">
                            {{site.name}} </a>。
                        <hr />
                    <p style="font-size:14px;color:#b7adad;text-align:center;position: relative;z-index: 99;">
                        本邮件为系统自动发送,请勿直接回复邮件哦,可到博文内容回复。<br />{{site.url}}</p>
                    </p>
                    <img src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/line.png"
                        style="width:100%;margin:25px auto 5px auto;display:block;pointer-events:none">
                    <p class="bottomhr" style="font-size:12px;text-align:center;color:#999">© 失迹の博客</p>
                </div>
            </div>
            <img class="afterimg" style="width:535px;height:317px;z-index:100;margin-left: -3px;"
                src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/after.png">
        </div>
    </div>
    
  • MAIL_SUBJECT_ADMIN您有一条新的评论

  • MAIL_TEMPLATE_ADMIN

    <div
        style="background: url(https://tva3.sinaimg.cn/large/c56b8822ly1h62npb7s1ej201y01y0lh.jpg);padding:40px 0px 20px;margin:0px;background-color:#FFCDCE; width:100%;">
        <style type="text/css">
            @media screen and (max-width:600px) {
    
                .afterimg,
                .beforeimg {
                    display: none !important
                }
            }
        </style>
        <div
            style="border-radius: 10px 10px 10px 10px;font-size:14px;color:#555555;width: 530px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;max-width:100%;background: ##ffffff;">
            <img class="beforeimg" style="width:530px;height:317px;pointer-events:none"
                src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/before.png">
            <img src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/violet.jpg"
                style="width:100%;overflow:hidden;pointer-events:none;margin-top: -120px;">
            <div
                style="width:100%;background:#f8d1ce;color:#9d2850;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;background: url(https://tva2.sinaimg.cn/large/c56b8822ly1h61tb7tagcj20ii01u3yc.jpg) left top no-repeat;display: flex;justify-content: center;flex-direction: column;">
                <p style="font-size:16px;font-weight: bold;text-align:center;word-break:break-all;margin:0;">
                    您在 <a style="text-decoration:none;color:#9d2850;" href="{{site.url}}" target="_blank">{{site.name}}</a>
                    上的文章有了新的评论</p>
            </div>
            <div class="formmain"
                style="background:#fff;width:100%;max-width:800px;margin:auto auto;overflow:hidden;margin-bottom:-155px;z-index:100;">
                <div style="margin:40px auto;width:90%;">
                    <p><strong>{{self.nick}}</strong> 发表了评论:</p>
                    <div
                        style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:15px;color:#555555;">
                        {{self.comment | safe}}</div>
                    <p style="text-align:center;position: relative;z-index: 99;"><a
                            style="text-decoration:none;color:#cf5c83" href="{{site.postUrl}}" target="_blank">查看回复的完整內容</a>
                    </p>
                    <img src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/line.png"
                        style="width:100%;margin:25px auto 5px auto;display:block;pointer-events:none">
                    <p class="bottomhr" style="font-size:12px;text-align:center;color:#999">© 失迹の博客</p>
                </div>
            </div>
            <img class="afterimg" style="width:535px;height:317px;margin-left:-3px;"
                src="https://npm.elemecdn.com/hexo-butterfly-envelope/lib/after.png">
        </div>
    </div>
    

直接在 Vercel 设置环境变量即可,大胆复制进去。注意如果选择压行的话会丢掉一部分空格,需要手动补上否则不美观。

更多的 Waline 客户端配置

可以在官方文档 组件属性 | Waline 中查看。

放上这里我的配置:

waline:
    serverURL: https://waline.reincarnatey.net/
    lang: zh-CN
    search: false
    pageview: true
    comment: true
    emoji:
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bmoji
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/weibo
    reaction:
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili/bb_heart_eyes.png
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili/bb_thumbsup.png
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili/bb_zhoumei.png
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili/bb_grievance.png
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili/bb_dizzy_face.png
        - https://npm.elemecdn.com/@waline/emojis@1.1.0/bilibili/bb_slap.png
    requiredMeta:
        - nick
    locale:
        admin: 站长
        sofa: 还没有人评论哦!快来抢沙发吧~
        placeholder: 欢迎留下宝贵的评论!请留下正确的邮箱以便有回复时进行邮箱提醒,请勿发布任何与本文章无关的内容。
        reactionTitle: 这篇文章对你有帮助吗?
        reaction0: 非常有用
        reaction1: 有帮助
        reaction2: 一般
        reaction3: 无帮助
        reaction4: 看不懂
        reaction5: 有错误

需要注意的是由于 yaml 读取为统一小写,而 Waline 的配置又大小写敏感,所以需要专门的步骤将大小写转换。

我在前文提供的 layouts\partials\comments\provider\waline.html 已包含了基本配置以及 locale 配置的大小写修复,其他配置同理。同时也包含新增了一个文章 FrontMatter 属性用以控制是否显示文章反应:reaction: true

接入浏览量与评论数统计

文章页

config.yamlwaline 配置中将 pageviewcomment 都设置为 true

并且修改 layouts\partials\article\components\details.html,将末尾的 <footer> 中的内容修改为:

<footer class="article-time">
    {{ if not .Date.IsZero }}
        <div>
            {{ partial "helper/icon" "date" }}
            <time class="article-time--published">
                {{- .Date.Format (or .Site.Params.dateFormat.published "Jan 02, 2006") -}}
            </time>
        </div>
    {{ end }}

    {{ if .Site.Params.article.readingTime }}
        <div>
            {{ partial "helper/icon" "clock" }}
            <time class="article-words">
                {{ $fixedWordCount := add .WordCount 224}}
                约{{ div $fixedWordCount 225 }}分钟,共{{ .WordCount }}字
            </time>
        </div>
    {{ end }}

    <div>
        {{ partial "helper/icon" "view" }}
        <time class="article-pageview">
            <span class="waline-pageview-count" data-path="{{.RelPermalink}}">0</span> 次浏览
        </time>
    </div>

    <div>
        {{ partial "helper/icon" "comment" }}
        <time class="article-comment">
            <span class="waline-comment-count" data-path="{{.RelPermalink}}">0</span> 条评论
        </time>
    </div>
</footer>

另外虽然有提供 .ReadingTime 变量以供估算阅读时长,但官方设置的速度或许是基于英文的,个人感觉误差较大。所以这里根据网络上的数据,成人每分钟阅读约 200-250 字进行向上取整估算。

至于图标,按照这里所使用的方式下载对应的图标 view.svgcomment.svg,并修改成适配暗黑模式后,扔到 \assets\icons 下即可。

由于文章页会直接引入完整的 Waline,所以不需要额外的引入了。可以看到在文章页面已经可以正常显示修改的内容了。

显示浏览量与评论数
显示浏览量与评论数

页脚

这里希望在所有页面的页脚展示主页的浏览量。

由于除了文章以外的页面不会引入浏览量统计,所以这里需要额外引入,在 layouts\partials\footer\footer.html<footer> 内添加:

<script type="module">
  import { pageviewCount } from 'https://unpkg.com/@waline/client@v3/dist/pageview.js';

  pageviewCount({
    serverURL: "{{.Site.Params.comments.waline.serverURL}}"
  });
</script>

然后在页脚相关代码中,你需要展示的地方添加上显示的 span 即可,例如在某个地方添加:

共 <span class="waline-pageview-count" data-path="/">0</span> 次浏览

可以看到各页面都可以成功显示首页浏览量,同时这里悄悄解决了首页中浏览量显示的问题。

首页浏览量
首页浏览量

这里也可以测试,首页浏览量:0

首页浏览量:<span class="waline-pageview-count" data-path="/">0</span>

首页

由于首页不开启评论功能,而页脚中只引入了浏览量统计,所以首页文章列表中显示不了评论数。我们希望能够显示出文章列表中各文章的评论数,需要额外的方式进行引入。

layouts\index.html</section> 后面加上:

<script type="module">
    import { commentCount } from 'https://unpkg.com/@waline/client@v3/dist/comment.js';

    commentCount({
        serverURL: "{{.Site.Params.comments.waline.serverURL}}"
    });
</script>

可以看到主页文章列表中,浏览量与回复数统计数据已经正常填充。

接入最新评论挂件

组件效果(自定义样式)
组件效果(自定义样式)

可以在 客户端 API | Waline 页面查看这个挂件的 API。

这里我们以侧边栏组件的形式引入这个挂件,并设计成只有首页会出现。

assets\scss\partials\widgets.scss 的最下方添加:

/* Recent Comment widget */
.widget.recentComment {
    .recent-comment-list {
        border-radius: var(--card-border-radius);
        box-shadow: var(--shadow-l1);
        background-color: var(--card-background);
    }

    .recent-comment-list-item {
        display: flex;
        padding: 0 1.25em;
        align-items: center;

        &:not(:last-of-type) {
            border-bottom: 1.4px solid var(--card-separator-color);
        }
    }

    .recent-comment-card {
        flex: 1;
        width: 0;
        padding: 20px 10px !important;

        p {
            font-size: .8em;
            margin-top: 3px;
            margin-bottom: 0px;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
            color: var(--card-text-color-secondary);
        }
    }

    .recent-comment-avatar {
        width: 3rem;
        border-radius: 50%;
    }

    .recent-comment-nick {
        font-size: .875em;
        color: var(--card-text-color-main);
    }

    .recent-comment-time {
        font-size: .75em;
        color: var(--card-text-color-tertiary);
    }

    .vemoji,
    .wl-emoji {
        height: 1.25em;
        margin: -0.2em .1em;
    }
}

创建文件 layouts\partials\widget\recent-comment.html

{{ if .IsHome }}
<section class="widget recentComment" hidden>
    <div class="widget-icon">
        {{ partial "helper/icon" "comment" }}
    </div>
    <h2 class="widget-title section-title">最新评论</h2>

    <div class="recent-comment-list"></div>
</section>

<script type="module">
    import { RecentComments } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';

    RecentComments({
        serverURL: "{{.Site.Params.comments.waline.serverURL}}",
        count: 5,
    }).then((comments) => {
        if (comments.comments.data.length) {
            document.getElementsByClassName('recentComment')[0].removeAttribute("hidden");
            document.getElementsByClassName('recent-comment-list')[0].innerHTML = comments.comments.data.map((comment) =>
                `<a class="recent-comment-list-item" href="${comment.url}" target="_blank">
                    <img class="recent-comment-avatar" src="${comment.avatar}"/>
                    <div class="recent-comment-card">
                        <div>
                            <span class="recent-comment-nick">${comment.nick}</span>
                            <span class="recent-comment-time">${new Date(comment.time).toISOString().split('T')[0]}</span>
                        </div>
                        <p>${comment.comment.replaceAll("<br>", " ").replaceAll("\n", " ").replace(/<\/?a.*?>/g, "")}</p>
                    </div>
                </a>`
            ).join('');
        }
    });
</script>
{{ end }}

当然我们还需要在 config.yaml 中开启这个组件:

params:
    widgets:
        enabled:
            - recent-comment # 加上这一条

最外面那一个 if 就是用来限制只在首页出现的。这里设定成获取到数据后再显示,以及将评论内容中的链接全部去掉了,设定成展示最近的 5 条评论。

由于官方样式令人堪忧,所以这里是获取数据后自定义。关于 comment 的属性,可以在 API | Waline 中查看关于 BaseWalineResponseComment 的接口,这里简单介绍几个比较有用的:

属性 类型 含义 说明
avatar string 头像链接
comment string 评论内容 渲染成 html 后的
like number 评论喜欢数
link string 用户地址 用户自己填写的,不建议用,避免出现乱七八糟的 backlink 和影响 SEO
nick string 用户昵称 用户自己填写的
orig string 原始评论
time number 评论时间 时间戳,单位毫秒
url string 原文章地址

当然,这里没有考虑到国际化的需求以及更多的可扩展性,欢迎有想法的朋友实现更高拓展性和更美观的侧边栏组件。

后续计划再更新一次,添加显示评论所在的原文章,会在之后关于侧边栏的文章中再次提及。

除此之外 Waline 还有一个 UserList 挂件,我这里并不需要,要接入的话也是类似的。

结语

至此,我们已经捣鼓完了 Waline 大部分功能。你可以在官方手册中了解到更多的配置项以及我未提及的插件系统。

很遗憾此前我曾对模板进行过一次较大的改动,实现了例如独立出来的 Solutions 题解区以及 Algorithms 算法标签等,由于过于久远已经不记得调整内容无法写成文章,同时也因为放弃了拓展性的修改,无法合适地将我修改过后的主题开源。

当然,对博客主题的改造还远不止于此。后续的改造我也会保持记录,并发布文章,欢迎在评论区插眼或是订阅 RSS 以便关注后续更新。

有不足之处请见谅,有错误欢迎指正,也欢迎大家交换友链或是在评论区玩耍~

附录

参考文献

  1. Walin 官网
  2. 使用Waline给Hexo静态博客添加评论系统 | Quantum Bit
  3. 评论插件 Waline 之邮件通知配置 | Oragekk’s Blog
  4. Gmail发送邮件的配置方法_gmail smtp-CSDN博客
  5. waline邮件通知模板样式一览 | SaraKale’s blog
  6. 函数 | Hugo官方文档

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 学习笔记 | OneIndex 伪静态配置以及迁移到 PHP8.2
    伪静态配置 不知道你是否存在该问题:开启伪静态后,访问文件时若目录或文件名带有空格则无法浏览和下载。 如果我们手动加上 /?/ 则可以正确访问,那么显然这是伪静态的锅。然而以我的正则水平完全看不出我的伪静态为何有问题,遂求助网络,发现只有这篇博文中提供的伪静态文件可以解决以上问题: AddDefaultCharset utf-8 Options +FollowSymLinks IndexIgnore */* RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # otherwise forward it to index.php RewriteRule . index.php 很神奇,以我的正则水平实在看不懂为何这是有效的,但正所谓能跑就行。 迁移到 PHP8.2 最近我的盘又出问题了,发现输出了一堆错误,所以这里总结了一下自从升级到 PHP8.2 后遇到
     

学习笔记 | OneIndex 伪静态配置以及迁移到 PHP8.2

2024年7月18日 23:59

伪静态配置

不知道你是否存在该问题:开启伪静态后,访问文件时若目录或文件名带有空格则无法浏览和下载。

如果我们手动加上 /?/ 则可以正确访问,那么显然这是伪静态的锅。然而以我的正则水平完全看不出我的伪静态为何有问题,遂求助网络,发现只有这篇博文中提供的伪静态文件可以解决以上问题:

AddDefaultCharset utf-8

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

很神奇,以我的正则水平实在看不懂为何这是有效的,但正所谓能跑就行。

迁移到 PHP8.2

最近我的盘又出问题了,发现输出了一堆错误,所以这里总结了一下自从升级到 PHP8.2 后遇到的错误时能参考的博客:

  1. 踩坑记录 | OneIndex 首页出现 HTTP ERROR 500

  2. (转载)PHP 8.0 部分错误的解决办法 - 无主界 (Deprecated: Required parameter $xxx follows optional parameter $yyy )

  3. PHP8中使用$_POST或者$_GET出现Undefined array key “xx“

总而言之,不需要改动过多代码,只需要在报错的地方删除或者加上一些 isset 即可。但尤其需要注意部分 ifisset 的逻辑,避免产生漏洞。

附录

参考文献

  1. 搭建oneindex作为外链/图床 - moluuser’s Blog

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 踩坑记录 | Windows 下 PHP 开启 curl 扩展
    前言 相信各位一定搜到过许多方法,什么移动到 Win32 、修改 apache 加载、手动安装 curl 什么的。 由于我并非专业后端开发,只是想跑一跑代码,因此并没有安装 apache,这时候如何为 PHP 开启 curl 拓展呢。 开启方法 首先修改 php.ini,将 extension=curl 前面的分号去掉。 但是在 cmd 中输入 php -i 还是看不到开启了 curl 扩展,运行代码还会有以下报错信息: Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: C:\php\ext\curl (找不到指定的模块。), C:\php\ext\php_curl.dll (找不到指定的模块。)) in Unknown on line 0 注意到报错信息里的拓展位置不对,我这里 PHP 根目录明明是在 D:\PHP8.2,因而找到解决办法。 修改 php.ini 的这一条配置: extension_dir = "D:\PHP8.2\ext" 再次查看 phpinfo,可以看到成功开启 curl 拓展
     

踩坑记录 | Windows 下 PHP 开启 curl 扩展

2024年7月18日 21:06

前言

相信各位一定搜到过许多方法,什么移动到 Win32 、修改 apache 加载、手动安装 curl 什么的。

由于我并非专业后端开发,只是想跑一跑代码,因此并没有安装 apache,这时候如何为 PHP 开启 curl 拓展呢。

开启方法

首先修改 php.ini,将 extension=curl 前面的分号去掉。

但是在 cmd 中输入 php -i 还是看不到开启了 curl 扩展,运行代码还会有以下报错信息:

Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: C:\php\ext\curl (找不到指定的模块。), C:\php\ext\php_curl.dll (找不到指定的模块。)) in Unknown on line 0

注意到报错信息里的拓展位置不对,我这里 PHP 根目录明明是在 D:\PHP8.2,因而找到解决办法。

修改 php.ini 的这一条配置:

extension_dir = "D:\PHP8.2\ext"

再次查看 phpinfo,可以看到成功开启 curl 拓展,正常运行。

附录

参考文献

网上搜了一堆,甚至问过 Copilot,没一个有用的。

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 学习笔记 | QQNT 聊天记录导出
    前言 不管是出于希望将聊天记录保存到本地,还是需要导出和将聊天记录用于语言模型训练等用途,都需要导出 QQ 聊天记录这一步。 近期发现 QQNT 也存在导出聊天记录的方法,遂进行尝试和记录,感谢各位前辈的探索和作出的贡献。 环境及准备工作 我的环境是 Windows10,QQNT 9.9.11-24568,Python 3.10.6。 需要任意一款反编译软件,以及用于查看数据库的 DB Browser for SQLite(安装包来自网络,可从参考文献第一条中获取链接)。 操作的所有文件建议在操作前进行备份。 逆向获取数据库密码 由于本人不会逆向,是按照参考文献第一条中的记录进行操作,故在此不重复记录。 需要注意的是附加到的进程是从上往下的第一个,与参考博客中的描述并不一致,也许不同设备会有不同。如果进程选择正确,在附加后需要一定时间加载切过程中有弹出窗口,并在 F9 继续运行之前无法使用 QQ,并在登录后触发断点。如果进程选择错误则以上会有不同,关掉 QQ 重新附加即可。 从数据库中导出数据 依旧按照参考文献第一条中的记录进行操作,不重复记录。 其中 nt_msg.header.tx
     

学习笔记 | QQNT 聊天记录导出

2024年7月7日 18:20

前言

不管是出于希望将聊天记录保存到本地,还是需要导出和将聊天记录用于语言模型训练等用途,都需要导出 QQ 聊天记录这一步。

近期发现 QQNT 也存在导出聊天记录的方法,遂进行尝试和记录,感谢各位前辈的探索和作出的贡献。

环境及准备工作

我的环境是 Windows10,QQNT 9.9.11-24568,Python 3.10.6。

需要任意一款反编译软件,以及用于查看数据库的 DB Browser for SQLite(安装包来自网络,可从参考文献第一条中获取链接)。

操作的所有文件建议在操作前进行备份。

逆向获取数据库密码

由于本人不会逆向,是按照参考文献第一条中的记录进行操作,故在此不重复记录。

需要注意的是附加到的进程是从上往下的第一个,与参考博客中的描述并不一致,也许不同设备会有不同。如果进程选择正确,在附加后需要一定时间加载切过程中有弹出窗口,并在 F9 继续运行之前无法使用 QQ,并在登录后触发断点。如果进程选择错误则以上会有不同,关掉 QQ 重新附加即可。

从数据库中导出数据

依旧按照参考文献第一条中的记录进行操作,不重复记录。

其中 nt_msg.header.txt 使用文本编辑器打开后可以在文件开头看到 SQLite header 3 以及 QQ_NT DBHMAC_SHA1 等字样。亲测使用笔记本打开会显示乱码,而使用 VS Code 打开没有问题。

在 DB Browser for SQLite 中,打开菜单->工具->设置加密,不输入密码直接点击 OK 以解除数据库加密。

以私聊数据表 c2c_msg_table 为例,这里介绍一部分关键数据。

列名 类型 含义 说明
40050 int 发送时间 单位为秒的时间戳
40058 int 发送时间 单位为秒的时间戳,精确到天
40030 int 私聊对象 对方 QQ 号(无论是对方还是自己发送的消息)
40033 int 消息发送者 发送者的 QQ 号
40093 str 消息发送者 QQ 昵称或是备注名
40800 protobuf 消息内容 格式较为复杂,可使用 CyberChef 工具进行解析

关于 40800 的解析,由于较复杂所以不展开。

至此,已可以使用 sql 命令或编写程序导出数据。

附录

参考文献

  1. GitHub - mobyw/GroupChatAnnualReport: 使用 QQNT Windows 聊天记录制作群聊年度报告!

  2. GitHub - Mythologyli/qq-nt-db: QQ NT Windows 数据库解密+图片/文件清理

  3. GitHub - QQBackup/qq-win-db-key: 全平台 QQ 聊天数据库解密

  4. 解析 NTQQ 数据库 | 冷月的博客

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 随笔杂谈 | CEIC2024 游记
    初赛 题目太面向对象了,打了一坨。 复赛 复赛题面就是一坨,题也是一坨,打了一坨。 你说得对,A 题是小学奥数题,但是我已经是高中生了,所以卡了半个多小时才想出来样例二。没想出来的时候写了个 dfs 验证一下,想出来之后感觉不会写索性就先交 dfs 后面再回来推逻辑了。但是没给数据范围,什么情况。 开 B,一眼 next_permutation 暴力,仔细算了算复杂度发现暴力变成正解了,随便写写就过掉了。 开 C,读题目挺简单的,一看样例发现看不懂,这和题目说的是一道题吗?遂不可以总司令跳过。 开 D,前面一堆废话,其实最后一句话就把题目说完了。刚准备开敲快速幂,一琢磨数据规模发现原来是高精度,遂转 py 打表。写了个 py 计算答案,再写了个 cpp 用快读的方式读入答案并把长度与前一百位打成表,于是本题 $O(1)$。然而悲催的是由于开题比较晚所以打表比较晚,数据范围是三万但是我 py 跑到一万九就差不多速度很慢了,然后我抽了一不小心关掉了输出没保存,于是重跑打表,只来得及跑到三千,遂只打了三千的表,亏爆。 赛后发现 B 题原来给的那个数字就是 $n$,服了,没说清楚,而且经同学暴
     

随笔杂谈 | CEIC2024 游记

2024年7月7日 17:25

初赛

题目太面向对象了,打了一坨。

复赛

复赛题面就是一坨,题也是一坨,打了一坨。

你说得对,A 题是小学奥数题,但是我已经是高中生了,所以卡了半个多小时才想出来样例二。没想出来的时候写了个 dfs 验证一下,想出来之后感觉不会写索性就先交 dfs 后面再回来推逻辑了。但是没给数据范围,什么情况。

开 B,一眼 next_permutation 暴力,仔细算了算复杂度发现暴力变成正解了,随便写写就过掉了。

开 C,读题目挺简单的,一看样例发现看不懂,这和题目说的是一道题吗?遂不可以总司令跳过。

开 D,前面一堆废话,其实最后一句话就把题目说完了。刚准备开敲快速幂,一琢磨数据规模发现原来是高精度,遂转 py 打表。写了个 py 计算答案,再写了个 cpp 用快读的方式读入答案并把长度与前一百位打成表,于是本题 $O(1)$。然而悲催的是由于开题比较晚所以打表比较晚,数据范围是三万但是我 py 跑到一万九就差不多速度很慢了,然后我抽了一不小心关掉了输出没保存,于是重跑打表,只来得及跑到三千,遂只打了三千的表,亏爆。

赛后发现 B 题原来给的那个数字就是 $n$,服了,没说清楚,而且经同学暴力检验发现只要 $n\gt3$ 那么答案就只有 $4$ 和 $9$,$n\le3$ 就输出 $0$,不可以总司令在本题输给了输出样例。

唯一值得夸奖的比赛体验就是居家比赛,自家电脑上的 IDE 随便用。

结果:66 分(换算成 400 分制就是 264 分),喜提一等。

决赛

前言

8 月 2 号的时候想看证书发现晋级了,啊?思考了一会要不要去,毕竟又远又耽误课还不报销。

没想到就我这么烂的成绩也能进决赛,感慨。虽然深圳到乌镇有点远,但毕竟是全国的,难得有机会,所以还是报名了,也顺便去杭州和乌镇玩一玩。

关于旅游的部分,在这篇文章可以看到一些记录以及照片,本文章只记录有关比赛的内容。

游记

day -2

中午从宝安机场起飞,下午到萧山机场。然后坐了两个小时车到乌镇,等到了民宿之后已经是晚上了,所以在附近吃了个饭,然后在附近逛了逛,今天就结束了。

其实原定是一早起飞,然后下午到了还能去签到的,但临时有事所以改到中午了。

day -1

签到。

但由于原定昨天签到改成了今天,忘了签到地点有不同,因此一开始走错了地,看到那边大场馆已经在比赛了,还以为我们这项也是像 NOI 一样一大群人在大场馆比。

签到时使用的是二维码,然后发了一个包,包里有手册、比赛衣服以及参赛证之类的,除了手册以外都有纪念意义,还是很不错的。听负责签到的人说参赛时要穿着衣服然后带参赛证。

顺带一提,由于来这边比赛的人特别特别多,而且由于大部分赛项都是面向小学生初中生的因此还会拖家带口,所以基本到哪都能看见来参加比赛的人,甚至周边的出租车司机和店家之类的全都知道比赛的事情,很神奇。

day 0

当天下午稍晚一点到了考场,距离检录结束还有十多分钟。

跟随现场志愿者前往考场,中途差点进到初中组考场,后续爬了四楼到了高中组考场。进考场发现居然只有二十个人左右,并且我是最后一个进考场的,大概是跑远路参加决赛的不多。

赛前

随便找了一个座位坐下,发现其他选手已经开始敲键盘。显示屏极其古老,是很旧的方形的那种。印象中系统貌似装的是 win10,键盘还行。

需要打开官网登录账号,遂登录,输了很多遍密码都登录失败,诧异,遂打开记事本输入好后粘贴入框,发现这个机子的键盘绑键是错位的,我按 W 会打出来 Q,按 T 会打出来 R,但数字键盘是正常的,因此输入手机号时没有发现,但密码输入框是隐藏的,因此输入密码里的字母时就错了。

诧异,遂换机位,发现这一台的键盘莫得 F12,诧异,遂换机位,成功登录。

由于不是 NOI 系列比赛,不知道文件夹规则,因此没办法提前建好文件。编译器貌似只有比较经典的 dev cpp 和 vim 那些的,因此启动 dev cpp,还是英文版的,调了一些设置,然后敲了文件缺省,等开赛。

赛时

提前五分钟告知了比赛密码,在官网进入比赛并下载试卷。读题。

A 题读完之后第一个联想到的是 K Smallest Sums,虽然实际上关联不大,但也因此马上想到了一个重要性质,给出的最小的数字一定是由最小的两个加来的,因此这里可以作为一个枚举点,确定好前两个数之后就可以根据给出的第二小的数直接确定第三个数,然后一直递推下去,有多种可能只需要搜索一下。

此时认为会做 A,于是接着读 B,读完就会了。建一个表达式树然后 dp 一下即可,极其简单。成功切题,美滋滋。遂读 C,发现见过原题,但那道原题我不会做,悲。

此时比赛正式开始,两个小时敲两个会的题和两道暴力应该问题不大吧?

问题大得很。开始写之后才发现 A 的搜索难写的离谱。想不出来如何实现,然后浪费了一个小时。没错,比赛一半的时间完完全全浪费掉了。但是 A 题还是要写的,后面又花了半小时写了降一档的 next_permutation 暴力。

还剩半个小时,本来以为 B 已经会了还是能打的出来的,但很快发现了新问题:嘶,表达式树怎么建来着?哈哈,完蛋。想了整整二十分钟,只记得和笛卡尔树差不多,要用到栈什么的,半天写不出来。

还剩不到十分钟的时候放弃,输出样例了。然后 C 写了个 map 暴力,结果样例过不去,试着调暴力也没调出来,不理解,最后改成了 set 但是没测样例。D 输出样例。

最后一分钟极速删无关文件打包改文件名然后回官网提交,巨惊险,出现提交成功的页面的时候发现时钟已经 40 分,刷新一下就显示比赛结束了。

赛后

出考场之后,天很快就黑了。

比赛当晚的天空
比赛当晚的天空

进来时来不及拍照留念,出来的时候拍了许多。然后有一位老师一直在关心“孩子都出来没有”“找到家长了没有”哈哈哈。

对自己的表现不太满意,完全没有任何发挥,甚至都不确定代码有没有提交上去。

虽然是不太重要的比赛,但毕竟全国级的赛事只打出了这样的水平,还是很丢人的。

后日谈

当天晚上在酒店通过在官网上抓包,从一些请求的返回数据里面看到了自己提交的文件信息,这才确认代码成功卡着时间提交上去了,惊险,看来至少没有爆零。

以及查到了 C 的原题是可见的点,原来正解是欧拉筛求欧拉函数,幽默数论,不会。

毕竟第二天就是闭幕式和颁奖,所以理所当然第二天就出分了,具体分数很难看就不说了,总之打了一个 3=,突然有种打铜不如打铁的意味了,但丢人归丢人,但比起比赛其实这次体验更多的是出远门玩了好久,比赛带给我的遗憾情绪连那天晚上都没撑到就无影无踪了。

不过,接下来的时间会越来越快,越来越不够用,自然是不允许我再这样玩了,这篇游记也是我半周里每天的空隙敲出来的。不过我并没有感到遗憾,毕竟我一直对高考之后的事情有所期待。

我相信时机到了的时候,自然而然就该来到该有的状态,就像这篇文章就该于此停笔。

附录

参考文献

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 随笔杂谈 | YIIC2024 游记
    前言 实际上已经半 AFO 三个月了,再来参加这场比赛也没什么好说的,尽力而为吧,也无需过于在意。 这段时间洛谷上做题寥寥无几,只有偶尔会出一些题,比方说给学校高一集训出题和组题,或是给区里的竞赛(貌似是给初中生考的?)供题。 更多的还是回到 whk 上了。 初赛 初赛还是比较简单的,就不细讲了,补全代码都很好懂,不过阅读题有一篇只看出来树上背包,不知道合并的什么玩意儿,另外单选貌似也有选错的。 最后出分虽然是机房第一,但还是比我预想的八九十分要低一点点。另外这次高一学弟也晋级了三个,也有几个差了一点点,相比往年我们学校的情况感觉好多,但相比这届竞赛班人数又感觉有点少。 喜提一个市1=,虽然感觉作用不大。 复赛 总的来说,抛开题目不看,这次复赛是所有比赛中最舒服的一次。不管是比赛场地、设备、比赛系统、IDE、赛时安排之类的,都是体验最好的一次。 day -3 整理了一下官网给出的考试范围和对应的模版题。居然有网络流?而且复杂树和复杂图论里面也不知道有什么…数据结构也没说清楚。 这一天光整理题单去了,好像没做题。 day -2 敲了一些图论板子,只剩下欧拉回路和联通性相关的那些没敲了。
     

随笔杂谈 | YIIC2024 游记

2024年6月16日 11:40

前言

实际上已经半 AFO 三个月了,再来参加这场比赛也没什么好说的,尽力而为吧,也无需过于在意。

这段时间洛谷上做题寥寥无几,只有偶尔会出一些题,比方说给学校高一集训出题和组题,或是给区里的竞赛(貌似是给初中生考的?)供题。

更多的还是回到 whk 上了。

初赛

初赛还是比较简单的,就不细讲了,补全代码都很好懂,不过阅读题有一篇只看出来树上背包,不知道合并的什么玩意儿,另外单选貌似也有选错的。

最后出分虽然是机房第一,但还是比我预想的八九十分要低一点点。另外这次高一学弟也晋级了三个,也有几个差了一点点,相比往年我们学校的情况感觉好多,但相比这届竞赛班人数又感觉有点少。

喜提一个市1=,虽然感觉作用不大。

复赛

总的来说,抛开题目不看,这次复赛是所有比赛中最舒服的一次。不管是比赛场地、设备、比赛系统、IDE、赛时安排之类的,都是体验最好的一次。

day -3

整理了一下官网给出的考试范围和对应的模版题。居然有网络流?而且复杂树和复杂图论里面也不知道有什么…数据结构也没说清楚。

这一天光整理题单去了,好像没做题。

day -2

敲了一些图论板子,只剩下欧拉回路和联通性相关的那些没敲了。

day -1

花了好多时间把三种联通分量和对应缩点、割点割边都重新复习和理解了一遍。也许我第一次学的时候没有理解清楚,一直有点模糊,这次终于区分清楚了。然后欧拉回路也重新理解了一遍。

发现这次重写模板题,又多了好几个优化代码减少码长的地方,学 OI 两年了技术也就这样,倒是压行和偷懒越来越会了。

网络流应该不考?不看了。数据结构还挺熟练的,不看了。字符串大纲说只考基础,不看了。

day 0

赛前

因为这天本来学校需要补高考假,所以是从学校出发。考点在广州的广技师,从深圳过去需要大概两个小时。

六点起床,大概 6:20 左右一边吃着面包一边赶到了门口。高一有两个学弟没在线请假,校门口刷脸没有开门权限,走人工通道要打电话跟教练确认,搞了有一会。高二另一位同学(之前一起打 THUPC 和省选的)不知道是起晚了还是怎么,来的有点晚,打电话催了一会。六点半多一点出发了。

洛谷运势大凶。在车上看一些骗分和防挂分的博客。

到了考场之后以为不用着急进去,上个厕所回来发现人都进去了,有人提醒我们这场比赛需要签到和登录?于是赶紧进考场了。

进来发现比赛场地环境好舒服,签完到之后找到自己座位坐下,发现比赛设备居然是笔记本电脑,而且提供的 IDE 除了常见的 devC 和 VSCode 以外居然还有小熊猫!震惊。听说要登录,不知所措,遂举手询问工作人员,原来要打开桌面某个程序登录。发现居然是 java 写的,会定时发卷和自动同步文件,我去这也太牛了。

发现周围的同学可以动电脑,遂启动小熊猫开始配置,调了一下编译选项和缺省模版之类的。在桌面上发现了样例文件夹,打开来看了一眼,发现输入都好少,而且看起来没有图论和数据结构题,啊?

看大屏幕系统终端发现有同学已经同步了四题的 cpp,于是我也先把样例复制到考试文件夹,然后把四题的源代码文件和文操先弄好了。

赛时

开考前一分钟发现已经发卷了,遂打开看题面。

啊?七选五…我开的是英语卷子?

看了一会发现这不就是错排列 plus,应该可以一样的去推,遂推柿子。桌面空间有点小,草稿纸写起来不舒服,以及只给了一个小样例,离谱。

按错排列的思路推了半天发现行不通,因为递推到 $n+1$ 的时候不知道对应正确答案是否被前面选过,好像加一个状态也不行,加限制也不太行。

没什么思路,跑去看一眼其他题…发现都好难的样子,然后火速回来。推了一个 $O(n^2)$ 的式子,感觉没问题,把里面的组合数展开然后消了一下阶乘,发现如果换一个主元的话就可以把分母提出来,这样只需要算一次逆元,遂推推推。

1h 过去,推到后面想出了一个基于错排列的 $O(n)$ 式子,刚写一部分就发现不对,然后再回去看原来的式子发现也不对。遂难绷,1.5h 打完暴力,测了几个错排列的样例没问题就过了。

开 B,一开始感觉要拆位后面发现不太对。想了一会之后认定操作二是没用的,因为或运算只会把 $0$ 变成 $1$,而与运算需要的是 $0$,异或运算需要的是相同。首先显然可以异或自己,也可以把数字的任意 $0$ 取出变成 $1$ 其他变成 $0$,这样一做与运算也可以一次性变成零。然后想错了,误以为先异或任意数字再与上同一个数字一定会清零,所以发现只需要找到每个函数的最小值或零点去尝试即可。所以答案只可能是 $\min{x,f_i(x),k,f_i(k),2min,2f_i(min)}$,读入每个函数的时候检验一下就好了。

后来发现不对,先异或再与也不一定会变成零。但是发现答案不超过 $2$,因为要么直接与 $1$ 可以变成 $0$,要么先异或再与也可以变成 $0$,因此答案最大为 $2$,所以只需要考虑一下什么情况可能会取到更小的答案就好了。

如果函数 $\Delta\ge0$,那么最小值才有可能可以取到 $0$,否则由于 $a,b,c$ 都是整数,所以该函数的每个整数坐标点都是经过格点的,那么就最低会取到 $1$。

所以这里继续猜测,答案只会从取最小值和取 $1$ 中选?于是火速开写,过掉了所有样例,但是没有任何证明,也没有对拍。但是只有十多分钟了,后面的暴力有些紧张。

火速看完 C 然后开码暴力,谢谢你 next permutation

最后五分钟开 D,读题好像是 KMP,坏了,暴力都写不出来。虽然可以暴力真的拼好之后用 find 计数,不过来不及了,遂输出样例跑路。

最后一分钟检查了一下四份代码,遗憾退场。

赛后

发现大家都考的挺炸裂,不过高一成绩都比我想的要好吗,感觉他们其实剩下打满暴力的话分应该比我高。

赛后在校门口找了一家沙县小吃吃了午饭,然后想了一下发现 D 是不是跑两次 KMP 就可以了。然而给的考试范围里面没提会有字符串高级算法,所以没复习 KMP,虽然原理很理解,但细节不太熟悉,感觉就算时间充裕也没办法裸写出来,就是有点可惜暴力分,无所谓了。

ABC 出场后也没有思路,C 的话具体应该要看给的那个函数来贪心或者 dp?

洛谷的大凶说的确实没错,可恶。

后日谈

  • 2024/06/16:哈哈。
  • 2024/07/07:120 分,喜提 2=。

附录

参考文献

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 学习笔记 | bilibili 远古弹幕查看
    起因 最近想要在某个视频查找一些 2020 年的弹幕,发现在 2024 的当今通过官方弹幕列表查询最早只能到 2021 年的了。 然而测试了一下拉取弹幕数据的 api,2021 年以前的弹幕都还有保存,也可以拉取到数据,因此只需要前端绕开时间限制即可。 方法 在 b 站对应视频页面点击”展开弹幕列表“,点击下方的”查看历史弹幕“,在日历中翻到一个亮着的可以点的日期。 接着 F12 打开开发者工具,找到那个日期对应的按钮的 html 代码,其 data-timestamp 这个属性里的值就是对应的时间戳(单位为秒),换成自己要查询的时间戳,然后点击修改后的日期即可。 附录 参考文献 版权信息 本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。
     

学习笔记 | bilibili 远古弹幕查看

2024年6月7日 19:09

起因

最近想要在某个视频查找一些 2020 年的弹幕,发现在 2024 的当今通过官方弹幕列表查询最早只能到 2021 年的了。

然而测试了一下拉取弹幕数据的 api,2021 年以前的弹幕都还有保存,也可以拉取到数据,因此只需要前端绕开时间限制即可。

方法

在 b 站对应视频页面点击”展开弹幕列表“,点击下方的”查看历史弹幕“,在日历中翻到一个亮着的可以点的日期。

接着 F12 打开开发者工具,找到那个日期对应的按钮的 html 代码,其 data-timestamp 这个属性里的值就是对应的时间戳(单位为秒),换成自己要查询的时间戳,然后点击修改后的日期即可。

附录

参考文献

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 学习笔记 | 旧版本 QQ 聊天记录导出
    起因与结果 闲来无事,注意到了七八年前使用过的旧手机,希望查看上面曾经的 QQ 聊天记录。 然而手机十分老,QQ 版本也很老。手机上的 QQ 因版本过久无法打开,但更新到最新版也因为手机版本过低无法安装。总而言之,这个手机不可能打得开 QQ 了。 网上聊天记录导出方法有许多种,然而我这旧手机不能 ROOT,自带的备份软件备份不了 QQ,会提示权限错误。捣鼓了半天没有可行方法,可谓是山重水复疑无路。 所幸找到了这篇文章,其中提到的第四种方法,尝试过后成功导出记录。 但有必要事先说明:不清楚是我的设备的问题还是方法本身的问题,总之虽然成功导出但只有一部分,并没有达成符合预期的效果,但至少看到了以前的部分聊天记录还是颇为欣慰,毕竟也只剩下这一个办法了。 当然其实后面又想到了别的方法,可能会有更好的效果,后文会提到。 我的情况 手机 Android 版本为 4.3,内存空间寥寥无几,系统过旧无法安装新版 QQ,未解锁 OEM,无法 ROOT,可以开启开发者模式使用 adb 调试。手机上安装有远古版本 QQ,也无法使用。手机自带备份软件,但无法备份 QQ,会显示权限错误。 导出方法 工具 由于资
     

学习笔记 | 旧版本 QQ 聊天记录导出

2024年6月7日 15:45

起因与结果

闲来无事,注意到了七八年前使用过的旧手机,希望查看上面曾经的 QQ 聊天记录。

然而手机十分老,QQ 版本也很老。手机上的 QQ 因版本过久无法打开,但更新到最新版也因为手机版本过低无法安装。总而言之,这个手机不可能打得开 QQ 了。

网上聊天记录导出方法有许多种,然而我这旧手机不能 ROOT,自带的备份软件备份不了 QQ,会提示权限错误。捣鼓了半天没有可行方法,可谓是山重水复疑无路。

所幸找到了这篇文章,其中提到的第四种方法,尝试过后成功导出记录。

但有必要事先说明:不清楚是我的设备的问题还是方法本身的问题,总之虽然成功导出但只有一部分,并没有达成符合预期的效果,但至少看到了以前的部分聊天记录还是颇为欣慰,毕竟也只剩下这一个办法了。

当然其实后面又想到了别的方法,可能会有更好的效果,后文会提到。

我的情况

手机 Android 版本为 4.3,内存空间寥寥无几,系统过旧无法安装新版 QQ,未解锁 OEM,无法 ROOT,可以开启开发者模式使用 adb 调试。手机上安装有远古版本 QQ,也无法使用。手机自带备份软件,但无法备份 QQ,会显示权限错误。

导出方法

工具

由于资源比较难找,这里我将导出过程中我所使用的工具打包分享,均来自于网络,不一定适合所有情况。

» QQ_recovery.zip «

原理

旧版(非 QQNT 版本)QQ 的聊天记录相关文件主要存储于

/data/data/com.tencent.mobileqq/

下的 databases/<QQ号>.dbdatabases/slowtable_<QQ号>.db 以及 files/kc,只需要获取到这三个文件我们就可以导出基本的聊天消息文字记录,更多的图片、语音等也在该目录下可导出。

获取该文件一般需要 ROOT,因此这里我们只能使用别的方式,我们可以利用 adb 的备份功能将该文件提出出来。

使用 adb 备份

首先手机开启开发者模式,允许 usb 调试,然后连接 adb。

AndroidManifest.xml 中有一个参数为 allowBackup,表示该软件是否允许使用 adb 备份。尽管我手机上已经是七八年前的版本,但该属性已设置为 false,但好在发现 QQ 更远古的版本中该属性还是 true,因此这里我们需要保留数据卸载并安装允许备份的版本。

保留数据卸载:

adb uninstall -k com.tencent.mobileqq

安装允许备份的旧版后,进行备份:

adb backup com.tencent.mobileqq

备份时需要在手机上点击同意,备份可能需要一些时间,会在当前目录下生成一个扩展名为 .ab 的备份文件。

如果备份文件只有 1kb 那就是失败了,可能是软件版本不对或 adb 与设备 Android 版本不对应。旧版 Android 不兼容高版本 adb,我这里 4.3 使用 1.0.32 版本的 adb 是可以的。

提取数据

提取出数据后,我们这里使用 android-backup-extractor.ab 中提取文件:

java -jar abe.jar unpack backup.ab backup.tar

之后直接解压即可。

导出聊天记录

这里使用的是 QQ-History-Backup 这个库。

在导出的文件夹里找出我们需要的文件之后,放入对应的文件夹内,接着按照教程使用该工具导出即可。

另一种或可行方法

在备份完之后,.ab 文件其实也可以使用 adb 将其恢复到其他设备上(例如模拟器)。

我们可以选择在新设备上将 QQ 更新到最新版尝试打开,也可以从可以 root 的新设备上更方便的直接拿到我们需要的文件。

这两种方法我都没有试过,或许效果比我更好。

附录

参考文献

  1. 安卓QQ聊天记录导出、备份完全攻略 - roadwide - 博客园

  2. GitHub - QQBackup/QQ-History-Backup: 【停更】QQ/TIM 聊天记录导出为 HTML,支持图片、语音,可 GUI 与 非 GUI 操作 (Python)

  3. GitHub - Yiyiyimu/QQ-History-Backup: QQ聊天记录备份导出,支持无密钥导出,图片导出。无需编译有GUI界面。Backup Chating History of Instant Messaging QQ.

  4. GitHub - roadwide/qqmessageoutput: 安卓QQ聊天记录导出

  5. GitHub - 117503445/qq_get_message: 2020年从安卓QQ数据库提取聊天记录

  6. 利用adb备份app的数据 - 小七闲 - 博客园

  7. ADB读取和备份安卓应用数据(无Root)_adb backup-CSDN博客

  8. GitHub - nelenkov/android-backup-extractor: Android backup extractor

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 随笔杂谈 | 省选联考 2024 游记
    前言 第二次省选了,这次的心态又与去年有所不同。 一来是因为,NOIP 成绩并不优秀,不抱希望,也就没有压力。二来是因为,很久没有碰 OI 了,自 THUPC 后还是会来机房,但是来机房基本只是找机会跟女朋友聊天和看着和她的聊天记录发呆,顺便补补文化课。 毕竟实力就在这个地方了。如果我 NOIP 后继续停课到现在,进队的概率或许还能看得见,但我最好最好也就是打个 Ag 潦草收场,然后去跟本来就能裸分的大佬抢清北羟基。什么啊。 去年参加省选时也没多大希望,高一嘛来试试水,本来想着还是高二冲队,谁知道 NOIP 后半场一败涂地直接退役。 但不管怎么说,这次比赛也宣告了我本赛季的结束,姑且是写了游记。下一次重新面对 OI,应该是年底了,届时是真的退役赛了。 另外,其实去年参加时也写了游记,但并未公开,本次一并附在附录中。 游记 day -4~-1 考前一周才想起来三月初要打省选。 谁爱打谁打。 什么,还要占我一个周末?去你的吧。 什么,可以提前一天回家?我马上来。 本来打算 day0 早上回家,但是 day-1 是我可爱的女朋友的生日,所以特意提前到 day-1 晚上就回去了,码了好久的字然
     

随笔杂谈 | 省选联考 2024 游记

2024年3月3日 23:31

前言

第二次省选了,这次的心态又与去年有所不同。

一来是因为,NOIP 成绩并不优秀,不抱希望,也就没有压力。二来是因为,很久没有碰 OI 了,自 THUPC 后还是会来机房,但是来机房基本只是找机会跟女朋友聊天和看着和她的聊天记录发呆,顺便补补文化课。

毕竟实力就在这个地方了。如果我 NOIP 后继续停课到现在,进队的概率或许还能看得见,但我最好最好也就是打个 Ag 潦草收场,然后去跟本来就能裸分的大佬抢清北羟基。什么啊。

去年参加省选时也没多大希望,高一嘛来试试水,本来想着还是高二冲队,谁知道 NOIP 后半场一败涂地直接退役。

但不管怎么说,这次比赛也宣告了我本赛季的结束,姑且是写了游记。下一次重新面对 OI,应该是年底了,届时是真的退役赛了。

另外,其实去年参加时也写了游记,但并未公开,本次一并附在附录中。

游记

day -4~-1

考前一周才想起来三月初要打省选。

谁爱打谁打。

什么,还要占我一个周末?去你的吧。

什么,可以提前一天回家?我马上来。

本来打算 day0 早上回家,但是 day-1 是我可爱的女朋友的生日,所以特意提前到 day-1 晚上就回去了,码了好久的字然后定时发到空间了嘿嘿。

当然这一周也不是什么事都没干。day-4 vp 了 YDOI R1,打了 220 跑路了。day-3 vp 了 HBOI day1,赛时 T1 死活不知道哪里错了,只得了 50 pts,而且对的还是后半部分的点,诧异,day-1 的时候发现是最后扫一遍统计答案的时候忘记判 inf 了,改了之后一发过掉。应该算签到成功了吧。

day 0

上午没学 OI,但是和她断断续续地聊了一些。

中午吃完饭没多久就出发去考点学校了,去年在广州,有些远;今年在东莞,近了许多。先去了酒店放了行李,楼层很高,拍了很多照片。然后去了考点学校报道,领了牌子和赠品。今年怎么有赠品?去年怎么没有?去的时候考点学校的学生还在上课,哈哈。

试机的时候打了个不带懒标记的线段树,测了小数据一次过了,非常好。

之后回酒店点了晚餐,之后开始打模版手速赛。十三道模版题,前十道一路打过去基本都是一次过,最后三道是三种联通分量,忘干净了,边双点双强联通的代码全记混了,打崩溃了,遂跑路。

最后成功比室友多打了一倍的模板,拿下手速赛第一名。赛后看了以前的边双代码,把边双改出来了。点双和强联通一点都不想打,跑路。

本来想着姑且尊重一下比赛要早点睡的,没忍住,和她聊到了一点多。

day 1

早上起来还算精神。

吃了早餐,提前大概半小时赶到了考点学校。打不到车,最后加了钱才打到的。

开考提前三分钟给了解压密码,先看了数据点只看得出来有一题图论。后面发现 pdf 没密码可以直接打开,火速看题。

T1 读题:我题目背景呢?怎么全是公式?好不容易读明白题,想了一会感觉好复杂,后面套回题目背景上之后好理解多了,有了一些头绪。

毫无疑问,先翻转坐标系把目标位置整到第一象限,然后接下来大力讨论,然后写着写着发现讨论不明白。

注意到风吹和移动的顺序不重要,以及具体行动路线也不重要,在某些情况下只关心吹完风之后的位置到目标位置的曼哈顿距离,但存在特殊情况。

自然而然想到,先计算一整轮风吹下来后的情况,枚举最后一次吹风,再讨论出前面轮数,然后总天数取最小值即是答案。

对于一整轮风的情况,贪心的尽可能往目标点走,所以将所有向负方向吹的风尽可能抵消,得到了一轮下来的位移以及可以自由安排的移动距离,接下来只需要枚举后讨论。

写的时候发现讨论不出来,但可以用来 check,遂退一步,枚举后二分出总轮数。

过掉小样例,然后在第二个样例发现寄了;修修改改过掉了第二个样例,然后在大样例发现假了。遂开摆。好想她。

T2 有一些思路,感觉这个博弈是假的,二进制拆位去贪心就好了。但发现这个定向加强很不好做,遂开摆,只打了最低一档暴力和做 $m=0$ 的特殊性质分,特殊性质写了半天 01 Trie 过不去,最后全都上了暴力。好想她。

T3 不可以,总司令。检查了所有代码。好想她。

结束了,四个半小时纯坐牢。出校门的时候风很大,衣服没帽子,耳朵冻没知觉了,打到了车但是要十分钟才到,冷死我了。

缓过来之后突然发现她不对劲,还以为在学校出事了,吓死我了。终于回到酒店,本来想出去吃的,被风冻怕了不敢出门,还好酒店里全天开着暖气,这才活过来。

下午摊着了,迷迷糊糊的和她聊天,等消息的时候好像睡着了一会。中间点了个肠粉当晚餐,之后和她聊了五个多小时,这个周末最美好的一段时间。

day 2

早上六点多起来了一次,发现室友通宵了。又躺回去,好像没睡着,一直到了七点才起床。

和她聊天的中途赶到了考场,提前十五分钟进了考场等开考。

我一点都不想比赛,为什么要比这么久,好想继续和她说话。

开题。

T1 这个博弈有点意思,很显然有一个最基本的贪心。最开始的思路是,从确保 $1$ 不被选开始,尽可能让 $2,3,\cdots$ 也选不上,通过这个找到要唤醒的结点,最后搜一遍出答案。

小样例过掉,第二个样例就寄了。

好想她,我为什么在这里做题。

突然注意到题目一个要求是必须走完所有子树才能回到根节点,所以发现前面思路单纯按数字大小来贪是不对的,应该按当前能走到的最小值来贪。

想到思路了,大改特改。有点分治的想法在里面,维护了结点子树中能够到达的最小结点,然后 solve 会在当前子树中进行贪心,然后会根据决策,进入到不同的子树中去 solve。

写完之后我很满意,debug 了流程很符合我的想法,简直神来之代码。结果还是一样,只过掉了第一个样例。

好想她,我不想做题了。她今天放假,我想找她说话。

手模了第三个样例中的一个数据就发现,问题出在选取要唤醒的结点的地方。试着换了别的贪心方法也过不去,估计这个地方不是贪心而是某种规划。。寄!

我在这里比赛不如拿这个时间和她聊天多好。

最后改成了自己认为正确率比较高的决策方法后就润去写剩下两题暴力了。

T2 发现是我最不擅长的概率与期望之类的题目,虽然我觉得这个概率好像是假的。不管怎么样,我发现当 $n+k\le 10$ 的时候还是可以用 next_permutation 水过去的,于是火速开写。

这暴力都不简单。check 是按照约束对整块碎片建 DAG,然后跑拓扑排序来 check。然后写了个 gcd 和 qpow 完成了有理数取模。中间还记错逆元的次数了,一直写成了 $mod-1$ 次方,我说怎么 qpow 跑出来一直是 $1$。

最后是过掉了范围内的样例,剩下的部分就不可以总司令了,我相信总是会出现一个的(

好想她,为什么不能打完暴力提前交卷。

T3 逆天题面,给我看傻了。后半部分题目不是很懂,索性 puts("1") 了。

还剩下十几分钟,好无聊,好想她。

最后一次完全检查了代码没有出现去年的错误,于是开始玩起了电脑。启动了虚拟机看看,发现 vs code 不会配置,于是在终端用 gcc 编译,结果编译出来的程序无法运行。退出来研究了一下别的 ide。

终于结束了,什么都结束了。耶,终于可以和她说话啦。

比完赛马上就回去吃午饭,吃完之后收拾了东西,酒店退了房,然后就离开东莞回家了。路上因为给她发消息看手机,晕车很严重,差点没撑住。到家之后继续聊天,真好。

后日谈

Day1 蓝黑黑,Day2 紫黑黑,真有你的省选联考。

没想到今年也签到失败了,太菜了,day0 打的模板一个没考到,不过无所谓。感觉最重要的是和她聊了好多,但我觉得还不够,要是假期就好了。

不过接下来还是专心 whk,恋爱脑也得收收。老婆和学校哪个重要我还是掂的清的,不能因为学习耽搁了恋爱(?)。

附录

省选联考 2023 游寄

注:以下是去年写的,格式不好,也没用 Latex。而且当时也不敢提到女朋友的事,就单纯写了游记。现在看着蛮难受的,但总之就是一起放出来了。

Day -1

虽然初三暑假才开始学的算法,但我对自己还是挺有信心的,基本上算法我是不会写错的(但是题目会不会做就是另一码事了),所以一上午在学校机房里就只是简单的看了下各种数据结构的代码后就继续学新东西。看了b站上关于计算几何的一些视频,向量、凸包、旋转卡壳、最近点对、随机增量之类的,除了随机增量以外基本都很简单很好理解。下午就坐了两个半钟的车到省会,先去酒店放好行李然后就去考点了。

结果走错门了,门口一大群家长,然而当时我还没发现,因为看到了好几个学生,估计他们也是打车打错了。好在当时周五下午,等了一会正好考点学校放学,学校大门开了,我就随着那些家长一起进去了。虽然因为走错门所以完全看不懂地图,不过看路标还是找到了报到的地方。因为弱校校队只有我有省选资格,所以教练也没跟着来,于是报到处的老师直接把整个文件袋都给我了,里面除了我的胸牌还有教练的胸牌和文件之类的,打算回学校后拿给他。听到对其他学生说有饭票,考完可以在考点学校的食堂吃,发现自己没有,或许是需要学校提前订吧,感到有些悲哀。

然后就回酒店了,复习主要是看了一下比较容易混淆的一群Tarjan算法还有突然想不起来和spfa有啥差别的dijkstra。然后就学了一下新的东西,比如爬山和模拟退火,还有一些乱搞(骗分但不完全骗分)。

Day 1

昨晚没睡好,悲。但还好比较精神,可能我本来在学校就天天凌晨睡,所以没太在意。早上吃完早餐就直接去考点了,结果走到昨天那个门这时候才发现走错了,不过时间很充裕,后面又坐车坐到了正确的门。在考场门口又看了下昨晚的模拟退火,总感觉能用上。进去后就看注意事项然后等开考,旁边的哥们在趴下休息,我由于第一次参加省选,格外的精神。想着D1能不能切一题暴俩题拿个200。输完神奇的压缩包密码和pdf密码后,一看目录感觉T3名字眼熟,多半是图论。

T1看完之后有点不是很明白,就看了看T2,一眼DCC,但是对于是边双还是点双有点不确定,但是能确定最后缩完应该是棵树。一看对大数取模就知道这题凉了,因为我对于这种树上dp+大方案+容斥很不会,虽然前不久才做过一道,于是就赶紧回T1了。第一眼觉得跟差分有关,但是试了试没推出来结论,所以最后选了线段树维护并查集。写+调一直到了十一点,不过由于已经放弃T2了,所以压力不是很大。最后大样例跑的飞快,写出来的那一刻还是挺高兴的。之后T2再看一眼发现还是不会于是赶紧跳T3,想着剩下差不多两个小时打个暴力四十分,D1就算圆满收官。一看题目,发现挺像之前做过的一道模拟费用流,但是又感觉很不一样。题目看到一半的时候想到刚学的模拟退火,感觉很能做,每次随机让某位员工往下走,结果往后一看发现居然是动态的,心里偷偷竖中指。于是只好敲暴力,结果发现数组开不了那么大,无奈只能放弃66666的点,最后小样例跑的飞快,大样例直接爆数组RE,D1到此结束。

中午吃过饭后就一直待在酒店里看电脑,翻了翻wiki感觉没啥想学的,会的懒得看,不会的看不懂,于是就一直在洛谷讨论区里翻来翻去看大家“关于省选”。然后发现了好多和自己做法一样的,发现T1正解居然只是道贪心,估计我最近数据结构写多了,后来发现确实有差分的做法但很容易挂。然后下午就出代码了,发现我竟然手误给几个没有返回值的方法写了返回类型,寄,T1爆零了估计。没有拿noilinux虚拟机编译一次,不然估计不会有这个问题,确实可惜,但我确实怎么也想不到居然我真的会写出这种低级错误,还是在考场上,幸好我本来就是来试试水,没打算冲队,压力没那么大。

晚上突然在b站刷到了用DQN训练只狼AI的视频,点进去就出不来了。估计因为我学AI的时间是我学OI的时间的好几倍吧,我感觉炼丹才更像是我的主业,OI只是感兴趣?不过前几年就在书的尾页中看到过DQN的介绍,对这一种直接输入屏幕图像的训练方式特别感兴趣,当时还跟朋友说打算用DQN训练某个我很喜欢玩的小众游戏的AI,结果后面找了发现DQN的资料实在太少,而且网上实现的DQN玩的基本都是叫A什么的某种很古早的只有几百个像素的电子游戏,所以最后放弃了,结果这时候突然发现有大佬用DQN实现玩现代游戏,还开源了出了教程,真的很震惊,于是就乐呼呼的看到了晚上都没碰OI。

D1理想分,100+0+48,实际估分0+0+40左右(T1其实洛谷能编译而且打了90,但CCF测评机应该是会CE的),目前民间0+0+30左右。虽然我会说没爆零就是胜利,但实际上我估计会等官方数据出来以后在洛谷交一次T1,再把T1分加回去当做我的非官方成绩,毕竟不是很在意官方排名,只是想看看自己能打成啥样。

Day 2

昨晚睡得还不错,而且这次没走错门。来到考场门口听见有同学说D2肯定有计算几何,我心里偷偷一笑然后赶紧复习计算几何,顺便看了眼模拟退火,然而结果没有考到。进了考场以后隔壁的哥们又在趴下休息,我还是格外的精神。开考念密码,跟昨天的反过来,哈哈。

一看目录,看到game就感觉要来博弈论了,但是我不急,先看T1,发现好像又是大模拟博弈论,寄。当时感觉有点像启发式搜索,但又想不出来怎么写启发函数,考虑他一个网格地图感觉会跟曼哈顿距离有点联系,一看样例又看不懂了,我手推都不知道样例答案怎么来的,想不明白为什么另一颗被困住的红棋也会移动(还没看题解,不过此时写这篇游记的时候我突然有点想法,感觉黑方的启发函数应该是棋子到第一行的距离+两颗红方棋子到黑方的曼哈顿距离, 红方可能是棋子到黑方的曼哈顿距离的相反数?这么一来确实能解决我那个疑惑。显然不是IDA*,那么肯定是A*,并且可以用记忆化搜索标记一下状态来判平局,欸卧槽好像感觉突然会了)。看到输入里面有数据编号就感觉有好事,火速看数据范围,嘶……显然,像我这种考场上没想出的正解的蒟蒻,肯定是针对每一种数据去写暴力啦,看到特殊性质A送分,我就直接跳到T2去了,打算最后一小时再回来写T1。

看到T2,果然是博弈论(至少当时我是真的以为是博弈论)。一上来先输入的时候判断一下能不能满足B互不相同,然后提前计算一部分已经确定的答案然后剔除出去。那么就剩下最后一部分了,都是B有俩选择的,这时候就感觉有点像动态规划,但是想了半天,不会表示状态。好吧,老实暴力。然后,直接敲了个2^n的dfs+回溯和剪枝出答案,测第一个样例过了,测第二个发现直接就寄了。然后死活想不明白为什么暴力都写错了,一直调一直改,差不多到十点的时候我就怀疑是我关于A的部分有问题,于是就转而投靠刚学几天的模拟退火,在A的有的选的部分中随机一个换,然后再对B暴力求答案,结果调半天还是错(现在看来,感觉是前面那一段剔除确定部分的地方出了问题。。),直到快十二点,赶紧看眼T3看看能不能骗分,发现样例好多1而且只对第一问也有分,就写了个输出1和一个随机数,然后回到T1写暴力。发现暴力不会写,只有性质A比较稳,后面的BCD好像都有乱写的成分在的,然后D2到此结束,我的第一次省选也结束了。

看洛谷有大佬评价说D2确实很难,而且T2好像不是博弈论,性质A是匈牙利、C是费用流,但我考场上确实没看出来,而且暴力也写挂了,只能说D2不爆零就是胜利。

D2理想分30+5+0,实际估分20+0+0,目前民间10+0+1(T3没想到骗到了一分hhh)

总的来说,感觉确实很难,但又好像比我想象中的简单(或许是因为我压根不去考虑正解吧),这次官方分数估计就是40左右,至少对我来说已经很不错了,毕竟我才学了不到一年。不过D1T1果然还是略有点遗憾,不过当时忘记随机化了,所以不能指望官方数据全随机,可能确实会T几个点吧;D1T2这类题感觉很难但我可以掌握,再学一年的话应该能做出来,毕竟感觉这一类题都思路很明显,缩成树后dp+容斥嘛;D1T3,明年的我写的暴力估计会更优吧;D2T1出考场才想到思路,D2T2和T3相信明年的我能写出暴力。但值得庆幸的是,虽然我这次犯了很多问题,但我都找到了可以改进和避免的方法,至少下次应该不会错在同一个地方了,而我没有下下次,所以,这次确实攒下了很好的经验,值了!

最终官方成绩没到40,太难看就不说了,不过挺可惜的是后面把D1T1考场代码里手误写的的几个没有return的函数的返回值改成void之后官方数据AC了,然而实际上虽然没有CE和RE但是也没有分。

最后的最后,鼓励一下自己,顺便立个志向:数据删除(注:搬过来的时候这一段我还是删了,实际考的远达不到这个,就不放出来丢人了)

参考文献

我去年写的别的游记。

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 踩坑记录 | Win11 输入法切换语言快捷键失效
    问题描述 因为经常需要输入英文或者关闭输入法,所以一直习惯在 Windows 里添加两种语言,然后用 Alt+Shift 切换语言,就可以很方便的打开和关闭输入法了。 当然,这里的关闭输入法实质上是切换到英文输入法。 不知道我电脑发生了什么(或许是一次自动更新),某一次开机之后我就发现我无法使用 Alt+Shift 快捷键切换语言了,而且右下角托盘的输入法设置里也无法切换成英文输入法、 我的电脑系统是 Windows 11 家庭中文版,其他的版本貌似没有出现过这个问题。 解决方案 最初我发现,打开系统语言设置后将两种语言的顺序调换一下就可以恢复正常。但是开机后会被重置,需要重新进行一遍操作,而且有概率失败,需要重启电脑再试一次。 最开始我也是不厌其烦的这样做了,毕竟不能切换语言更加难受,但最近发现这样的方法失效了,按网上说着试了也不行,最后自己捣鼓出来了一个解决方法: 在系统语言设置中删除英语,然后重新安装。 成功的标志是,在系统托盘的输入法设置中,可以选择 “英语(美国) - 美式键盘” 这一项。 我使用了这个解决方法,目前没有出现问题。 附录 参考文献 网上没一个管用的,无法参考。
     

踩坑记录 | Win11 输入法切换语言快捷键失效

2024年2月16日 19:02

问题描述

因为经常需要输入英文或者关闭输入法,所以一直习惯在 Windows 里添加两种语言,然后用 Alt+Shift 切换语言,就可以很方便的打开和关闭输入法了。

当然,这里的关闭输入法实质上是切换到英文输入法。

不知道我电脑发生了什么(或许是一次自动更新),某一次开机之后我就发现我无法使用 Alt+Shift 快捷键切换语言了,而且右下角托盘的输入法设置里也无法切换成英文输入法、

我的电脑系统是 Windows 11 家庭中文版,其他的版本貌似没有出现过这个问题。

解决方案

最初我发现,打开系统语言设置后将两种语言的顺序调换一下就可以恢复正常。但是开机后会被重置,需要重新进行一遍操作,而且有概率失败,需要重启电脑再试一次。

最开始我也是不厌其烦的这样做了,毕竟不能切换语言更加难受,但最近发现这样的方法失效了,按网上说着试了也不行,最后自己捣鼓出来了一个解决方法:

在系统语言设置中删除英语,然后重新安装。

成功的标志是,在系统托盘的输入法设置中,可以选择 “英语(美国) - 美式键盘” 这一项。

我使用了这个解决方法,目前没有出现问题。

附录

参考文献

网上没一个管用的,无法参考。

版权信息

本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。

  • ✇失迹の博客
  • 随笔杂谈 | 2024 新春快乐!
    不知不觉间这个博客过了一年多了,迎来了第二个新年,年份归档中也终于能见到第二项。 忙于学业和 OI,这一年里我写和研究的项目越来越少,所学习的事物也越来越少。博客也更新的不多,绝大部分字数还是我的游记,中间网站甚至瘫痪了不知多久。 在这一年里,我也变化了许多,About 中记载的许多内容不再切实甚至不再有必要写下。另外我也从今年开始将按照中文符号使用规范编写文章,博客中还有很多地方使用错误或不准确(如中英文之间未加空格)的地方,会在看到的时候将其修补。 许多想法放弃的同时,也有许多新的想法出现。我会将其记录于 Plans 中,等待未来有机会将其实现。 不知道博客究竟有多少人来看过,但每次收到评论,或是出现新的 backlinks 的时候都会十分欣喜。 值得一提的是,一月初的时候给本博客抢了一个还算不错的萌备号。另外其实年初一的时候因为设备原因写不了文章,但其实文章的时间是可以修改的,是不是当天也无所谓,所以本文章其实是在初七补写的。 这个博客仍然很新,但已经有所成长。期待在新的一年里,变得更新欣欣向“龙”。
     

随笔杂谈 | 2024 新春快乐!

2024年2月10日 19:34

不知不觉间这个博客过了一年多了,迎来了第二个新年,年份归档中也终于能见到第二项。

忙于学业和 OI,这一年里我写和研究的项目越来越少,所学习的事物也越来越少。博客也更新的不多,绝大部分字数还是我的游记,中间网站甚至瘫痪了不知多久。

在这一年里,我也变化了许多,About 中记载的许多内容不再切实甚至不再有必要写下。另外我也从今年开始将按照中文符号使用规范编写文章,博客中还有很多地方使用错误或不准确(如中英文之间未加空格)的地方,会在看到的时候将其修补。

许多想法放弃的同时,也有许多新的想法出现。我会将其记录于 Plans 中,等待未来有机会将其实现。

不知道博客究竟有多少人来看过,但每次收到评论,或是出现新的 backlinks 的时候都会十分欣喜。

值得一提的是,一月初的时候给本博客抢了一个还算不错的萌备号。另外其实年初一的时候因为设备原因写不了文章,但其实文章的时间是可以修改的,是不是当天也无所谓,所以本文章其实是在初七补写的。

这个博客仍然很新,但已经有所成长。期待在新的一年里,变得更新欣欣向“龙”。

  • ✇失迹の博客
  • 学习笔记 | 为 MuMu 模拟器 12 安装 HttpCanary 证书
    原因 最近需要对软件进行抓包,但是 HttpCanary 的证书无法正常安装。按照教程点击安装,但是却弹出”未安装该证书“。这是官方的说法: 部分用户在使用MuMu模拟器X版本的过程中需要进行抓包一类的操作,但发现无法安装导入证书,无法正常抓包,这是因Android7.0之后新版本系统的安全限制导致(Android7.0 之后默认不信任用户添加到系统的CA证书) 官方给出了使用 adb 安装的方法,网络上也有一些相关博文,然而都是使用其他抓包工具,没有使用 HttpCanary 的,所以自己记录一下。 我的 MuMu 模拟器 12 的版本是 V3.6.11(2438)。 由于我过程中没有截图,所以这里只简单用文字描述一下过程,如果有疑惑的话可以查看参考文献中的相同步骤的截图。 安装流程 原理 用 adb 直接把证书移到系统证书位置 /etc/security/cacerts/ 里。 模拟器设置 打开 MuMu 模拟器设置界面。 在“磁盘”中将“磁盘共享”改为“可写系统盘”。 在“其他”中将“开启手机Root权限”选中。 当然,在完成安装流程后这些都是可以改回去的。 导出
     

学习笔记 | 为 MuMu 模拟器 12 安装 HttpCanary 证书

2023年12月31日 17:12

原因

最近需要对软件进行抓包,但是 HttpCanary 的证书无法正常安装。按照教程点击安装,但是却弹出”未安装该证书“。这是官方的说法:

部分用户在使用MuMu模拟器X版本的过程中需要进行抓包一类的操作,但发现无法安装导入证书,无法正常抓包,这是因Android7.0之后新版本系统的安全限制导致(Android7.0 之后默认不信任用户添加到系统的CA证书)

官方给出了使用 adb 安装的方法,网络上也有一些相关博文,然而都是使用其他抓包工具,没有使用 HttpCanary 的,所以自己记录一下。

我的 MuMu 模拟器 12 的版本是 V3.6.11(2438)。

由于我过程中没有截图,所以这里只简单用文字描述一下过程,如果有疑惑的话可以查看参考文献中的相同步骤的截图。

安装流程

原理

用 adb 直接把证书移到系统证书位置 /etc/security/cacerts/ 里。

模拟器设置

打开 MuMu 模拟器设置界面。

  • 在“磁盘”中将“磁盘共享”改为“可写系统盘”。

  • 在“其他”中将“开启手机Root权限”选中。

当然,在完成安装流程后这些都是可以改回去的。

导出证书

在 HttpCanary 设置界面中,进入"SSL 证书设置",点击“导出HttpCanary根证书”,选择“System Trusted(.0)”格式,导出证书默认就在 /HttpCanary/cert/ 下,我的文件名是 87bc3517.0

参考文献里其他的抓包工具只能导出 .pem 格式,需要用 OpenSSL 重新签发为 .0 格式,而 HttpCanary 直接为我们提供了 .0 格式的导出,很方便,减少了很多步骤。

adb 安装证书

如果不了解或者没有 adb,可以先在其他博客中自行学习一下。

首先连接到 MuMu 模拟器并申请权限:

adb connect 127.0.0.1:7555
adb root
adb shell

其中第二步运行后,模拟器会有一个弹窗,显示“Shell 正在请求超级用户访问权限“,选择“仅此次”,点击允许。

第三步运行后,提示符会发生变化,这时候就进入 Android 的 shell 了。

将证书文件放入系统位置:

mv /sdcard/HttpCanary/cert/87bc3517.0 /etc/security/cacerts/

可以检查一下是否成功移动文件:

cd /etc/security/cacerts/
ls 87bc3517.0

确认后证书就安装完毕了,可以输入 exit 按下回车退出 shell。

安装完成

这时候启动 HttpCanary 开始抓包,软件可能仍然会显示提示条,不要紧,打开软件试试,如果能抓到 Https 请求就代表证书安装成功了,可以正常抓包了。

当然,有些软件会有 root 检查,启动会闪退,你可以把 MuMu 模拟器设置修改回去,没有影响。

然而有些软件同时还有证书验证,可能开始抓包后会无法联网(没错,说的就是你,森空岛。),难绷。

后续

写完上面一大堆之后,不知道在写博客的时候是哪里捣鼓坏了,我的抓包又变成之前那样没法抓了,但是当时刚搞完确实是可以抓的。

后面又按照 这篇博客 整了一下,效果也只持续了一下,重启模拟器之后就也不能抓了,不知道是什么鬼。

附录

参考文献

  1. 网易mumu模拟器安装下载charles的CA证书 - 悟透 - 博客园

  2. MuMu模拟器X版本如何安装证书?_MuMu模拟器_安卓模拟器

  3. burp抓包mumu模拟器_mumu模拟器如何安装信任凭证-CSDN博客

版权信息

本文原载于reincarnatey.net,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。

  • ✇失迹の博客
  • 学习笔记 | ripgrep(rg) 如何排除文件夹
    前言 最近又开始捣鼓博客模板,要搜索关键词的时候总是被 public 目录下的文件干扰,但直接删除这个文件夹的话又会导致 git 需要重建,所以就学习了下搜索时排除文件夹。 命令 rg "content" -g !public 这样就可以在搜索 “content” 的时候排除 public 文件夹下的文件了。 附录 参考文献 ripgrep(rg)忽略某些文件(exclude, ignore) - Tokubara - 博客园 版权信息 本文原载于reincarnatey.net,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。
     

学习笔记 | ripgrep(rg) 如何排除文件夹

2023年12月10日 16:28

前言

最近又开始捣鼓博客模板,要搜索关键词的时候总是被 public 目录下的文件干扰,但直接删除这个文件夹的话又会导致 git 需要重建,所以就学习了下搜索时排除文件夹。

命令

rg "content" -g !public

这样就可以在搜索 “content” 的时候排除 public 文件夹下的文件了。

附录

参考文献

  1. ripgrep(rg)忽略某些文件(exclude, ignore) - Tokubara - 博客园

版权信息

本文原载于reincarnatey.net,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。

  • ✇失迹の博客
  • 踩坑记录 | OneIndex 首页出现 HTTP ERROR 500
    踩坑 背景 最近突然发现自己的网盘首页上不去了,然而其他页面却能打开,唯独首页不行,怪异。 出现问题前后没动过源码,onedrive 账号当然也没有问题,查了 api 手册貌似也没有变动,重启服务器也是一样的情况,怎么回事呢。 发现主机服务商帮我自动升级了 PHP 版本,猜想应该是由于版本升级带来的兼容性问题。 问题描述 无法打开 OneIndex 的首页(根目录),但其他页面可以正常访问,尝试过重启甚至重装都是一样的情况。 这里我的 OneIndex 是自己以及别的大佬魔改后的 OneIndexN,但从代码上分析,应该所有的未经修复的 OneIndex 版本都会出现该问题。 解决方法 修改 /lib/onedrive.php 的 urlencode 方法: static function urlencode($path){ if($path == '/') return ""; // 在最开始加入这一行 foreach(explode('/', $path) as $k=>$v){ if(empty(!$v)){ $
     

踩坑记录 | OneIndex 首页出现 HTTP ERROR 500

2023年12月9日 12:43

踩坑

背景

最近突然发现自己的网盘首页上不去了,然而其他页面却能打开,唯独首页不行,怪异。

出现问题前后没动过源码,onedrive 账号当然也没有问题,查了 api 手册貌似也没有变动,重启服务器也是一样的情况,怎么回事呢。

发现主机服务商帮我自动升级了 PHP 版本,猜想应该是由于版本升级带来的兼容性问题。

问题描述

无法打开 OneIndex 的首页(根目录),但其他页面可以正常访问,尝试过重启甚至重装都是一样的情况。

这里我的 OneIndex 是自己以及别的大佬魔改后的 OneIndexN,但从代码上分析,应该所有的未经修复的 OneIndex 版本都会出现该问题。

解决方法

修改 /lib/onedrive.phpurlencode 方法:

static function urlencode($path){
    if($path == '/')    return ""; // 在最开始加入这一行
    foreach(explode('/', $path) as $k=>$v){
        if(empty(!$v)){
            $paths[] = rawurlencode($v);
        }
    }
    return @join('/',$paths);
}

GitHub - xieqifei/OneindexN 为例,这一行代码应被加在此处

问题应当被成功解决,现在应该可以正常访问首页(根目录)了。

分析原因

经过排查,应该是由于 PHP 版本升级(我这里是被升级到了 8.2),/lib/onedrive.php 中的 urlencode 方法出现了问题。

这个方法的作用应该是将 $path 分割后重新拼接,但对于根目录的情况,由于上下文传入的 $path 仅为一个斜杠 '/',处理的过程中出于某种原因而没有起到作用,最终使得 $path 不合法。导致在后续发起请求时传入错误的参数,从而出现异常。因而解决方法就是在开头进行特判。

没有仔细分析,推测是其中的某一行代码所调用的字符串处理方法在新版本中有不同的实现。

当然,其实也有可能是 onedrive 的 api 原本支持上述错误,而后 api 更新时不再支持,这样也会出现此问题,但我认为更可能为前一种情况。

附录

参考文献

  1. 列出文件夹的内容 - Microsoft Graph v1.0 | Microsoft Learn

  2. GitHub - xieqifei/OneindexN

版权信息

本文原载于reincarnatey.net,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。

  • ✇失迹の博客
  • 随笔杂谈 | NOIP 备赛停课日记
    前日谈 这次 NOIP 太重要了,如果还是打的像 CSP-S 一样烂就真 AFO 了。 确实需要时间去好好复习备赛,遂停课。 10 月 28 日 其实今天白天还在学校,不过经过这一周的多方谈判协调,已经确实准备好停课了。 早上出宿舍时带走了所有衣服,多余的东西全部收起来或者放到柜子里了,到教室后也把桌面和抽屉都清空了。 中午在机房制定了一下接下来的停课计划,大致就是每天早上起来敲几个板子,然后就补之前的网课录播并做做题,有比赛的话尽可能打打。 由于我自己并不是很自律,所以打算量化每日任务,如下: 题目 红 橙 黄 绿 蓝 紫 黑 分数 $10$ $20$ $30$ $50$ $80$ $100$ $150$ 活动 参加比赛 发布题解 完成课程 记录 trick 分数 $50$ $20$ $50$ $5$ 每日要求: 模板题 $100\text{pts}$ 刷题 $200\text{pts}$ 活动 $100\text{pts}$ 其实原本没打算将分数调到那么高,但是想了想,把总分定为了 $400\text{pts}$,暗示我 AK
     

随笔杂谈 | NOIP 备赛停课日记

2023年10月30日 12:52

前日谈

这次 NOIP 太重要了,如果还是打的像 CSP-S 一样烂就真 AFO 了。

确实需要时间去好好复习备赛,遂停课。

10 月 28 日

其实今天白天还在学校,不过经过这一周的多方谈判协调,已经确实准备好停课了。

早上出宿舍时带走了所有衣服,多余的东西全部收起来或者放到柜子里了,到教室后也把桌面和抽屉都清空了。

中午在机房制定了一下接下来的停课计划,大致就是每天早上起来敲几个板子,然后就补之前的网课录播并做做题,有比赛的话尽可能打打。

由于我自己并不是很自律,所以打算量化每日任务,如下:

题目 绿
分数 $10$ $20$ $30$ $50$ $80$ $100$ $150$
活动 参加比赛 发布题解 完成课程 记录 trick
分数 $50$ $20$ $50$ $5$

每日要求:

  • 模板题 $100\text{pts}$

  • 刷题 $200\text{pts}$

  • 活动 $100\text{pts}$

其实原本没打算将分数调到那么高,但是想了想,把总分定为了 $400\text{pts}$,暗示我 AK NOIP,这样溢出来的分就会变成 rp 加到 NOIP 里面去(

每周六晚上比赛都蛮多的,错过了 AcWing 的周赛,不过 AcWing 的周赛一直很水,每次参加基本上算是练练签到题的手感。

发现有场 ABC,但是也来晚了,比赛只剩四五十分钟,已经无法报名 rated 了,所以就简单写了下前三题。前两题没什么好说的,C 题一眼切,但我看数据范围总感觉直接暴力好像能过,所以花了几分钟写了暴力试试,发现 T 的很快后还是老老实实离散化双指针了。最后 D 题看完题感觉挺有意思,但剩下五分钟肯定写不完,遂开摆。

然后晚上又打了场 CF Div2,迅速地切了 AB,然后花了一个小时被 C 给切了,看了下 D 也不会,猜个贪心但是已经不想写了。

开始写了一点 CSP-S 的题解。

10 月 29 日

睡到了十点才起床。

打开 CF 发现 rating 变成 1200了,升入绿名!

继续写 CSP-S 题解,写着写着我们省出分了:$80+25+100+0=205\text{pts}$。

感觉我能拿到的分应该在 $100+50+100+20=270\text{pts}$ 左右的,总的来说还是考差了,但貌似也没有那么差。1= 估计没什么问题,听说甚至还过了七级钩线,就是不知道省排多少,唉。

下午打了一场模拟赛,出题人说不难,我信了。

到点开题,发现 A 是一道数数题。仔细分析了一下发现答案是分组后进行错排列,套公式就可以了。

错排列很好预处理,但组合数 $O(n^2)$ 预处理会爆,所以自己糊了个等价的分组公式出来,这样就可以只用阶乘表示答案了,然后顺便预处理一下阶乘的逆元即可。

写完后过掉了样例一,但样例二输出比答案多了一点,手推了一遍发现我的程序的输出没有错,应该是自己思路本身有问题,仔细想了想发现分组后不是错排列而是圆排列!

这下更简单了,随便改改就过掉了第二个样例。然后第三个样例又错了一堆,遂检查,发现我糊的分组公式漏除了一个东西,补回去之后式子就被化简到了更简单的形式,然后把这题过掉了。

开 B 题,询问的拆分方式一眼出,但是不知道怎么快速统计二维前缀和,遂打表。打表出来发现里面存在一些循环节,但找不到什么可用的规律。

打了好几种表,也往二进制上分析了,找不到什么规律,遂写了 $30\text{pts}$ 的部分分的暴力。

开 C 题,不会,但是发现对于水位相同的连续块,其性质是一样的,所以应该会需要合并这些块,遂猜测用珂朵莉树来做。

开 D 题,第一眼以为是莫队。想了很久,口糊了一种字符串哈希+树状数组的离线做法,感觉很正确,但复杂度是 $O(n^2+m\log n)$ 的,貌似能过一半的点,但实现起来超级复杂。

A 题不会写暴力,不知道怎么拍,遂开摆。

模拟赛就这么结束了,ACD 都不会写暴力,B 题只会写暴力,最后以 $100+30+0+0=130\text{pts}$ 收尾。

结束后发现 BCD 都全场没有通过的,甚至 C 题没有人有分,以至于出题人还问我们是不是都没认真打。

A 题我是正解,没有挂分,而且似乎是由于我糊的那个式子,跑的也比其他人快很多,不错。B 题正解是二进制拆位后打表找规律,个人觉得这个思路很好,拆完位后性质也很好,值得记录。C 题确实如我所说需要合并,但不是 ODT 而是并查集。D 题正解很复杂,得用 SA 做 LIS 和 LCS,这个处理方式也很好,值得记录。

总的来说题目很好,但是太难了,考前出题人还说简单,被骗了!

其实下午本来前几天报名了 GenshinOI Round 3 的,这比赛我参加过 R1,R2 也报名了但未参加,结果没想到 R3 正好撞上模拟赛所以也报名了未参加。

晚上熬夜写完了 CSP-S 题解,写的很全,四题一共八种做法全写上去了。

第一周

10 月 30 日

睡到了快十点才起床。今天开始算是正式停课了。

起床后先按计划打了点板子。其实我一开始决定每天早上打随机几道板子,是因为 exlg 有题单内随机跳题的功能,但是今天早上才发现原来那个随机跳题只能跳到我没做过的题目,所以不能用于随板子题了,于是就变成了闭眼随便抽。

最后是随到了 LCA、割点、笛卡尔树的板子,挺快敲完了,模板 $+160\text{pts}$。然后就开始补这几天的停课日记。

没错,因为前天回来之后先写了题解,一直没什么空闲,所以今天才开始写停课日记,前面的几天都是刚刚补的。

十一点半的时候听说教练忘记报名 NOIP 了,距离报名截止还剩半小时,急急急急急!最后几分钟把报名信息交上去了,好险,停课第一天就差点被迫 AFO 了。

下午我的新键盘到了,是我今年的生日礼物,双十一打折入的牧马人 K200!之前用的基本都是附赠的几十块钱不到的键盘或者笔记本自带薄膜键盘,第一次用这么好的,打起字来感觉都不一样了,敲代码舒服到飞起,状态极佳!

晚上在学分治,P7482 敲到一半去打了场 CF Div2

A 题很简单,由于 $n\le20$,直接特判一下需要修改的位置是否是 $1,2,4,8,16$ 即可,读完题就切掉了。B 题思考了十几分钟后也会了,直接 $O(30(q+n))$ 跳就好,于是 B 题也过掉了。C 题好像有一点点眼熟,摸了下样例感觉很能贪,于是直接写了个贪心,交上去结果直接过掉了,尽管我一点都不会证。D 题不难,但是我二分打了个表以为 $g$ 是单调的,结果并非如此,没能过掉这道题。听说 F 很板,但估计我还是太菜了,只看得出来题面长得就很板,但不知道到底是哪种 ds 的板子。

应该算是上分场吧。其实 Div2 能过三题对我来说还算不差,D 题有点可惜,离正解不远了都。

比完之后继续敲 P7482,敲完后发现样例都过不去,检查一遍后发现是忘记做前缀和了,改完之后一发过了这道题。

今天只做了一道紫题,没想到我竟然如此不自律,停课第一天开始就欠分了,考虑之后要不要增加个补回来的机制,不然真的 rp 堪忧啊。

  • 模板($160/100$)

  • 刷题($100/200$)

  • 活动($50/100$)

  • 今日总分 $310\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $0\text{rp}$。

10 月 31 日

睡到九点多起床。

昨晚 CF 上分场 Rating 加了 126,感觉过几天的 Edu 有望直接升 Specialist 啊!

今天是我的生日,一早起来领了好多红包,开心!停课后才想起来这件事的,发现这次停课还顺便避免了在学校过生日。

发现洛谷英文字体变了,感觉不是很好看啊。

早上起来打模板,这次直接复制所有题号,然后随便找了个在线工具去抽,抽到了字典树、Nim 游戏、逆元 2,难度黄绿绿。

发现确实不是很熟,字典树虽然打的很熟但看漏了 $|\Sigma|$ 的值域,Nim 游戏直接把必胜必败条件记反了,逆元 2 的 exgcd 还写挂了。

看来多些模板还是有很大好处的!

上午发现昨晚写的题目还能投稿题解,于是写了一篇投上去,不知道能不能过。

中午开始想 P6406 这道题,想了一会只会一点外层做法就去看题解了,看了一会突然好奇写题解的大佬是怎样的人,于是点开他博客看了好久游记和回忆录,突然发现我好像很久之前就看过他的博客,而且至今都不知道他 NOI 打银之后到底签了哪个大学……

两点的时候发布的题解就过审了,这么快的嘛!

听 kkksc03 说据说大部分省的省选要提前一个月,千万别啊!

一个下午半颓不颓的对着题解码码码改改改,好不容易写完结果答案差了好多,对着题解调了好久最后发现是少预处理一个前缀和,总算是过了这道题。

突然发现我对自己的要求貌似只有一天两道紫题,但是我写的挺痛苦的,一时间不知道自己到底颓还是没颓。

可能是题目问题吧,分治的合并写的太痛苦了。那道题其实还是有很多很好的 trick 的,但我也完全没有写题解的欲望了。

写完那题之后刷到了 LibreOJ 的一个帖子,于是上洛谷看了看他的比赛,发现正好还剩几小时结束,想着放松一下就打一打,结果 T1 一点都不普及-,感觉都快能评普及+了,想了十几分钟才会,也是挺好的一道题目!后面两题就比较简单了,T2 推推式子就行,T3 就是 SCC 板子,愉快 AK 了。

小比赛也是比赛!活动得分 $+50\text{pts}$。滑稽。

请教了大佬后把昨晚的 F 题过掉了,确实板,不过逆序处理操作我上次见还是在 LCT 里见到的,把删边转为加边。

然后去做了昨晚 D 题,死活过不去,一直 TLE,后面删了一个取模就过了,看来 __int128 的取模真的是慢的离谱。

最后做了道绿色的单调栈练习题,由于双倍经验,总算是凑够了 $200$ 分。我给自己的要求到底算高还是算低?

家长联系到了一直很想去的集训的学校!算是个好消息吧,尤其是今天还是我的生日!高兴了很多,不过明天一早就得去,感觉家长和教练比我还急……不想早起。

去那边的话只能带笔记本去了,所以今晚还得提前给笔记本准备一下各种软件和文件之类的,打算到那边继续写日记,就是可惜昨天才到的键盘马上就用不到了。

  • 模板(130/100)

  • 刷题(200/200)

  • 活动(70/100)

  • 今日总分 $330\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $0\text{rp}$。

11 月 1 日

被迫七点起床。

一大早出发了,坐了两个多小时车到了集训的学校,上次来还是省选前。

一来老师先让我做了套他们的 CSP 模拟题,这应该也算比赛吧?

A 题求树上每个点的经过这个点的链的最大点权和,看完题就会了,写了几分钟过掉了样例,结果被自己造的小样例 Hack 了,发现这个链也可以是在某个祖先处往下折,然后马上又会了,感觉有点像之前做过的题,直接维护以子节点为起点的前两个最大点权的链,然后再跑第二遍 dfs 统计答案即可,然后一发过掉了这道题。

B 题推公式推了半天,写出来的代码却不对,诧异。遂看机房其他大佬的代码,发现别人的公式跟我的公式有一个符号是相反的,但是我自己推了感觉我是对的,然后再按自己的公式改完发现还是有问题,诧异。

C 题要求统计以每个点为右端点的满足条件的区间个数,第一眼就想到了分治,但是只会做最大值在右边的情况,如果最大值在左边的话不知道如何为右端点统计答案。遂看机房其他大佬的代码,发现对方统计答案使用了差分,啊?想了一会,注意到题目条件具有单调性,所以可以枚举 $l$ 之后二分出一个满足条件的最大的右端点 $r$,于是 $l$ 就对所有 $r’\in[mid+1,r]$ 都有 $1$ 的贡献,需要区间加,于是上个差分,最后做一遍前缀和就把答案统计好了,妙!

D 题一看就不会,过。

剩下的时间把今天的模板随了,虽然人在外面但还是得继续刷模板,然后今天随到的是最小生成树、最长公共子序列、欧拉路径。其实我的规定不是每天三道而是每天打满 $100\text{pts}$,但不知为何总是刚刚好要三题才能打满。

然后做了几道 NOIP 计划的作业,一道红一道橙,橙题是前年 J 组 T2,我第一眼甚至以为要上平衡树,后来发现值域 $600$,直接桶排即可。

晚上继续补洛谷课程,学单调队列的时候突然学到了最大子段和原来可以维护最小前缀和来做,我去,还能这样?之前做还是用的 $dp$ 讨论每个点选还是不选,离谱。想到了求最长不降序列这个问题,刚学的时候还是敲的暴力,前一段时间突然想到了树状数组的做法,很感慨以前的简单题居然还有更简单的做法!

顺便还问了一下今天上午的 B 题的公式以及枚举范围,Alex_Wei 老师说我推的公式没问题,应该是我写挂了,我也这么觉得,然后还帮我简单证明了枚举范围,非常厉害!

晚上机房同学发来一道题,做了一晚上发现我也不会,问了认识的大佬说肯定是区间 dp 但还是不可做,后面查到全网唯一题解结果只有四行话……

  • 模板(90/100)

  • 刷题(50/200)

  • 活动(50/100)

  • 今日总分 $190\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $0\text{rp}$。

11 月 2 日

停课,但是还是得七点起床上学。

上午有一场模拟赛,听说难度巨高,遂开摆。

A 题给了一棵树,每个点有一个分数,可能为负。初始时得分为 $0$,第一次经过一个结点时可以获得该点的分数,可以多次经过同一个节点,问是否存在移动方案可以从 $1$ 走到给定的目标结点 $t$ 使得过程中保持得分非负。

一开始打了个搜索,找到 $1$ 到 $t$ 的那条链,对于不被链经过的所有子树都做一个压缩,得到进入这个子树后最后最多能得到的得分,然后链上跑一遍,有分就收集,看过程中得分是不是始终为正就行了。

敲起来很快,样例测起来很错。对着好几个 $n=15$ 的样例调了半天过掉了,然后这时候只差最后一个小样例还没过了,把树画出来之后发现卧槽我做法假了,因为我压缩子树的时候没有考虑到过程中得分会不会小于零,这样的话进入这个子树时的得分不同,能得到的分数也不同。

看看 B 题,好家伙,数论,对着一个看不懂的柿子求 lcm。看看 C 题,好家伙,暴力都写不出来一点!

遂开摆,11 月份第一场模拟赛喜提爆零。

赛后讲了题,第一题确实是这么个理,所以对每个节点都维护一个可重二元组集合 $(i,j)$ 表示得分大于 $i$ 时进去能额外得到 $j$ 的得分,将子节点的全部二元组加入父节点后贪心地合并,然后最后再在 $1$ 到 $t$ 的链上跑一遍贪心地得分即可。

而 B 题可以用等比数列求和公式转换一下,然后用 min-max 容斥转成求一坨奇怪的 gcd,当然,我不会。C 题更是神秘网络流,最大流转最小割的做法很神奇。

今天洛谷运势为大凶,我试过了,是真的,今天随模板题,随出来LCA、Dijistra、SPFA判负环,三道黄题总计 $90$ 分,还差十分所以不得不再多随一题,结果随出来一道 CRT!再看了几眼大纲确认 NOIP 真的会考 CRT 之后不情不愿的打了,于是今天就打了四道板子,三黄一蓝总计 $170$ 分。

把昨天说写挂了的 B 题重新写了一遍,还是一样的连样例的过不去。调了半天发现原来是区间左边界应该对枚举值取 max,否则多统计了一些答案。于是顺着这个 max 去推公式,终于发现了错误原因,并不是我写挂了,而是当枚举到一定大小之后会导致左端点变成负数,所以要作处理,顺便按同样的做法推了右端点的关系式,成功推到了昨天问 Alex_Wei 老师的那个枚举范围的那个公式,感觉一切都合理起来了,我真强!

下午写了一道 P8945,刚开始写的迷迷糊糊的,后来受不了了于是索性重写,直接不想这么多先 $O(n)$ 一遍把那些鬼前缀全部处理好,然后再重新跑一遍来求答案,总算是理清楚了,一次性把题过掉了。

但是跑的奇慢,于是就开始压缩,把两次遍历合并,这一次就清晰多了,顺便上了个快读,直接排到了最优解第五,随开始卡常抢最优解。

换成关闭同步流的 cin 试了下发现时间慢了一倍,诧异。然后用从大佬那里贺来的 fread 成功抢到了最优解。

下午放学前和机房大佬 vp 了一场 Edu,切了 A 题之后成功被 B 题切了,偷偷看了眼洛谷题解,然后去做 C 题,半天做不出来,后面发现做法假了。最后才知道原来这场 Edu 难得离谱,C 题都 1800 了,这真的是 Edu??

晚上继续补洛谷网校,终于看完第一节课了!突然发现讲倍增的时候讲到一题博弈论+倍增,我好久之前还随到过这一题!当时盯了好一会连怎么博弈都不知道,现在上课的时候讲到这道题目读完题就看出来 Nim 了,有些感慨。

  • 模板(170/100)

  • 刷题(80/200)

  • 活动(50/100)

  • 今日总分 $300\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $0\text{rp}$。

11 月 3 日

洛谷运势:凶。是真的。今天模板题写的 ST 表和树状数组 1,为什么只有两道呢?因为接下来我随到了 exgcd 和平衡树,然后我说服了自己不写这两道。

上午 vp 了一场 edu,我 C 题罚了三次时,最后只过了三题,一起的大佬已经切到 F 了,其实感觉 D 题会了,但是最后没 rush 出来,看来实力还是太菜了。

vp 完之后继续看昨天的 min-max 容斥,今天看懂了!然后要了一份代码读明白了!

中午和下午就继续上洛谷网校,进度快了很多,估计是因为第二节课简单很多吧!而且还做了一道灰题,具体难度其实我觉得有蓝到紫,打算有空可以写个题解!

放学后突然自己想出来一个 min-max 的简单证明,感觉理解的更深刻了!

晚上打了场 cf,A 题切了,B 题勉强切了,C 题想了一会就会了,但是一直调不出来,好不容易过了所有样例,一交发现 WA on 1,怎么本地测的和 CF 上跑的不一样呢,怎么会是呢?后来发现数组开小了,循环的边界处理也有问题,改了四五十分钟才过掉。后面就一直在看 D 了,感觉有规律,打表半天一点规律都没瞪出来比赛就结束了。

考后阅读到了一篇代码,发现 D 题应该从拆位上面去考虑!其实之前有场模拟赛的某一题就考到过拆位,对每一位进行考察,下次看到异或应该主动往这方面想,深刻。

本来今天模板只有 $80$ 分,但睡前看到总分 $390$,能完成任务的机会不多,为了攒 rp 决定拼一把,又随了两道 Floyd 和单调栈,成功拿到 $440$ 的总分。第一次满分,希望溢出的 $40$ 分真的能加到 rp 里面去吧。

  • 模板(110/100)

  • 刷题(230/200)

  • 活动(100/100)

  • 今日总分 $440\text{pts}$,溢出 $40\text{pts}$,挂分 $0\text{pts}$,总计增加 $40\text{rp}$。

11 月 4 日

洛谷运势:大凶。希望洛谷是在帮我攒 rp。

今天周六诶,周六!为什么这边的学校周六都不放假的啊!!

上午打了一场模拟赛,比前几天简单了许多,但还是爆难。A 题构造,不会,遂打表。找到一个规律,感觉贪的很对,统计答案也很好做,写了写把全部样例过掉了就交了!B 题推了一下之后写了个分治,感觉很对,但是样例太少了,遂写拍子,一拍就挂!改了之后再拍,继续挂!再改,再拍,哦豁,我做法假了。C 题怎么看怎么不会,D 题怎么是概率啊再见!

打完之后发现 A 题挂到了 $60\text{pts}$,不知道是贪心假了还是哪里写的不对,题解写的很抽象。B 题做法确实是假的,正解是经过一些抽象操作后转化成二维偏序。

下午一边继续补网课一边写题,中途还帮学校一位高一的后辈调了道题!写了一道 P5522,状态压缩后用线段树维护,很不错的一道题!另外还打了两道线段树求区间最大子段和的板题,当初第一次看到这个做法还是在某个初赛阅读题里面。然后突然扶苏姐姐就开始讲矩阵转移了,也就是名为动态dp(DDP)的神奇做法!现在已经会四种求最大子段和的方法了(虽然矩阵转移本质就是 dp)。

发现昨天那场 CF rating 结算了,这次没有通知我。加了九十分,上 specialist 了!!

网课又上完一节,感觉现在进度快多了,不知道是因为之前比较难还是之前我太颓了。学到了很多新的结论,比如说如果 $a\gt b$,那么 $a\text{ mod } b\lt\frac a2$,这个结论可以启示我们如果每轮取模,其实总共是 $\log n$ 轮的,所以一些看起来暴力的做法的复杂度其实是正确的。以及关于 lxl 的"线段树其实就是特殊的 01Trie"这一说法也很值得思考。

晚上打了场 ABC。A 题切了,B 题切了,C 题也切了。D 题稍微想了想,发现好像给的条件其实相当于连边后判二分图,直接染色就好了,第一次交上去一半 WA 了,后面发现是 dfs 时传错节点编号了,这都能过一半的点?第二次交上去还是 WA 了,然后突然想到图不一定联通,应该对所有联通块都判二分图,马上改好交上去了,过了,吃了两发罚时。

这次打的好快啊,二十多分钟就过掉 D 了,抓住机会上大分!遂开 E,给出了一个计算 rating 的神秘式子。观察式子,发现选取的比赛越多越好,其次越往后的比赛的得分越大越好,猜了下其实在求最长不降序列,写完后交了下发现假了。继续观察式子,发现如果倒序处理,那么指数就跟总数无关而只跟已选个数无关了,那岂不是直接 $O(n^2)$ 倒序 dp 就可以了?迅速开写,写完之后样例全过,自己也感觉很合理,结果交上去 WA 了一半,不知道是怎么假的。

发现很多人写了 F 题,遂开 F,读完题目发现这不就是 P1502 吗?我居然能在 ABC 做到原题?于是直接贺了自己的代码过来,改了改交上去,结果发现有一个点始终过不去,啊?

感觉代码一点问题都没有,样例全都过了,完全无从下手,不知道怎么调,于是 ABC 就这么结束了。结束后突然想到可以贺别人题解过来交,于是随便贺了一篇改了一下,一发就过了。

啊?合着原来是我自己的扫描线板子代码本来就有问题,最丢人的一集。赛时没想到题解,不然多过一题应该能多上好多分!

结束之后马上就更新 rating 了,加了一百五十多分,上棕名了!

晚上仔细想了想,虽然很不想写 splay 和 exgcd,但毕竟 NOIP 还是有可能考的,所以今天没遂模拟题,而是把这两道昨天随到的补了。写 splay 的时候有点手足无措,感觉不会写,但是记住了扶苏说的“splay 操作其实就是模拟“,莫名其妙地写出来了,基本没什么大问题。

今天分也挺高的,都是为了攒 rp!

  • 模板(130/100)

  • 刷题(240/200)

  • 活动(150/100)

  • 今日总分 $520\text{pts}$,溢出 $120\text{pts}$,挂分 $40\text{pts}$,总计增加 $200\text{rp}$。

11 月 5 日

周日了,九点多醒的,睡够了。

今天不光颓,还唐。洛谷运势:中平,总算不是凶和大凶了。

醒来之后没有写题,在 OI Wiki 上学了下矩阵,发现这个东西其实不难,然后颓到了中午。

中午考了场 AMC。没错,是 AMC(美国数学评测),不是 ACM。其实上面的数学题大部分不是很难,由于我没草稿纸,所以都是在手机备忘录里打的草稿,偶尔用下计算器,有一个数列问题还查了 oeis,最后比出来一百多分,貌似按去年分数线都没奖。

下午打了场模拟赛,是 lxl 出的题。十分钟看了下四题,没看出什么所以然,还以为会是四场数据结构。A 题看起来很贪心,发现貌似直接排序后双指针即可,开写,中间差点把自己绕晕了,最后写完了,过掉了两个样例,结果最后一个大样例错了,啊?

检查了一下代码感觉没问题,遂写拍。结果还没拍上呢,测试数据生成器的时候发现我的暴力写的不对,然后 debug 了一会暴力突然发现这玩意儿有后效性,我写的贪心直接就假了。想了一会想不出正解怎么做,想着既然过掉了好几个样例那应该部分分还是有的,遂开 B。

B 题发现求树上存在绝对众数的联通块个数,但我没学过有关绝对众数的东西啊,顶多做过 Violet 和蒲公英以及 lxl 大爷题。

于是现场开学,学完了摩尔投票法之后发现这事不对啊,树上不能这么做,遂试着搜相关题,结果发现了这道题的序列版 P4026 和区间查询版 P7882,现场看题解学了下做法,有一点头绪但不多。最后还是不知道怎么上树,遂写部分分,链的部分就等于问题回到序列上,由于 $n$ 很小所以直接上个 BIT 即可。然后小数据打算写个暴力一点的 dp,结果发现写不出来一点。

还有一分半结束的时候,听 lxl 说为了模拟真实情况,D 题给我们保留了不可以总司令,遂半分钟内迅速敲了个骗分,直接全部输出 NO。

最后拿了 $70+20+0+19=109\text{pts}$。由于第一题本来就假了,所以也不算挂分,倒是最后一题不可以总司令居然有 $19$ 分,诧异。

考完之后 lxl 马上就开始讲题了,A 题题解看一半就会了,感觉赛时真降智了,这么简单的贪心都看不出来,还写双指针,重新写了下只用十几行就过掉了。B 题正解是优化后的树上背包,我的思路没什么大问题,但由于我不会树上背包所以这题后面一点暴力都写不出来。我确实背包问题做少了,不光树上的,序列上的背包都不是很会做,确实要练练!C 题是个比较复杂的 dp,用线段树进行了很神奇的优化。D 题是从联考搬的题,貌似实际难度不比 C 高。

貌似求满足条件联通块是树上背包的典题,打算明天学学。晚上稍微看了一点下节的课的开头,然后就继续颓了,毕竟是周日嘛。

睡前随了道模板题,又是像之前那种情况,先随了三道黄题:逆元、三分、负环,因为分数不够然后再随了一道,结果是绿题:割点。不过其实还好,除了三分以外都敲得很熟练,看来刷模板战术起效果了!

今天真的是又颓又唐,题没练,比赛也没打好,之前说要写的题解也没写,希望明天开始又能回到前天昨天的状态吧。

  • 模板(140/100)

  • 刷题(0/200)

  • 活动(100/100)

  • 今日总分 $240\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $200\text{rp}$。

第二周

11 月 6 日

周一了,上学,要早起。

上午有场模拟赛,这次没有先看一遍全部题,反正也没机会做后面的题。

开 A,第一眼以为我小学奥数题,后面发现好像不太一样,想不出公式,遂模拟,样例全过,时间貌似还行。写了个拍,不拍答案只算时间,发现会有些点 T 了,尝试优化。想了半天,推出来一个式子,感觉是类似于分块一样先把大块的快速做了,剩下的小块再暴力,结果后面拍起来发现比优化前更慢。但是后面发现虽然拍子上提示我 T 了,但实际单独运行程序的时候又没 T,我也不知道什么情况,所以就挂后台拍着了。

开 B,不会,复制粘贴,诶找到原题了,启动!发现做法很简单,有一部分我已经想到了,看完后花了几分钟写了二三十行就搞定了。其实感觉这题我应该能想出来的,毕竟做法似乎有点显然,不过这次就算积累到经验了!交完后看了一眼 A 题的拍子,已经拍到几千组了,几乎没有超时的,貌似挺稳,但是随机生成的数据感觉很水,有点慌?

开 C,使劲想,发现曼哈顿距离有个绝对值,联想到周日下午打的一场比赛里面拆了绝对值,遂尝试拆,但发现曼哈顿距离绝对值情况有点多,好像不能按那个来。火速打开 OI Wiki 看二分图最大权匹配相关东西,发现里面有费用流做法,想了想发现还是得建 $n^2$ 条边,做不了。最后还是不会,复制粘贴,我去还有原题,启动!原题是 AGC034D,看一眼题解马上就会了。发现确实跟我想的一样要拆绝对值和跑费用流,绝对值拆出来四种情况之后建立四个中心点对应四种不同情况,然后黑点连到源点和中心四个点,白点连到汇点和中心四个点,这样边数就是 $O(n)$,跑费用流即可。火速从我的费用流板子那里贺了段 EK 过来,改一下建图方式就过掉了所有样例,芜湖,我起飞了?

开 D,什么玩意儿?开摆。发现有 $20%$ 的 $n\le 8$ 的部分分,一分钟手动打个 $[1,8]$ 的表,交上去完事。看了一眼 A 的拍子,已经上万了,感觉没问题于是停拍。感觉这次分挺高的,这几天比了那么多场终于舒爽了一回,尽管我 BC 都翻了原题。

考完后出分:$40+100+55+20=215\text{pts}$,啊?

A 题看完题解才发现可以推式子做到 $O(1)$,是我蠢了。而且我随机的数据强度太弱,竟然一万组 $1e5$ 的数据都没卡到超时。C 题我的 EK 忘记开十倍边数了,而且数据范围比原题大,费用流只有 $70$ 分,正解要用模拟费用流。

好吧,虽然这样,但这次还是打的不错了。打完比赛后发现洛谷咕值更新了,由于上周交了篇题解所以社区贡献到了 $8$,其实还是蛮好赚的,另外练习情况也增加了几分,不懂这个是怎么增加的,总估值 $311$,排名 $465$。等我下周发到七级钩,然后再刷一周题,再发两篇题解,应该有望提升更多!

中午继续看了一点课,然后就去做上一节课作业单了。先切了一题比较水的黄题,然后由于作业单里有字典树的板子题,联想到我前几次刷板子每次刷到字典树都会写挂,所以打算顺便写一遍。果不其然,又挂了,对着以前的代码调了好几次才过,感觉有必要加强练习啊!

写完之后看了眼大纲,发现卡特兰数我还不会,就去 OI Wiki 上看组合排列相关的东西。

晚上继续补了一点课,然后开始写 P6587,调了一个多小时才过,最后发现是因为几个地方漏开 long long 了,无语,但是这题确实不错,让我体会到了之前说的“线段树是特殊的 01Trie”这一观点确实很有道理。

睡前随模板题,结果又随到普通平衡树了。这次没有犹豫,直接开写,写的非常流畅,最后简单调一下就过掉了,感觉随模板题的做法很正确啊,很有效果。忘了自己下午做了道字典树,又继续随,随了一道 ST 表,几分钟写完然后一发过掉了。

感觉今天状态恢复了许多。接下来计划是 OI Wik 上补一补组合排列、矩阵、各类背包,另外课也继续上,作业单也及时跟进,感觉很有前途啊。

  • 模板(140/100)

  • 刷题(290/200)

  • 活动(50/100)

  • 今日总分 $480\text{pts}$,溢出 $80\text{pts}$,挂分 $75\text{pts}$,总计增加 $355\text{rp}$。

11 月 7 日

起床,再睡一会,起床,再睡一会,起床。

早上打了场模拟赛,但是一上午脑子有点晕晕的。

A 题读完题没什么头绪,只会写 $O(2^n)$ 大力搜索,一看数据范围 $n\le 20$,哦,原来是签到题,直接开搜。里面有一点细节,所以写+调了大概半小时不到过掉了。发现这题没什么能拍的,但这次写的很稳,应该不至于像前两天那样 A 题挂分,遂开下一题。

B 题,基环树上 dp??查了半天跟联通块有关的知识点,发现全都用不上。开摆了,抱着死马当活马医的心态,试着搜了下题目标题,结果这一搜直接搜出来了,果然还是原题!读完题解就会了,原来联通块只是恍的,实际上找个环之后讨论一下可以直接 $O(1)$ 修改和查询。写了半个多小时,几乎没怎么调就一次性过掉了,感觉非常慌,但是我不会写暴力,也没办法对拍。

C 题会写暴力,猜测也有原题,一搜出来后发现正解是比较复杂的分治,后半部分就看不懂了,于是开始自己想做法。跟机房大佬交流了一下,把我的贪心给毙掉了,然后会了他的 $O(n^2)$ 归并排序优化暴力的 $60$ 分的做法。

写完后还剩五分钟,看到这次 D 没法骗分,直接开摆。

出分之后发现自己 $100+0+40+0=140\text{pts}$,怎么会是呢。C 题发现 subtask 绑错了,后面重测之后 $40\to60\text{pst}$,但总分还是只有 $160$ 分。A 题没挂,甚至还跑到了最优解,很好。C 题也没挂分,很好。B 题怎么回事?

后面才知道 B 题中途更新了样例,但我没刷新所以没看到公告。对着新样例调了一会发现我忘记把对反向边也做设置了,加上之后拿到了 $60\text{pts}$,应该是剩下还有哪里写挂了,离谱。

中午继续补课,然后老师讲了 AGC010E,会了,想着刚听完不如写一写,毕竟是道黑题,于是写了二十分钟把这题过掉了,黑题喜加一。

下午补完了第二课的作业的最后一题,总算是 AK 一次作业了!开始写第三课的作业,第一题是 CF1253F,好家伙,一上来就一题紫。听课的时候感觉还行,没想到写起来这么麻烦。类似于货车运输那道题,先建图跑一次 Dijistra,然后重新赋边权后做一次 Kruskal 之后,询问就变成了求最小生成树上两点间简单路径上的边权最大值,倍增求 LCA 的同时维护即可。写了一小时,调了半小时,最后等评测结果特别难熬,一百二十多个点。

晚上回来先打了打板子,第一题裴蜀定理,两分钟打完过了。第二题乘法逆元 2,五分钟写完之后 T 了,稍微改改就过了。第三题非常巧,随到了乘法逆元 1,啊这,一分钟打完过了。怎么今天的板子都是数论?

晚上打了一场 CF Div2。

A 题题面好长,而且出现了我不认识的单词,看了好久才读懂,模拟判定一下就好。

B 题有点难读懂,一开始没理解什么什么叫做 exactly two 和 exist,后面把样例仔细看了看才略微明白一点,貌似也简单模拟一下即可。

总感觉今晚状态不佳,写模拟写的很不顺,感觉没有平时那种码力了,或者说感觉写出来的模拟都好蠢,总之将近一个小时才开 C 题。

C 题想了十分钟,突然发现往回走是唯一的,所以一直往前找看能不能循环即可,五分钟写完交上去结果 WA on 2 了,瞪了一会发现就算不能循环,如果往前推的次数能够达到 $k$ 次也是满足题意了,一分钟改完交上去就过掉了。

最后半个多小时一直在想 D,发现貌似一定存在某种使得 LIS 增加最多不超过 $1$ 的插入方法,感觉将 $b$ 从大到小排个序,如果能直接插在末尾的不升序列中那么一定不会使得 LIS 长度增加,除此之外如果直接插在相等的数字后面也不会增加,以及 $b$ 中所有大于 $\max_{i=1}^n a_i$ 的数倒序插在最前面也不会增加。剩余的既没有在 $a$ 中出现过也无法插在末尾的数就比较难办,可能会使得 LIS 增加,但是同样倒着插在最前面的话可以保证 LIS 增加不超过 $1$。

然后剩下十几分钟马上就开写了,写了个离散化维护数字出现次数,然后用栈来倒着记录答案,一个个插入即可,最后倒序输出答案。写完了,发现样例有一条不对,拉出来单独测试发现又对了,以为是多测没情况,但是检查了好久甚至最后上了 memset 都没救过来,然后比赛就结束了。

比赛结束后 system testing 期间发现我有一处使用了 $a_{i+1}$,也就是默认了 $a_{n+1}=0$,这一部分没清空,所以出现了问题。但是经过交流之后发现我的做法不是最优的,最优的做法也差不多,将 $b$ 从大到小枚举,将 $b_i$ 插入第一个大于等于 $b_i$ 的 $a_i$ 后面即可,仔细想了想发现这样就能保证不会使答案增加了,确实犯蠢了。

感觉这次比赛打的不是很顺,而且题面都比较长比较难读,确实打的不算好。

  • 模板(110/100)

  • 刷题(300/200)

  • 活动(100/100)

  • 今日总分 $510\text{pts}$,溢出 $110\text{pts}$,挂分 $100\text{pts}$,总计增加 $565\text{rp}$。

11 月 8 日

早上起晚了,但也不是很晚。

打了模拟赛。

A 题怎么是期望啊,他建议我先做第三题?所以就去看了第三题。第三题貌似不难,推了将近一个半小时之后 $k=0/1$ 的部分已经没问题了,但是 $k=2$ 的部分讨论起来特别复杂,已经完全不想写了,于是打完 $k=0/1$ 的 $20$ 分就跑路了。

回来看 A 题,发现求期望部分貌似不难,似乎第一个区间只需要区间乘 $2$ 的逆元后区间加,第二个区间只需要区间乘 $2$ 的逆元即可,这不是线段树 2 嘛?火速贺来了线段树 2 的代码,过掉了样例一,结果样例二挂了。稍微推了一会,发现假了,这是全概率事件,不能这么拆,岂可修。

现在只剩下半个多小时了,而我只打出来 $20$ 分,坏了。赶紧看 B,给了一个序列,操作一是整个序列对给的 $x$ 做平均数,操作二求区间第 $k$ 大。题意读懂之后发现不会做,遂写暴力。

但是,反转来了。写暴力刚写完离散化的时候,突然发现操作一不会影响操作二,操作二要求的区间第 $k$ 大就是离散化后的区间第 $k$ 大,变成静态的了,而操作一是对全体 $[1,n]$ 做平均数,那我岂不是在离散化数组上建一棵线段树进行区间加和区间除,然后在离散化后的数组上建主席树求静态区间第 $k$ 大然后回离散化数组的线段树上单点查询就好了?!

火速开写,此时还剩二十分钟,而我直接删掉了写一半的暴力,决定开始 rush 正解。当然,不是现场敲。直接贺来了我的主席树板子代码,调了几分钟就可以用了,然后发现我没写过区间除线段树,遂从网上贺了博客的代码,方便起见直接放到 namespace 里,直接按原代码的用法就可以用!简单改了几处问题之后就可以用了,测了下前几个样例都过了,此时还剩两分钟,赶紧交上去了。最后两分钟前 rush 出了 B 题,心里十分激动。

过了一会就出分了,这次是 $0+100+0+0=100\text{pts}$,啊?我 C 的部分分怎么挂了?检查了一下发现数组开小了,重新交上去就拿到了 $20$ 分。我怎么每次模拟赛总得挂点分?

后面看了题解,发现 A 题期望确实一个一个点看就好了,但是要用排列组合推一个比较复杂的式子,其实我感觉我能推,但我赛时上没有往这方面想。。。至于 B 题,大致上和我的做法差不多,只不过他们只用建一棵主席树求 kth,而操作一则是直接暴力做前面的 $O(\log V)$ 次后整个序列会只剩两种值,剩余的操作一就可以 $O(1)$ 判断了,而实际上区间除线段树里面也差不多是这样的。然后发现全场没有做出来 C 题的,是很复杂的讨论,被出题人骗了,还在 A 题推荐我先做 C,太可恶了。至于 D 题貌似要用 FWT 优化 dp,不会。

中午继续补课,把第三节课也看完了!然后就开始做第三节课作业的第二题,结果写出来之后怎么调都调不出来,调了一个小时后才发现是记错样例答案了,无语。

晚上回来直接开了第四节课,上了状圧 dp 部分内容。然后机房同学发来一道边双缩点的板题让我帮忙调,读了一会之后就调完了,顺便还拿他代码偷偷过掉了这道题。

晚上随了三道模板,第一个随出来的刚好是边双联通分量,好巧!后面两道分别是拓扑排序和单调队列。

感觉今天状态不太对,题目做的有点少,明天没有模拟赛了,希望能恢复过来。

  • 模板(100/100)

  • 刷题(180/200)

  • 活动(100/100)

  • 今日总分 $380\text{pts}$,溢出 $0\text{pts}$,挂分 $20\text{pts}$,总计增加 $585\text{rp}$。

11 月 9 日

洛谷运势:大吉!!

由于今天上午没有模拟赛,所以早上随了三道模板,希望晚上能早点睡。今天随到的是 LCA、裴蜀定理、exgcd,都是我不久前写过的板子,很快就写完并一次过了。

接下来继续完成第三节课的作业,然后发现第一题居然是排水系统。这一道题我去年的 11 月 18 日,也就是去年 NOIP 前一周还做过这道题,当时以为这题只是简单的 toposort 加个 gcd 通分约分就好了,结果只有 $20$ 分。现在重新做了一下,写了个分数类,总计十分钟写完,一次性过掉全部样例,交上去发现只有 $90$ 分,把 long long 全部改成 __in128 之后就过掉了,没想到我先除后乘也会爆 long long,放在当年不能用 __int128 的时候来看这题确实很坑,可能需要用两个 long long 拼个 __int128 才能过。

后面又做了一道 [NOIP2022] 建造军营,去年的 T3,当时我考场上看到这道题直接放弃了,考后对着题解才补了这道题。不知道我补题的时候有没有看懂题解,应该是看懂了,反正之前是过了。现在又重新写一遍,重新看了下题面,很显然的思路是边双缩点后跑树形 dp,设 $dp_{u,0/1}$ 表示以 $u$ 为根节点的子树中有/无军营时的方案数,但后面发现到根节点的边很难讨论,转移方程好像有问题,遂开摆,看题解,发现只需要令 $dp_{u,1}$ 里面的方案强制所有军营到根节点的边都要选,再在统计答案时强制 $u$ 到 $fa_u$ 这条边不选即可,这样统计答案也不会重复或者漏,因为 $u$ 到 $fa_u$ 这条边不选时的贡献会在 $u$ 处被统计,选时的贡献会被合并入 $fa_u$ 后统计。写完之后一次性过掉了前三个样例,第四个死循环了,后来发现是栈开小了,开大之后就过掉了,交上去喜得 AC。

然后就去写了一下 P9565 的题解,很有意思的一道题目,二进制分析后用 $62$ 个并查集维护 $62$ 个子图的连通。

中午补了一下课,看了一点树形 dp 的内容,但我发现我基础不太好,背包问题都不熟练,需要抽时间恶补一下!

下午打了场模拟赛,开题不会 A,感觉很树状数组,很容斥,结果想了半小时都想不出来,遂跳。开 B,啊?怎么是我做过的原题,甚至这题我还写过题解?直接贺了我之前写的代码,一测样例全过直接交。开 C,怎么感觉有点眼熟,等等,我好像也见过?一搜发现,又是原,只不过这道题当时没写出来,后面也没补,又贺了一份题解来好好研究,看了半小时学明白了就交了。回去看 A,又想了十几分钟,突然一拍脑袋拍出来了,直接上了三棵树状数组然后容斥出答案,测了所有样例全过!!天啊,起飞了这场,一个半小时过了 ABC。开 D,不是原,但是感觉很简单,貌似跑两遍 dfs 就可以了?赶紧开写,写完之后过掉了链的样例,但是第一个样例错了一个数,仔细一琢磨发现我做法假了一半,第二遍 dfs 没问题,但是第一遍 dfs 里面转移答案是错的,不能简单的乘起来,貌似得做一个背包。坏了,我刚好背包一点都不熟啊。

考试开始两小时时有事所以提前退场了,等回来的时候比赛只剩十三分钟了,火速回来试着改,但是怎么改都改不好,最后三分钟的时候放弃了,直接回退到第一次写完的版本,寄希望于过掉链的部分分,然后开始摆烂。

过了一会就出分了,$90+100+100+0=290\text{pts}$,啊?我 A 怎么又挂分了?看到最后一个点 T 了,检查代码发现,我写了 #define ll __int128,然后改成 long long 就过了,离谱。

总排名 rk5,第一次这么高,也是我 NOIP 前打了十几场模拟赛来分数第二高的一次。感觉这场比赛有点赚又有点亏,赚是因为两道原题,亏是因为少了两个多小时赛时,不然我有信心现场学完背包然后写出 D 题。

晚上听了讲评,貌似我三题做法都和正解略有不同但不多,第四题也确实非常简单。我感觉难度是绿绿蓝蓝,但貌似出题人评的蓝蓝蓝紫,第一次评难度比出题人低,赢!

睡前从机房其他大佬的做题记录那找到一道水紫,做个边双之后直接暴力找一次 LCA 就好了,没怎么调就一次性过掉了。

可能是今天上午没有模拟赛,轻松一点吧。今天状态还是不错的,不过背包确实赶紧安排时间学一下了。

  • 模板(110/100)

  • 刷题(300/200)

  • 活动(120/100)

  • 今日总分 $530\text{pts}$,溢出 $100\text{pts}$,挂分 $10\text{pts}$,总计增加 $715\text{rp}$。

11 月 10 日

洛谷运势:大凶。难道昨天那场二次原模拟赛把我运势耗光了?

今天上午也没有模拟赛,所以先打模板。随到了欧拉路径、ST 表、线性筛。然后就开始写图论作业了。

作业第一道题是一个老朋友:CF786B。我六月初的时候刚学线段树优化建图时写了这道板子题,而且时不时就 UKE,当天调了一个小时都没过。第二天又回来接着调,还是没过,于是就放弃了。过了一个月后,七月初我又回来调了两下这题,还是没过。再过了一个月,八月初我又调了一次,结果还是没过。今天上午又遇到这道题,打算从头开始写,都准备好调一上午了,结果竟然,一次都没调,一口气写完就直接过掉了样例,然后直接交就过掉了!!

估计是得益于,我现在写的线段树规范了很多,并且刷题数量和模板题刷题次数大了很多,可以说是已经形成一种正确且较为优秀的码风了(毕竟我每次重新打模板,都和之前打出来的长得几乎一模一样),所以这题的线段树和 Dijistra 写的特别的稳,因而就一次性过掉了。

后面继续写了几道题,感觉都还行,就是有点困。下午见到了 THU 计算机系的主任,开了一次交流会,大概内容就是讲的 THU 专业和强基之类的事。我很感兴趣,奈何我没这个实力,就不在这白日做梦了。

做了一道 P5344,倍增优化建图,算是挺难的,但是意外的没怎么写挂,但是写完 Dijistra 忘记在 main 里调用了,虚空调试了属于是。后面交上去 WA 了一个点,把数组开大点就变成 RE 了,调了很久,提交了一整页都没调出来,最后直接对着题解的数组大小改才过掉了。

晚上有入门赛,不过我没打。群友问了一道构造题,然后被我切了,我真棒!今天战绩四紫一蓝,感觉还是不错的。明天上下午都有模拟赛,晚上还有一场 ABC,估计会很累,所以今天就早一点睡了!

  • 模板(100/100)

  • 刷题(480/200)

  • 活动(0/100)

  • 今日总分 $580\text{pts}$,溢出 $180\text{pts}$,挂分 $0\text{pts}$,总计增加 $895\text{rp}$。

11 月 11 日

洛谷运势:大吉。今天双十一,并且今天开始是真正的倒计时一周了。

上午是模拟赛,听说是雅礼供的题,很难。

开 A,想了很久,最后只想出来个 $O(n^4)$ 的区间 dp 做法,对比本体数据范围估计这只能叫做暴力了。写了好一会,测出来过了前两个样例,结果第三个样例没过,思考了一会发现这个东西是可以中转的,所以就用类似于 Floyd 的方法预处理了转移代价,然后就过掉了三个样例。虽然最后一个跑了七十秒,但是答案对了。

开 B,不会,遂想暴力,发现可以直接树剖后用树状数组维护,我之前出题出过这个,但是那题造数据的时候才发现暴力更快,所以我想了想就直接上暴力了。

开 C,不会,但是时间很宽松,貌似直接 $O(nmq)$ 模拟都有很高的分。

开 D,交互题,不会。写了个随机数交上去了。

最终得分:$60+20+60+0=140\text{pts}$,一题正解都不会,但是暴力分还是蛮足的。发现全场没有人过了 A,然后 D 也只有一个人过了。

C 题机房大佬讲了一个很有意思的 trick,用 bitset 去判断高维空间的 $n$ 个坐标点有哪几个在一个给定的超立方体内。比如说先看一维的情况,离散化坐标后,我们预处理出 $n$ 个长度为 $n$ 的 bitset,其中第 $i$ 个 bitset 为 $b_i$,所有坐标小于 $i$ 的点在 bitset 内对应的位置设为 $1$。那么一条线段 $[l,r]$ 在一维空间覆盖到的点其实就是 $b_r\oplus b_{l-1}$。对于高维空间,用一样的方法对每个维度进行相同的处理,把每个维度得到的 bitset 全部做与运算,最终得到的 bitset 内为 $1$ 的点满足所有维度坐标都在范围内,也就是在超立方体内了。

至于 D 题,我后面自测数据的时候发现跑的飞快,比答案给定的次数限制基本能快一倍,但是不知道是我写挂了还是评测机动了手脚,本地测都能过,交上去永远过不了,悲催。如果这是正式比赛,我可能已经靠着随机数把这题水过去了。

下午洛谷有场模拟赛。考前听线下的朋友说很难,害怕。

开 A,思考了一会发现质因数分解一下好像就做完了,后面再稍微想了一下发现直接贪就好,往质因数幂次最小的上面加就完事了,但是写起来发现有点麻烦,特别是贪心的操作有点难写,花了半小时才过掉这道题。

开 B,构造题,感觉跟去年喵了个喵有的一拼。对于构造题我一般都不考虑去证明,一般都是先观察样例或者打表找规律,找到规律后再去检验,最后试着证明。结果这题硬是瞪了一个小时都没找到什么有用的规律,遂先跳过。

开 C,优美度之和很好算,但是第 $k$ 小不太会处理。考虑到交换相同数字会带来很大的相等总和的情况,合理怀疑到后面很有可能问到的就是最小的。思考了半个小时,最后拼了份暴力,$n\le10$ 时暴力做出每一次然后找第 $k$ 小处理,否则直接当做 $k=1$ 去 $O(n)$ 算一遍最小的。

开 D,有点像莫队。思考了一会发现给定 $l$ 是奇数保证了 A 拿的牌都是奇数上的牌,B 拿的都是偶数上的牌,但是博弈本身就不会,所以一点头绪都没有,连暴力都打不出来。

回去看 B,继续思考,直到比赛结束都没看出什么来,最后面向答案直接输出了 $n\le6$ 的答案。

最终得分:$85+5+32+0=122\text{pts}$,啊?A 怎么挂了 $15$ 分?

比赛刚结束时四题难度评的是绿蓝蓝紫,可能是结果太低于预期了,最后四题难度变成了绿紫紫黑,离谱。

由于跟评讲时间冲突,所以没打 AcWing 的周赛,不知道以后还有没有机会打了……

讲题,A 和我思路一致,看了下别人的实现才发现原来我想复杂了。B 题则证明可以从图论方面去证,但大部分还是考找规律,而找构造题规律就得看和出题人电波能不能对得上了,这次我没有。至于 C 和 D,太难了就不没听,明天补一下题解吧。

晚上打了一场 ABC。

A 题由于没读明白题所以花了点时间,看了样例才搞懂,一分五十才写完,开局已经落后了。B 题由于没想到 10 和 12 这种情况,还花了点时间调试,八分四十五才过掉。C 题一眼莫队板子,啊?后面想了想,发现查询的话前缀和就可以,特判一下端点的情况,树状数组就可以做了。写一半突然发现压根就没有修改操作,直接求前缀和就可以了,浪费了很多时间,十四分才过掉 C。D 题发现很像这周考过的一场模拟赛里面的题目,直接一样的办法用链表维护一下就可以了,二十二分的时候过掉了 D。

E 题发现是模 $k$ 最小生成树,啊?模 $k$ 最短路我知道,但模 $k$ MST 是啥啊,有这东西?后面看到数据范围发现不超过 $28$ 条边,直接状压然后拿并查集判断一下即可,中途用 __builtin_popcount() 剪枝,时间复杂度实际上是组合数级别的,应该没有什么问题,但是我状压不是很熟,稍微写了有一会,四十六分的时候过掉了 E。

开 F,我还是第一次在 ABC 从 A 打到 F,虽然我本来就没打过多少场 ABC。F 题想了很久,总感觉是某种拓扑排序 dp,可能是因为最近做过题面长得比较像的题目。发现加边时会出现需要一整块往上平移的情况,所以想法是用并查集维护相对于集合根节点的大小关系,但是感觉很难维护,所以把路径压缩换成了按秩合并,最后成功维护出来了,跑样例貌似蛮快的,但是交上去之后 TLE 了 6 个点,还 WA 了 8 个点。后面再仔细想想,发现路径压缩是可以做的,只是压缩的时候需要更新一下相对大小关系,改完之后一口气过掉了所有样例,交上去过了,于是我在八十五分半的时候过掉了 F。

剩下 G 题看了一下,只能看出来操作一只有一次以及操作之间顺序无所谓,想法只有枚举第一次操作后的序列然后 $O(n)$ 算总代价,发现不太好算,遂放弃。

这场打完之后 rating 加了 256,算是一点小惊喜吧,白天打比赛打的都挺烂的,晚上总算打好了一会。其实这也是我第一次把 A 到 E 全部做出来,看了一下我的比赛记录,一共九场,rated 的只有八场,之前有一场迟到了所以打的 unrated。我第一场只写了 A,不知道剩下的是不会还是不想打了,performance 甚至不到 200,后面几场基本都是只能做 2-3 题的样子。上周那场 ABC 做出来前四题,E F 都写了但是都挂了,我的 performance 第一次上千。这一场则是直接一路切到了 E,然后 F 一次罚时之后过掉了,performance 到了 1599,排名也是第一次三位数。

感觉进步确实很大,但是可惜不知道以后有没有机会再打了。

睡前随了模板题:裴蜀定理、Nim 游戏、线段树 1。今天没有做题,一整天都在打比赛,也蛮累的。

  • 模板(110/100)

  • 刷题(0/200)

  • 活动(150/100)

  • 今日总分 $260\text{pts}$,溢出 $0\text{pts}$,挂分 $15\text{pts}$,总计增加 $910\text{rp}$。

11 月 12 日

洛谷运势:小吉。今天是周日,好耶。

早上起来先看了下昨天下午的比赛,A 题昨天其实改了但忘记写了。

改了下 B 题,感觉 zig-zag pattern 这个东西很神秘,网上也查不到,不过大致的构造方法我是会了。我发现 B 题我其实可以打 $40$ 分的,但是昨天后面忘了打 $k=1$ 的分了,然后 $n=6$ 输出答案的时候不小心输反了,所以最后只过了第一个点。按照题解的构造方法,很轻易就过掉了。感觉这题其实构造实现很简单,但是构造方法太难了,不过其实貌似也不到紫的难度。

看了下 C 题,昨晚讲完课后发现我写的部分分应该不止 $32$ 分,我猜是我写挂了,重新看了下发现果不其然,有些地方漏开 long long,答案也忘取模了,改完之后就有了 $52$ 分。

这场满打满算我应该能打 $100+40+52+0=192\text{pts}$,已经超过线下联测强校的 $10%$ 分数线了,洛谷上甚至能排到 rk33,如果 B 题电波对上做出来的话就能排在 rk6。不得不说这场比赛虽然难了点,但是质量确实很高!

中午继续补课。由于背包没学好,dp 有点听不下去,打算先补补背包再来听,于是先去听数学部分了。

下午打了场模拟赛。

A 题读完就会贪,但是读完同时也忘了题目保证给的是排列,导致我的做法复杂了,然后不知道什么地方写挂了之后就换了个更复杂的做法。B 题第一眼数学题,想了一会没什么头绪,跳了。看到 C,虽然我看这种多次询问区间的题都感觉像莫队,但是这次我学会了先不看区间问题,考虑对于整个序列做时要怎么做,然后序列上发现就是个 dp,然后联想到了扶苏姐姐讲过的 DDP(虽然这题并不带修),发先 dp 的过程用矩阵可以很容易得表示,所以就把每个位置的矩阵求一下之后用查询区间乘积即可。想到可以前缀和优化,但是不会求逆矩阵,所以只好用线段树来查询区间积。复杂度有 $O(m^2q\log n)$,发现过不去,于是就加了很多优化。最后发现 MLE 了,放弃后面的 $40$ 分然后又优化了一下空间之后才过编,然后非常神奇的一次性过掉了!过掉之后再优化了一点点空间,想着多过一个点也好。然后回去做 B,观察大样例答案发现要么是自己是质数、要么是和相邻的相加为质数、要么把一段前缀加上负数的一半消去后由另外两个数相加的得到质数,推测连续三个数以上的和不可能为素数,那这样的话做法就简单了,筛完质数然后记录一下两种情况,再倒过来推一下每个数到这两种情况的数的间隔,最后应该答案是可以 $O(1)$ 出的,过掉小样例后就交了,发现大样例第一个就错了,但只剩三分钟所以摆烂了。

最后总分:$80+0+0+0=80\text{pts}$。A 题的烂做法挂了 $20$,B 也没过,C 全部 MLE 了,再缩小空间之后有 $30$。这段时间打的最烂的一场。

A 题压根就没那么复杂。B 由于时间剩的不多,然后脑子又特别乱,没有想清楚,所以最后还是写挂了,靠着特判过掉了一个点,但由于 subtask 所以没分。

听了评价,发现我 B 做法是对的,就是没有讨论明白。C 也确实是处理矩阵前缀积和处理逆矩阵前缀积,但我不会。其实这是我第一次写矩阵,我个人觉得已经不错了,就是可惜没拿到分。

晚上随了模板题:裴蜀定理、逆元、字符串哈希、exgcd。全都一次性过掉了,感觉随到的经常重复啊,是不是要考虑 ban 掉一些已经熟到闭着眼就能打出来的模板呢?

今天的做题量很低,比赛也打的很烂,感觉状态不是很好,需要调整,希望明天能好起来。

  • 模板(140/100)

  • 刷题(0/200)

  • 活动(100/100)

  • 今日总分 $240\text{pts}$,溢出 $0\text{pts}$,挂分 $30\text{pts}$,总计增加 $940\text{rp}$。

第三周

11 月 13 日

洛谷运势是大吉,等级分没有更新,咕值貌似也没有更新,无所谓了。

上午有模拟赛。做了两个小时一题都不会,连暴力都写不出来,实在不行了去求助各路 gpt,连清华的 glm 都做不出来第一题,这种题不拿去 CTST,拿来做 NOIp 模拟赛??

还剩半个多小时的时候放弃了,真的是浪费几个小时的时间。后面看完题解发现自己 A 题想法是正确的,已经转化完了,就差最后的贪心了,但是真的很难想。

感觉自己状态很差,加上现在没人监督很容易颓,必须调整状态,遂战术洗手间。冷静思考了一下接下来 NOIP 考前还有什么要做的:

  1. 把洛谷的网课补完,并完成能完成的作业

  2. 把 NOIP 前的所有模拟赛题,在我能力范围内的都改一下

  3. 整理一下近期完成的题目用到的 trick

  4. 补充知识点,尤其是背包问题

  5. 把这几年的 NOIP 真题大致看一下

我嘞个豆,这么多?

但是不管怎么样,每天打板子是必须且正确的。随了板子:ST 表、逆元 2、单调栈。然后继续完成图论的倒数第三道作业,写完交上去发现洛谷的 rmj 又寄了,上 at 看是 AC 的。

中午看了下背包 dp,其实很简单,很快就全部理解并记住了。接着又看了树上背包以及区间 dp,还看了几眼 DAG 图上 dp。其实都可以理解,只不过我自己并没有形成观念和套路,打算有空把上面的例题都刷一下。看完之后顺便还看了一下格雷码、约瑟夫问题、悬线法,基本都可以理解。

然后学了下 2-SAT,也不难理解,过掉了模板题。晚上一不小心又刷了会 b 站,注意过来后赶紧回来了。然后听说 at 的 rmj 又暂时好了,赶紧回去交了一发,UKE,再交一发,过掉啦!

晚上继续写题,然后终于完成图论的作业了!感觉最后几题二分图匹配的题真的很妙,但目前还是没那么容易看出来二分图匹配,对于这类二分图或者网络流的建模能力确实不是很好。

看了一下洛谷日报的二维线段树,分为四分树和树套树两种写法,都没写过,最沾边的只写过线段树套平衡树,而且 NOIP 也不考,所以就没仔细学了。

然后写了状压的板子题?其实感觉连我都能做出来的状压基本都很板了(),基本没调就过掉了,感觉最近好稳,码力提高了很多!虽然该挂分的还是会挂。

今天从决定放弃模拟赛开始状态就有回升了,感觉不错!dp 基本上是把提高级范围内的又重新复习了一下,现在感觉就差上手了,打算明天把几道例题过一过。rp 破千了,嘿嘿。

  • 模板(110/100)

  • 刷题(380/200)

  • 活动(50/100)

  • 今日总分 $490\text{pts}$,溢出 $90\text{pts}$,挂分 $0\text{pts}$,总计增加 $1030\text{rp}$。

11 月 14 日

洛谷运势:小吉。

早上看了下教练发来的一套 NOIP 模拟赛题,A 题想了很久,一开始以为是容斥,后来发现是拆贡献,再后来发现不能拆,再后来发现是个完全背包。前前后后两个多小时,结果好不容易写完了,第二个样例都过不去,但第二个样例又很大,手算也算不出来,检查了无数遍代码都没明白错哪了,甚至换了种写法重新写过出来的答案还是跟之前的一样,感觉像是我读错题了。不管怎么说,感觉这个平台的模拟赛一直都很缺德。

由于完全不知道错哪了,感觉状态又变成昨天上午那样了,遂像昨天一样放弃了这场,赶紧调整状态。

然后就开始刷背包的例题,然后很轻松的把 OI Wiki 上给出的各种背包的例题都过掉了。感觉普通的背包 dp 很好想也很好写,基本都可以一次过,应该是掌握的比较好了。

中午上网课,由于现在掌握背包 dp 之后感觉对 dp 理解加深了,遂退回去从第二题开始再看一遍 dp 那一堂课。看完第二题之后就开始自己写,然后一遍过掉了,好稳啊我。

然后就开始打板子,今天随到了拓扑排序、字典树、缩点。这次字典树终于一遍过了,另外缩点写一半突然就晕了,我 SCC 写的好好的,突然把 SCC 当成了 eDCC 以为我自己写错了,然后改成了 eDCC,结果刚准备提交的时候看到记录发现我又记错了。最后又改回来了,还是有惊无险一次性过掉了。

其实讲道理 SCC、eDCC、vDCC 还是很好区分的:SCC 是有向图、eDCC 需要传入反向边,vDCC 需要记录 child。不过有时候就是会突然一下搞混。

闲的没事数了一下,发现绝大部分板子我都敲过一遍了,但是貌似还是有五六个没有敲过,明天开始直接选没敲过的板子吧,就不随机抽取了,毕竟要确保考前全部至少打一遍。

接下来就在一直写作业了,感觉 dp 的作业都很有启发。然后一下午和一晚上,边听课边写题完成了状压 dp 和树上 dp 的部分。而且我发现我写的意外的很稳,几乎都不需要对着主程序调。

感觉今天的状态其实还是很不错的!背包问题练习了,作业也完成了很多,课程进度也追了很多,就是上午浪费了点时间,希望这几天都能像今天下午和晚上这样高效!

  • 模板(100/100)

  • 刷题(570/200)

  • 活动(50/100)

  • 今日总分 $720\text{pts}$,溢出 $320\text{pts}$,挂分 $0\text{pts}$,总计增加 $1350\text{rp}$。

11 月 15 日

洛谷运势:大吉。

上午有场模拟赛。A 题想了一会想出了 $O(n^2)$ 的暴力做法后就去搜原题了,发现今天这场四题都是原题。

倒不是不认真打,但是 NOIP 前也不要求我赛时做出什么题了,现在更主要的是拓宽思路、练习部分分和思考,尤其是不能连暴力都打不出来。

然后 A、B、C 三题都是在想出暴力以后去看题解,并且在看懂的情况下完全由自己写代码,然后过掉了这三题。其实 C 题我已经接近想到正解了,但是我以为区间 dp 没有优化空间了,但事实上是有效状态是 $O(n^2)$ 级别的,所以可以把区间 dp 优化为记搜就可以过掉了。

总分 $100+100+100+0=300\text{pts}$,打得比较高,而且三题我都是最短代码。发现自己其实有优化代码的习惯,而且优化能力很强。

下午继续听课,中间随了板子:欧拉路径、边双。然后看了一下换根 dp 板子题,并且发现了我半年前写的代码中的一处错误,并且以更优秀的实现方式重写了代码。

放学时思考了一下仍未完成的任务:

  1. 完成课程及相关作业

  2. 看一看这几年的 NOIP 真题

  3. 补一补这段时间的模拟赛题

  4. 整理 trick

  5. 上 OI Wiki 补充知识点

任务很重,时间很紧张。

晚上继续听课,讲完一个知识点就做一下对应部分作业。讲基环树 dp 的时候想着找环比较麻烦,想去题解里学一个比较好的视线,翻来翻去发现没一个写的比我好的。

最后做了一下比较有特殊技巧的题目,比如悬线法、优先队列优化 dp 等等,结束了 dp 部分的课程。

  • 模板(100/100)

  • 刷题(340/200)

  • 活动(100/100)

  • 今日总分 $540\text{pts}$,溢出 $140\text{pts}$,挂分 $0\text{pts}$,总计增加 $1490\text{rp}$。

11 月 16 日

集训今天结束,上午起的很晚,起来后收拾了一下吃了个饭就出发了。

下午有场模拟赛,但是到家的时候模拟赛只剩不到两个小时了。

开题,5 min 会了 A,然后 10 min 切掉了。开 B,给了一堆二元关系,考虑了并查集和图论,最后感觉像是转成图论后用拓扑之类的,但是由于 $n,m$ 很小,很慌。写完之后过了小样例,大样例第一个测试就挂了,但是先交一发再说!开 C,呃,随机增量法?哦好像不对,求的不是同一个东西……不会。开 D,不会。回来写 B,再重新推了一下之后发现之前写的并不完全,改一下之后过了小样例,大样例没测但是不管了直接交。

然后就开摆去吃饭了。最后成绩:$100+16+0+0=116\text{pts}$,全场只有两个做出来 B 的,没有做出来 CD 的,哈哈。

晚上听了讲评,A 题我感觉我的做法比正解更好想。B 题正解是一个很神奇的 trick:当我们只关心数值之间大小关系的时候,我们可以考虑枚举或者二分一个数字,然后把大于等于这个数字的数看做 1,小于这个数字的数看做 0,然后再在 01 串的角度去按照题目 check 或计算。在 B 题中的体现则是:我们需要 check 所有排列($n\le18$),$O(n!)$ 难以接受,但我们可以按上述 trick 之后就可以转变为 $O(2^n)$ 枚举 01 串后对 01 串去 check。问了 mrsrz 老师说这个套路很常见,希望 NOIP 会考。C 题则是扫描线,其中有线段树的高级使用技巧。D 是防 AK 题,能写出来 $O(n^2)$ 的 dp 就不错了。

希望 NOIP 我也能 10min 切掉 A。(考后upd:我去,我 NOIP 真的 10min 切了 A)

晚上刷了板子,随了一道 CRT,然后自己挑了没写过的 KMP 和点双。今天没写题,也没补课,不应该,但是有点忙,实在没办法。

现在任务更紧张了,打算放弃第五节课的数学部分了,相信 NOIP 不会考!明天任务计划就是把去年 T4 写了,然后补一补之前的比赛题,然后整理一下午的 trick。

  • 模板(160/100)

  • 刷题(0/200)

  • 活动(100/100)

  • 今日总分 $260\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $1490\text{rp}$。

11 月 17 日

洛谷运势:中吉。最后一天了。

早上起来之后看了下去年的 T4,想了一会只会 $O(n^2q)$ 的做法,感觉能优化到 $O(nq)$。

毕竟难度还是有的,所以就不考虑死磕了,直接开题解,发现是我没学过的东西,区间历史和是什么?在大佬的博客学了一下吉老师的神仙做法后再回来看就明白多了。

做法大致会了,确实就是查询区间历史和,不过具体式子还没有详细推,放掉这题了。

然后就开始整理 trick 了,把集训期间所有比赛以及洛谷 NOIP 冲刺计划所有比赛和我这三周做的题都看了一下,从上午整理到晚上才算是基本整理完,希望考到的全是上面的。

还看了一些大佬收集的 trick、易错点、骗分等内容。

停课日记正文的最后一篇了,这三周应该是我学 OI 以来进步最大、最认真、水平最高的时间。不祈求超常发挥,不要给自己太大压力,希望明天能不留遗憾就好!

NOIP 2023,rp++!

后日谈

感觉一下子,不仅仅是 NOIP,很多事情都结束了。要说的话反而意外地没有那么多,一时间不知道究竟需不需要单独开一篇游记,索性就接着记录于此了。

11 月 18 日

考完 NOIP 回来之后,其实已经陆陆续续在各大估分平台上得知了自己的成绩。所有平台除了 T3 有小浮动以外都一样,大致估分应当如此:$100+100+[10,25]+0=[210,225]\text{pts}$。

考场上还特意用注释标记了时间,所以这里就简单写一段游记吧:

8 点 52 分,开考 20min 时读了一遍题之后切掉了 T1。

T2 从 2-sat 想到并查集想到有向图想到搜索,换了很多做法调了很久,10 点 47 才过掉所有样例,其中最大样例刚测的时候炸了,怀疑爆栈了,然后确实调大了就过了。

此时考试时间刚过去一半,前两题还没拍但是已经过了所有样例。心里想着貌似有机会写出 T3 或者至少剩下两题打个比较优的暴力,于是战术洗手间,让自己冷静一下。

回来继续开 T3,在刚开考读题的时候就已经有过一些思考,所以读完 T3 之后马上就会了判断合法情况的方法,那接下来只要考虑如何进行构造即可。大概是由于这题数据比较难造,我手造的小样例完全没有任何强度,让我误以为可以直接贪心,写了半个多小时之后只过掉了第一个小样例,而第二个样例在手玩两三次之后发现依旧可以直接贪心,所以依旧继续错下去。最后不到一小时的时候赶忙去看 T4。

然而 T4 没有什么头绪,感觉可以 dp,但是 dp 式子貌似很难写。最开始大概糊了个 $O(mk)$ 的做法,发现根本写不出来,一步步退档,最后写了个不知道什么东西,总之只过掉了第一个样例。

回到 T3,这时候决定不要再想正解了,直接注释掉代码开始暴搜,发现连搜都搜不对,很不理解。但此时 T4 又有一个 $O(nk)$ 思路,决定在最后半小时冲 T4 暴力。

到最后依旧没冲出来,依旧只过了第一个样例。最后十分钟回去调 T3 暴力,也没调出来,也只过了第一个样例。收卷最后十秒发现暴力的一处错误,改掉了但没有任何测试。

出考场很平淡也很无奈,AB 过了但没拍,CD 暴力很可能写挂,这就是我最后的结局。

回到家后拿到了代码,测了 C 的小样例对了,松了一口气。另外这三周备赛挺稳的,代码一次性过的概率很高,所以我相信我应该是不会挂分的。那么最终的成绩应该就是看后面两题的暴力究竟能不能打出一点东西吧。

最好的结局就是 CCF 的数据过水,T3 意外拿了比较多的分,然后 T4 也能有一个点的强度跟样例相同导致我的神秘暴力可以骗到一点分。但是这不太可能,而且用处也不大。

有一个学的比我晚几个月的同届也做出了前两题,但是他后面两题挂的很彻底。有两位高三的学长为了 NOIP 冲 1= 也停了一段时间课,但最后的成绩有点遗憾。

其实这次我打的并不差,可能确实到水平上限了。该做出来的题确实做出来,剩下两道也确实不在我的能力范围内,只是两个多小时连暴力都没打好,有些可惜。

这段时间完全荒废了 whk,之后要补的内容实在太多太多。最终考的分数比 CSPS 高,但又没高到哪去。不过还算安慰的是,至少这个赛季始终都是 1= 的。

11 月 19 日

今天上午作为深圳科创之星代表被邀请参加了创客节的活动,看到了很多项目,但其实感觉所谓的 AI 展和我所喜欢和期待的人工智能略有一点区别。仔细想想,其实我想研究的应该叫机器学习或者神经网络,相比于现在所谓的广泛的人工智能,应该要更加理论化,也更贴近与编程。

下午五点,CCF 终于公布了 CSP 获奖名单,而 cz 也马上就公布了今年的钩子线。没想到在超大基数的加持下,今年的七级钩真的只需要 175。

喜提七级钩,蛮高兴的。

11 月 20 日

一觉睡到了将近十二点。

咕值更新了,$322$,排名 $344$。下午获奖记录更新了,也顺利拿到了七级钩。

今晚开始就要回学校回归 whk 了。

11 月 26 日

这一周基本在专心 whk,简单复盘了一下 NOIP,并且至今不会 T3T4,确实是实力问题无法避免,不过暴力写挂了比较可惜。查到了得分:$100+100+10+0=210\text{pts}$,取到了估分区间的下界。

其实打的并不差,在省选中占分比去年高了几分,但还是希望不大,所以决定直接退役了。WC 没必要参加了,APIO 也不打算参加了,NOID 太费钱还一点用没有,说实话这两万给我拿去买好的电脑或者游戏主机岂不是更爽?

打算打一场 THUPC,然后明年争取 NOIP 再考个 1= 就彻底结束了,大学也有点懒得打 AMC 了。

其实以我的实力,THUPC 和网上认识的比较强的选手组队的话有可能可以打进决赛的,但是还是决定跟同学一起组队打,不过说实话进决赛希望不大,但也不重要了。

其实我放得下的,这半年来学算法已经学傻了。打算退役后回归到之前,自己玩玩编程,做做项目,有空打打游戏写写小说,在学校就认真 whk,我一样会过得很好。

虽然这么说,但其实我 whk 不太想跟学校。不知道有没有那种速成班,半年卷完文化课。

停课这段时间天天写日记,其实有点养成习惯了,感觉写的时候回顾一天的历程很放松,最近没有写反而感觉有点奇怪。哈哈,说不定之后我要开始写周记了。

12 月 9 日

去你的 OI,我发现原来我的生活中没有 OI 过的一样很好,我只是想玩电脑罢了。

重新读了一遍日记,发现我之前因为模拟赛里 10min 切了 A,说过希望我 NOIP 也能 10min 切 A,没想到最后成真了,哈哈。

下午回来打了场洛谷月赛,以后可能就这样隔一段时间打打比赛仅仅保持手感就好了。

现在有点尴尬的是,我的博客里专门为题解开了一栏 Solutions,甚至还专门造了个 algorithms tag,然而我才发了四篇题解就 AFO 了,那我这不白搞了?

附录

参考文献

日记应该不会有参考文献吧……?

- [ ] 模板(0/100)

- [ ] 刷题(0/200)

- [ ] 活动(0/100)


- 今日总分 $0\text{pts}$,溢出 $0\text{pts}$,挂分 $0\text{pts}$,总计增加 $1490\text{rp}$。

版权信息

本文原载于reincarnatey.net,遵循CC BY-NC-SA 4.0协议,复制请保留原文出处。

❌
❌