OIFHA251108(成都嘉祥)

news/2025/11/9 21:34:39/文章来源:https://www.cnblogs.com/high-sky/p/19205344

吐槽

虽然难,但全部都是比较好玩的题目(除了 \(T_1\))。

T1

幸好没做这题(doge)。

其核心思想在于看到有向图以及每条边可以走很多次且只算一次需要很快想到 tarjan,为什么要很快?因为你还要调代码。

然后这是一个 DAG,跑一个原图的拓扑和一个反图的拓扑就行了,排完序后,最后计算答案的时候双指针即可。

具体看代码吧

//注意16Mib以及模数为10^8+7
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#define int long long
#define PII pair<int,int>
#define N 2505
using namespace std;
struct edge{int v,w;
};
int fa[N];
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void merge(int x,int y) {int xx = find(x),yy = find(y);if (xx != yy) fa[xx] = fa[yy];
}
const int mod = 1e8 + 7;
int qpow(int a,int b) {int res = 1;while(b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
int dfn[N],low[N],tot,cnt,val[N],bel[N],ltk[N],col;
bool in_stack[N];
stack<int> sta;
vector<int> scc[N];
vector<edge> g[N];
vector<edge> g2[2][N];
int du[2][N];
void tarjan(int cur) {ltk[cur] = col;in_stack[cur] = 1;dfn[cur] = low[cur] = ++cnt;sta.push(cur);for (auto i : g[cur])if (!dfn[i.v]) tarjan(i.v),low[cur] = min(low[cur],low[i.v]);else if (in_stack[i.v]) low[cur] = min(low[cur],dfn[i.v]);if (dfn[cur] == low[cur]) {tot ++;int t = sta.top();do{t = sta.top();in_stack[t] = 0;scc[tot].push_back(t);bel[t] = tot;sta.pop();}while(t != cur);}
}
int n,m;
int f[2][N];
bool vis[N];
vector<int> ans[2][N];
vector<int> sum[2][N];
int ssum[2][N];
void solve() {while(!sta.empty()) sta.pop();for (int i = 1;i <= n;i ++) ltk[i] = ssum[0][i] = ssum[1][i] = vis[i] = 0,sum[0][i].clear(),sum[1][i].clear(),ans[0][i].clear(),ans[1][i].clear(),g[i].clear(),dfn[i] = low[i] = 0,in_stack[i] = 0,scc[i].clear(),fa[i] = val[i] = 0,g2[0][i].clear(),g2[1][i].clear();col = tot = 0,cnt = 0;scanf("%lld%lld",&n,&m);for (int i = 1;i <= m;i ++) {int u,v,w;scanf("%lld%lld%lld",&u,&v,&w);g[u].push_back({v,w});}for (int i = 1;i <= n;i ++)if (!dfn[i]) col ++,tarjan(i);for (int i = 1;i <= n;i ++)for (auto j : g[i]) {int v = j.v,w = j.w;if (bel[v] == bel[i]) val[bel[v]] += w;else g2[0][bel[i]].push_back({bel[v],j.w}),du[0][bel[v]] ++,g2[1][bel[v]].push_back({bel[i],j.w}),du[1][bel[i]] ++;}for (int i = 1;i <= tot;i ++) fa[i] = i;for (int type = 0;type < 2;type ++) {//0->z,1->fqueue<int> q;for (int i = 1;i <= tot;i ++)if (!du[type][i]) q.push(i);for (int i = 1;i <= tot;i ++) f[type][i] = 0;while(!q.empty()) {int t = q.front();q.pop();f[type][t] += val[t];for (auto i : g2[type][t]) {f[type][i.v] = max(f[type][i.v],f[type][t] + i.w);merge(i.v,t);if ((--du[type][i.v]) == 0) q.push(i.v);}}}int mx = 0;for (int i = 1;i <= tot;i ++) {int x = find(i);for (int j = 0;j < scc[i].size();j ++)ans[0][x].push_back(f[0][i]),ans[1][x].push_back(f[1][i]);mx = max(mx,f[1][i]);}for (int i = 1;i <= tot;i ++) {int x = find(i);if (!vis[x]) {vis[x] = 1;stable_sort(ans[0][x].begin(),ans[0][x].end());stable_sort(ans[1][x].begin(),ans[1][x].end());int len = ans[1][x].size();sum[0][x].push_back(ans[0][x][0]);sum[1][x].push_back(ans[1][x][0]);ssum[0][x] = ans[0][x][0];ssum[1][x] = ans[1][x][0];for (int i = 1;i < len;i ++) {int lst[2];lst[0] = sum[0][x].back();lst[1] = sum[1][x].back();for (int j = 0;j < 2;j ++)sum[j][x].push_back((lst[j] + ans[j][x][i]) % mod),ssum[j][x] = (ssum[j][x] + ans[j][x][i]) % mod;}}}int T;cin >> T;for (int u,v,w;T --;) {scanf("%lld%lld%lld",&u,&v,&w);int x = find(bel[u]),y = find(bel[v]);if (x == y) {puts("Impossib1e.");continue;}int lenx = sum[0][x].size(),leny = sum[0][y].size();int res = lenx * ssum[1][y] % mod + leny * ssum[0][x] % mod;res %= mod;res = (res + w * lenx % mod * leny % mod) % mod;for (int i = lenx - 1,p = 0;i >= 0;i --) {while(p < leny && ans[1][y][p] + ans[0][x][i] + w <= mx) p ++;if (p) res = (res - (sum[1][y][p - 1] + p * ans[0][x][i] % mod + w * p % mod) % mod + mod) % mod;res = (res + p * mx % mod) % mod;}printf("%lld\n",res * qpow(lenx * leny % mod,mod - 2) % mod);}
}
signed main(){// freopen("cloudbrige.in","r",stdin),freopen("cloudbrige.out","w",stdout);int T;cin >> T;for (;T--;) solve();return 0;
}

记得毒瘤卡空间题目要用 vector 啊!

T2(AGC055B)

题目概述

可以将字符串 KXP 循环起来,也就是变成 XPK 或者 PKX。问两个 \(s,t\) 是否可以从 \(s\)\(t\)

\(1\leq |s|,|t|\leq 10^6\)

分析

提示 $1$ 想象一个船来回接送,并思考这是为什么
提示 $2$ 每一个串本质有一个母串通过不断移动得到,考虑怎么将这个本质找到进行判断。
提示 $3$ 注意我们的转化是可以反悔的!

这是一道思维极高的题目,由于是远古的题目,所以评分现在应该是入门黑题或者强紫。

考虑 \(\mathcal{O}(n^2)\) 的做法。

其中一个角度是进行位置匹配,只是一个经典的思路,因为我们观察到一对一匹配一定是更优的,所以从后往前直接匹配即可。

可惜的是,对于做这道题目没有什么帮助。

考虑现在存在一个 KXP,后面接着一个字母 \(c\),怎么才能像一艘船一样让他渡河呢?

也就是说怎么证明:KXPc 可以变成 cKXP

首先 \(c\) 肯定是 KXP 中的一个,那么只需要将另外两个搞到后面去即可。

比如说:KXPX 可以先变成 XPKX 然后因为 PKX 所以变成 XKPX

这是本题的关键点。

于是我们就可以小船渡河了。

每一个可以变化的串都可以将他后面的那一个换到前面去,这相当于把所有的可以组成的 KXP 全部放到后面去,然后前面的是否匹配即可。

而这个放到后面去的操作等同于删除一个 KXP 因此本题完美解决。

但是!为什么相等就是一个同一个母串呢?

重点的是在于我们的 KXP 这艘船以及其移动过后再出现的船就算将某一个字符进行了渡河,他们整体的相对位置是不会改变的!

这就是这道题目的精髓!

代码

时间复杂度 \(\mathcal{O}(Tn)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <stack>
#define int long long
#define N 1000006
using namespace std;
int n;
string s;
char sta[N];
int top;
signed main(){freopen("replace.in","r",stdin),freopen("replace.out","w",stdout);int T;cin >> T;for (;T--;) {top = 0;int n;scanf("%lld",&n);cin >> s;for (auto i : s) {string tp = "???";if (top >= 2) tp[2] = i,tp[1] = sta[top],tp[0] = sta[top - 1];if (tp == "KXP" || tp == "XPK" || tp == "PKX") top -= 2;else sta[++top] = i;}s = "";for (int i = 1;i <= top;i ++) s += sta[i];string t;cin >> t;top = 0;for (auto i : t) {string tp = "???";if (top >= 2) tp[2] = i,tp[1] = sta[top],tp[0] = sta[top - 1];if (tp == "KXP" || tp == "XPK" || tp == "PKX") top -= 2;else sta[++top] = i;}t = "";for (int i = 1;i <= top;i ++) t += sta[i];if (s == t) puts("YE5");else puts("N0");}return 0;
}

T3

题目概述(原题面就是**)

给你一颗 \(n\) 个点的树,然后共有 \(m\) 天,第 \(i\) 天的每一个节点有 \(k_i\),除此之外还有 \(a,b\) 在这个节点上。第 \(i\) 天第 \(j\) 个节点的权值为 \(w_j=\left\lfloor(\sqrt{a_j}+\sqrt{b_j})^{2k_{j,i}}\right\rfloor\bmod Q\)

然后给出询问 \(q\),每个询问 \(l,r,u,v\),设 \(p\)\(u\)\(v\) 路径上面的一点,求 \(\max_{i=l}^rw_p\)

数据范围 \(1\leq n,m\leq 2\times 10^4,1\leq q\leq 10^6,1\leq a_i,b_i,k_i\leq 5\times 10^8,1\leq Q\leq 10^7\)

注意:\(0<|a_i-b_i|<1\)

分析

问题可以拆成两个部分。

  • 如何求点的权值
  • 假设知道权值,如何查询

我们先考虑第二个部分,这个静态所以一般直接树套树或者二维st表即可(或者树套st表???)。

T4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOIP 模拟赛 4 总结

分数:\(40 + 0 + 0 + 0 = \color{red}{40}\)我恨子任务! 我恨全是坑的贪心! 我很码量超大的数据结构! 我恨 ad-hoc !当然,还是要承认自己很菜,不然分数不可能如此惨淡。 T1 众所周知,贪心本身并不难,难的是这…

2025.11.9——1橙1绿

普及- P14477 图寻中国 Div2月赛T1 普及+/提高 P5687 [CSP-S 2019 江西] 网格图 Kruskal的变形,看了题解才做出来

Python中a = b = 10的底层机制:从名字绑定到引用计数的完整拆解

Python中a = b = 10的底层机制:从名字绑定到引用计数的完整拆解 在Python中,a = b = 10这种“链式赋值”看似是简单的语法糖,但其底层执行逻辑与C语言的同名语法存在本质差异——它不是“先把10赋给b,再把b的值赋给…

Python中“赋值”说法是否规范?与C语言赋值的界限必须划清

Python中“赋值”说法是否规范?与C语言赋值的界限必须划清 在Python语境中,“赋值”是行业内约定俗成的常用说法(如官方文档、教材、社区讨论中频繁出现),但其语义边界必须与C语言的“赋值”严格区分——若直接将…

详细介绍:java-springboot电子商务商品物流跟踪系统 SpringBoot+Java电商订单全程物流可视化平台 基于Java框架的网购商品在途追踪与签收管理系统计算机毕业设计

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python中“赋值”说法是否规范?详解`=`的语句属性与无返回值特性

Python中“赋值”说法是否规范?详解=的语句属性与无返回值特性 在Python学习中,“赋值”是描述a = 10这类语句的常用说法,但结合之前讨论的“名字-对象绑定模型”“对象三属性(标识、类型、值)”,很多开发者会疑…

CIO修炼之道读书笔记

目录一个目标三层价值提高运营效率(操作层)​加强运营管控(管理层)防范运营风险(决策层)参考资料 CIO修炼之“一三四六” 一个目标 从只关注技术转变为同时关注企业业务和战略,并努力围绕如何让企业更赚钱这个目…

小题狂练 (K)

solset-K\[\]目录 目录[AGC036F] Square Constraints[AGC036F] Square Constraints 容斥钦定一些下界不满足转为只有上界的问题,困难只在求每个界的排名 . 比 \(n\) 小的部分的上界肯定比所有数都大,所以如果知道钦定…

洛谷 P14461 【MX-S10-T2】『FeOI-4』青年晚报

P14461 【MX-S10-T2】『FeOI-4』青年晚报 空降 很好得诠释了数学和眼神的重要性 感谢奆佬设求导算子为 $ d $ ( 熟悉线代科技的奆佬可以从求导矩阵和单位矩阵结合成分块矩阵形式的角度进行理解),显然对于 $ F $ 的一阶…

Microsoft Agent Framework 接入DeepSeek的优雅姿势

Microsoft Agent Framework 接入DeepSeek的优雅姿势合集 - AI(1)1.Microsoft Agent Framework 接入DeepSeek的优雅姿势11-05收起一、前言 ​ Microsoft Agent Framework 框架发布也有一阵子了,在观望(摸鱼)过后,也…

人工智能团队的示例角色

人工智能团队的示例角色1 软件工程师(设计专业的软件) 2 机器学习工程师(运用人工智能算法到产品软件中) 3 机器学习研究员(负责开发机器学习的前沿技术) 4 应用机器学习科学家(对学术文献或者研究文献,向团队…

React18学习笔记(五) 【总结】常用的React Hooks函数,常用React-Redux Hooks函数和React中的组件通信 - 指南

React18学习笔记(五) 【总结】常用的React Hooks函数,常用React-Redux Hooks函数和React中的组件通信 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

详细介绍:C语言——深入解析C语言指针:从基础到实践从入门到精通(二)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

汽车安全核心:TSR技巧需求全解析

汽车安全核心:TSR技巧需求全解析2025-11-09 21:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

flask:使用flask-migrate迁移数据表

一,安装第三方库 $ pip3 install flask-migrate二,应用 1,在代码中引入安装的库 from flask_migrate import Migrate...migrate = Migrate(app, db) 创建migration目录 $ flask db init 执行migration:在migration目…

docker 搭建 sql 环境

docker 搭建 sql 环境 在网上看了看,原本想直接从 mysql 官网下来,但是看到很多人都是用 docker 搭建的,再想到以后也要会用 docker,最后决定用 docker 来搭建。 下载 在 docker 官网 下载 docker desktop。 下载好…

深入解析:k8s学习(二)——kubernetes整体架构及组件解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

硬件基础知识和典型应用-4G模组供电设计推荐

硬件基础知识和典型应用-4G模组供电设计推荐<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnHardware" frameborder="0" scrolling="auto" w…

计算机课程在线视频 —— 王道计算机考研 计算机网络

计算机课程在线视频 —— 王道计算机考研 计算机网络地址: https://www.bilibili.com/video/BV19E411D78Q/本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网…