20251108OIFHA

news/2025/11/11 22:15:51/文章来源:https://www.cnblogs.com/HsFx/p/19211778

T1

赛时未考虑到最大值不能取模,饮恨败北了...

直接顺着题目思路往下想就可以了.

首先考虑询问求的是两个弱连通分量(忽略边的方向的连通块)之间连边,再求最长路径的期望.容易把问题转化成预处理出以这个点为起点的最长路径长度\(dis[x]\)和以这个点为终点的最长路径长度\(en[x]\),再遍历两个弱连通分量内的所有点\(x\),\(y\),再求\(\sum_{x} \sum_{y} min(原最大值,en[x]+dis[y])\),但这样做的时间复杂度为\(O(qn^2)\),但看到有\(min\)操作,于是可以用双指针优化或二分优化(具体见代码).

那么难点在于如何求出\(en[x]\)\(dis[x]\).由于一个强连通分量内的点可以相互到达且可以重复走同一条边,那么一个点先走完它所属的强连通分量一定不劣.于是先缩点得到一个\(DAG\),即可得到\(en[x]\).建反图再做拓扑排序即可得到\(dis[x]\).而原最大值即为\(Max_{dis[x]}\).

注意空间只有16mib,是"Impossib1e."不是"Impossible.",求最大值过程中不能
取模.

代码如下(用双指针还是比二分要快的):

#include <bits/stdc++.h>
using namespace std;
#define int long longint n, m;
const int mod = 100000007;
int qpow(int xx, int yy) {long long ans = 1ll, x = xx, y = yy;while (y) {if (y % 2ll == 1ll) {ans *= x;ans %= mod;}y /= 2;x *= x;x %= mod;}return ans;
}
struct QQ {int x, y, val, id, v;
} Q[3600];
bool cmp(int x, int y) { return x > y; }
struct E1 {int v, nxt, to;
} e[55000], e2[55000], E[155000];
struct EC {int x, y, v;bool operator<(const EC &h) const {if (x == h.x) {if (y == h.y) {return v > h.v;}return y < h.y;}return x < h.x;}bool operator==(const EC &h) const { return (x == h.x) && (y == h.y); }
} E1[155000];
int t1, t2;
int head[3600], cnt;
int head2[3600], cnt2;
int Head[3600], Cnt;
void add(int x, int y, int v) {cnt++;e[cnt].to = y;e[cnt].v = v;e[cnt].nxt = head[x];head[x] = cnt;
}
void add3(int x, int y, int v) {cnt2++;e2[cnt2].to = y;e2[cnt2].v = v;e2[cnt2].nxt = head2[x];head2[x] = cnt2;
}
void add2(int x, int y, int v) {Cnt++;E[Cnt].to = y;E[Cnt].v = v;E[Cnt].nxt = Head[x];Head[x] = Cnt;
}
int col[3600], dfn[3600], low[3600], st[3600], tmp, kind;
int v[3600], dis[3600], en[3600];
deque<int> q;
// e
void dfs(int x) {dfn[x] = low[x] = ++tmp;st[x] = 1;q.push_back(x);for (int i = head[x]; i; i = e[i].nxt) {int to = e[i].to;if (!dfn[to]) {dfs(to);low[x] = min(low[x], low[to]);} else if (st[to]) {low[x] = min(low[x], dfn[to]);}}if (dfn[x] == low[x]) {++kind;while (!q.empty()) {int t = q.back();q.pop_back();st[t] = 0;col[t] = kind;if (t == x) {break;}}}
}
// e2
int ru[3600];
queue<int> d;
void tp1() {while (!d.empty()) d.pop();for (int i = 1; i <= kind; i++) {if (ru[i] == 0)d.push(i);}while (!d.empty()) {int tp = d.front();d.pop();for (int i = head2[tp]; i; i = e2[i].nxt) {int to = e2[i].to;en[to] = max(en[to], en[tp] + e2[i].v + v[tp]);ru[to]--;if (!ru[to])d.push(to);}}
}
void tp2() {while (!d.empty()) d.pop();for (int i = 1; i <= kind; i++) {if (ru[i] == 0)d.push(i);}while (!d.empty()) {int tp = d.front();d.pop();for (int i = head2[tp]; i; i = e2[i].nxt) {int to = e2[i].to;dis[to] = max(dis[to], dis[tp] + e2[i].v + v[tp]);ru[to]--;if (!ru[to])d.push(to);}}
}
int vis[3600], op;
vector<int> s[3600][2];
// E
void li(int x) {vis[x] = op;s[op][0].push_back(en[col[x]]);s[op][1].push_back(dis[col[x]]);for (int i = Head[x]; i; i = E[i].nxt) {int to = E[i].to;if (!vis[to]) {li(to);}}
}
int an = 0;
int query(int x, int y, int va) {int sx = s[x][0].size() - 1, sy = s[y][1].size() - 1;int num = ((sx + 1) * (sy + 1)) % mod, t = 0, sum = 0, su = 0;for (int i = 0; i <= sx; i++) {while (s[y][1][t] + s[x][0][i] + va > an && t <= sy) {su += s[y][1][t];su %= mod;t++;}if (t == sy && s[y][1][t] + s[x][0][i] + va > an) {sum += (su + ((sy + 1) * (s[x][0][i] + va) % mod) % mod) % mod;} else {sum += ((sy - t + 1) * (an % mod)) % mod + (su + (t * (s[x][0][i] + va) % mod) % mod) % mod;}sum %= mod;}return sum * qpow(num, mod - 2) % mod;
}
void init() {// edgecnt = cnt2 = Cnt = 0;memset(head, 0, sizeof(head));memset(head2, 0, sizeof(head2));memset(Head, 0, sizeof(Head));// othertmp = 0, kind = 0, op = 0, an = 0, t1 = 0;memset(col, 0, sizeof(col));memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));memset(st, 0, sizeof(st));memset(v, 0, sizeof(v));memset(dis, 0, sizeof(dis));memset(en, 0, sizeof(en));memset(vis, 0, sizeof(vis));for (int i = 1; i <= 3000; i++) s[i][0].clear(), s[i][1].clear();while (!q.empty()) q.pop_front();
}
void sol() {scanf("%lld%lld", &n, &m);init();for (int i = 1; i <= m; i++) {int x, y, v;scanf("%lld%lld%lld", &x, &y, &v);add(x, y, v);add2(x, y, v);add2(y, x, v);}for (int i = 1; i <= n; i++) {if (!dfn[i]) {dfs(i);}}for (int i = 1; i <= n; i++) {for (int j = head[i]; j; j = e[j].nxt) {int to = e[j].to;if (col[to] != col[i]) {E1[++t1] = { col[i], col[to], e[j].v };} else {v[col[i]] += e[j].v;}}}sort(E1 + 1, E1 + 1 + t1);memset(head2, 0, sizeof(head2));memset(ru, 0, sizeof(ru));cnt2 = 0;for (int i = 1; i <= t1; i++) {if (E1[i] == E1[i - 1])continue;ru[E1[i].y]++;add3(E1[i].x, E1[i].y, E1[i].v);}tp1();memset(ru, 0, sizeof(ru));memset(head2, 0, sizeof(head2));cnt2 = 0;for (int i = 1; i <= t1; i++) {if (E1[i] == E1[i - 1])continue;ru[E1[i].x]++;add3(E1[i].y, E1[i].x, E1[i].v);}tp2();for (int i = 1; i <= kind; i++) {dis[i] += v[i], en[i] += v[i];an = max(an, dis[i]);}for (int i = 1; i <= n; i++) {if (!vis[i]) {op++;li(i);}}for (int i = 1; i <= op; i++) {sort(s[i][0].begin(), s[i][0].end());sort(s[i][1].begin(), s[i][1].end(), cmp);}int qnum;scanf("%lld", &qnum);for (int i = 1; i <= qnum; i++) {int x, y, v;scanf("%lld%lld%lld", &x, &y, &v);if (vis[x] == vis[y]) {printf("Impossib1e.\n");continue;}printf("%lld\n", query(vis[x], vis[y], v));}
}
signed main() {int T;scanf("%lld", &T);while (T--) {sol();}
}

T2

先观察变化规律.容易发现KXP将P放到开头就变成了PKX,再把X放到开头就变成了XPK。由此可以得出它们是循环变换的。那么这就有一个很好的的性质:我们设KXP,PKX,XPK为"*** "(因为它们可以互相转换,所以具体是什么不重要),那么*** K/P/X可以变为K/P/X***(可以自行枚举证明)。

解决字符串匹配有两种常见方法,一是从左往右让\(S\)\(T\)一一匹配,匹配完成的部分不去管它。另一种是若操作可逆,则将\(S\)\(T\)变为同一个字符串,即可证明两个字符串是匹配的。

本题用方法一不好处理。注意到操作可逆,且有开头提到的性质,于是思考方法二。我们可以发现,只有*** 是可以随便动的,那我们让所有*** 移到后面,在比较\(S\)\(T\)剩余不可移动部分是否相等,即可得到是否匹配。

那么如何把所有*** 求出来呢?(记得考虑一个*** 移走后两边有可能可以重新拼成一个 *** )。由于*** 长度只有3,那么一种优秀的写法是用栈来维护,从左往右枚举,每次遇到一个数,看一下它和栈顶两个字符能否拼成***,如果可以就把它们弹出栈,否则压入当前字符。

代买实现较为简单,就不贴了。

T3

太菜了

T4

太菜了

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

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

相关文章

第二次作业-何玮鑫

作业①: 爬取中国气象网给定城市7日天气预报并存储到数据库 一、核心思路与代码 1. WeatherDB (数据库操作类) 1.1. 方法: openDB 1.1.1 思路: 连接 sqlite3 数据库,创建 weathers 表。关键点是使用 (wCity, wDate) …

Python serialize listT

import uuid from datetime import datetime import time import jsonclass Book:def __init__(self,id,name,author,isbn,title,topic):self.id=idself.name=nameself.author=authorself.isbn=isbnself.title=titlese…

2025年EGUOO白加黑睡眠营养包深度解析:昼夜分时配方如何重塑睡眠—能量闭环

引言 本文从“核心成分—昼夜节律协同机制”维度切入,为读者提供一份可验证、可量化、可对照的客观参考,帮助判断EGUOO白加黑睡眠营养包是否值得长期纳入个人健康管理方案。 背景与概况 EGUOO白加黑睡眠营养包由位于…

题解:P8127 [BalticOI 2021] The Xana coup (Day2)

考虑以 \(1\) 为根进行树形 dp,定义 \(f_{x,0/1,0/1}\) 表示以 \(x\) 为根子树内除了 \(x\) 外都已变为 \(0\),\(x\) 的点权为 \(0/1\)(对应第一个 \(0/1\)),\(x\) 父亲的点权会不会反转(对应第二个 \(0/1\))。…

2025年EGUOO肠胃片深度解析:科学复配视角下的胃肠健康新答案

本文从“科学复配”维度切入,为读者提供一份可验证、可对照、可回溯的客观参考,避免空泛赞誉,也拒绝情绪贬损,仅把实验数据、法规文件、市场反馈与成分逻辑摆到台面,供有消化困扰或膳食补充需求的人群自行权衡。 …

2025年河南工业大学2025新生周赛(3)

A 直播间红包雨抢券赛 根据规则,若某方领取到陷阱红包则直接判输,因此核心目标是避免领取第 k 个红包,即谁能迫使对方领取第 k 个红包,谁就获胜。这等价于争夺 “领取到第 k-1 个红包” 的控制权 —— 若能确保自己…

指数生成函数

指数生成函数用来解决 多重集排列问题问题 有 \(n\) 种物品,每种物品有 \(a_i\) 个,问取 \(m\) 个的排列数 这个排列数的写法可以写为 \(\frac{m!}{b_1!b_2!b_3!...b_n!}\) \(b_i\) 表示第 \(i\) 种物品选 \(b_i\) 个…

基于SpringBoot+Vue的线上一流课程教学辅助系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】 - 指南

基于SpringBoot+Vue的线上一流课程教学辅助系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display:…

Tarjan の 套餐

本套餐包含材料来源于洛谷题单:【图论】Tarjan 入门 给几碟配菜: 参考文章1 参考文章2 参考文章3 参考文章4 大部分都是板子题嘻嘻嘻嘻 SCC强连通分量 定义 极大的强连通子图,即对于该子图,任意的两点之间均有路径…

日总结 25

HTML5 是 W3C 2014 年标准化的 HTML 第五个正式版本,在 HTML4 基础上升级,新增语义化标签、原生多媒体(视频 / 音频)、本地存储、增强型表单、图形绘制(canvas/SVG)及丰富 API 等核心特性,支持跨平台自适应,推…

类 类型转化(运用子类的方法)

类 类型转化(运用子类的方法)stu父类 public class stu {public void say(){System.out.println("stu");} }teacher子类 public class teacher extends stu{public void go(){System.out.println("te…

postman: 用HTTPBasicAuth的方式发送账号密码

一,使用HTTPBasicAuth的方式发送用户名密码 发送账号和密码的方式有很多,这里我们用HTTPBasicAuth的方式,HTTPBasicAuth规定了发送账号密码必须要把账号和密码放到HTTP的header里面。header是一组一组key:value的键…

2025 ICPC 南京区域赛游记

Day -20 ~ 从上赛季打完之后,我对这个赛季的期望一直是能够靠自己拿一块真正的银牌。 西安拿铜之后难受了好几天,主要是因为自己的发挥非常不正常。 去南京之前解决了一下自己堆积成山的 ddl。第五周和第七周连着做了…

详细介绍:Kuikly 小白拆解系列 第1篇|两棵树直调(Kotlin 构建与原生承载)

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

编程思维与 AI-coding 结合

前言(背景与目标) 最近大量使用 AI 协助完成项目,直观感受是:个人“编码时间”减少,但“完成效率与质量”显著提升。与其担心编程能力下降,不如承认一个事实——角色在升级:从“只写代码的工程师”转向“以目标…

重大收获的一天

重大收获的一天,今天我知道了,JAVA-WEB也是要分文件处理的.可以分为JSP(展示页面),servlet(接受请求,调用业务方法,跳转页面),services(业务逻辑),DAO(与数据库有关的操作), :定义段落,前后会有空白. 仅换行,不添加空白…

如何制作一个随身服务器?

需要在两处办公地点不定时、不定点办公,两边都需要处理文档和查找历史文档,从文档同步角度来说,需要的是:一旦插入U盘,自动更新电脑文件与U盘一致。 要实现这个功能,需要使用FreeFileSync和自带的RealTimeSync工…

业务用例模板(用户线上充值) - f

业务用例模板 一、用例基本信息字段 内容(示例) 填写说明用例名称 用户线上充值 动宾结构,简洁明确用例编号 UC-用户模块-003 模块+序号,便于归类管理参与者 普通用户、支付系统、账户系统 所有与用例交互的角色/系…

丝路杯

这是一个对丝路杯的总结,主要是awd攻防。从这次比赛中找到不足。(之后有补充的话会继续补充) 这次的check很抽象,检测你有没有修改后门文件,修改了,直接异常,只能删除后门文件(无异常)。而且对通防没有限制,…