『模拟赛』NOIP2024加赛4

Rank

给我唐完了,

image

又名,【MX-S5】梦熊 NOIP 2024 模拟赛 1。


A. 王国边缘

好像简单倍增就做完了。

由于昨天 T5 在我脑海中留下了挥之不去的印象,今天一上来看到这题就发现是一个内向基环树森林。然后被硬控硬控硬控,最后一个小点加一点优化就能过没调出来,挂 30pts,菜菜菜菜菜。

注意到倍增理论复杂度是 \(\mathcal{O(n\log n)}\) 的,而我们基环树玩家的理论复杂度可以做到完全线性,所以一下午直接调出了 8.2k 基环树做法。

中途插曲还不少,包括但不限于判完完整环之后暴力查询过了,轻松卡成 \(\mathcal{O(n^2)}\);然后在环上加了前缀和优化,不过链上还是 \(\mathcal{O(n)}\) 跑,又过了;尝试交题解,被告知要贴代码,遂加入离线 dfs 优化,至此达成 \(\mathcal{O(n)}\)

具体做法见此。

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(int (x) = (y); (x) <= (z); (x)++)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define lx ll
inline lx qr()
{char ch = getchar(); lx x = 0, f = 1;for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);return x * f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define fi first
#define se second
#define M_P(x, y) make_pair(x, y)
#define P_B(x) push_back(x)
const int Ratio = 0;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
ll n, m, q;
string s;
int las[N], fx[N], dfn[N], dt;
int hh[N], to[N], ne[N], cnt;
bool huan[N], vis[N], yz[N];
int bushu[N], daxiao[N], jieru[N];
ll len[N], w[N], dep[N], dis[N];
int newid[N], tot, st[N];
ll sumid[N];
ll ans[N];
namespace Wtask
{short main(){m %= mod;fo(i, 1, q){ll qd = qr, k = qr;qd %= mod;k %= mod;printf("%lld\n", (qd + k * m % mod) % mod);}return Ratio;}
}
int h1[N], t1[N], n1[N], tnc;
ll w1[N];
vector<pii> que[N];
namespace Wlixian
{int deep[N];ll shendu[N];inline void Wdfs(int u, int sd){for(pii qq : que[u]){int x = qq.fi, y = qq.se;ans[y] = (ans[y] + (shendu[u] - shendu[deep[sd - x]] + mod) % mod) % mod;}for(int i = h1[u]; i != -1; i = n1[i]){int v = t1[i];if(huan[v]) continue;deep[sd + 1] = v;shendu[v] = (shendu[u] + w1[i]) % mod;Wdfs(v, sd + 1);}}inline void Wwork(){fo(i, 1, n) if(huan[i]) deep[1] = i, Wdfs(i, 1);}
}
namespace Wisadel
{int siz[N];inline int Wfind(int x){if(x == fx[x]) return x;return fx[x] = Wfind(fx[x]);}inline void Wmerge(int u, int v){int _ = Wfind(u), __ = Wfind(v);if(siz[_] < siz[__]) fx[_] = __, siz[__] += siz[_];else fx[__] = _, siz[_] += siz[__];}inline void Wadd(int u, int v, ll val){to[++cnt] = v;w[cnt] = val;ne[cnt] = hh[u];hh[u] = cnt;}inline void Wda(int u, int v, ll val){t1[++tnc] = v;w1[tnc] = val;n1[tnc] = h1[u];h1[u] = tnc;}int tag = 1e9;inline void Wsearch(int u, int id, int tar){newid[u] = id;for(int i = hh[u]; i != -1; i = ne[i]){int v = to[i];if(v == tar) return ;sumid[id + 1] = sumid[id] + w[i];Wsearch(v, ++tot, tar);}}inline void Wdfs(int u){yz[u] = 1;vis[u] = 1;dfn[u] = ++dt;for(int i = hh[u]; i != -1; i = ne[i]){int v = to[i];if(vis[v]){tag = dfn[v];huan[u] = 1;sumid[++tot] = 0;st[Wfind(u)] = tot;Wsearch(v, ++tot, v);len[Wfind(u)] = (dep[u] - dep[v] + w[i] + mod) % mod;}else if(yz[v]) continue;else dep[v] = (dep[u] + w[i]) % mod, Wdfs(v);}vis[u] = 0;if(dfn[u] >= tag) jieru[u] = u, huan[u] = 1, daxiao[Wfind(u)]++;if(dfn[u] == tag) tag = 1e9;}inline void Wdfss(int u){yz[u] = 1;for(int i = hh[u]; i != -1; i = ne[i]){int v = to[i];if(huan[v]) dis[u] = w[i], bushu[u] = 1, jieru[u] = v;else Wdfss(v), dis[u] = dis[v] + w[i], bushu[u] = bushu[v] + 1, jieru[u] = jieru[v];}}short main(){freopen("kingdom.in", "r", stdin), freopen("kingdom.out", "w", stdout);n = qr, m = qr, q = qr;fo(i, 1, n) fx[i] = i, siz[i] = 1;memset(h1, -1, sizeof h1);memset(hh, -1, sizeof hh);cin >> s;s = " " + s;int zaisuan = -1;fo(i, 1, n) if(s[i] == '1'){zaisuan = i - 1; break;}if(zaisuan == -1){fo(i, 1, q){ll qd = qr, k = qr;qd %= mod;k %= mod;printf("%lld\n", (qd + k) % mod);}return Ratio;}int ok = 1;fo(i, 1, n) if(s[i] != '1'){ok = 0; break;}if(ok) return Wtask::main();fo(i, zaisuan + 1, n) las[i] = s[i] == '1' ? i : las[i - 1];fo(i, 1, zaisuan) las[i] = las[n] - n;fo(i, 1, n){if(i + m <= n){ll dis;if(las[i + m] <= i){dis = 1;Wmerge(i + 1, i);Wadd(i, i + 1, dis);Wda(i + 1, i, dis);}else{dis = las[i + m] - i;Wmerge(las[i + m], i);Wadd(i, las[i + m], dis);Wda(las[i + m], i, dis);}}else if(m < n){int to = (m - (n - i)) % n;int zto = to;if(las[to] <= 0){zto = las[to] + n;if(zto <= i){ll dis = 1;zto = i + 1;if(zto > n) zto = 1;Wmerge(zto, i);Wadd(i, zto, dis);Wda(zto, i, dis);}else{ll dis = zto - i;Wmerge(zto, i);Wadd(i, zto, dis);Wda(zto, i, dis);}}else{ll dis = las[to] - i + n;Wmerge(las[to], i);Wadd(i, las[to], dis);Wda(las[to], i, dis);}}else{ll to = (m - (n - i)) % n;ll tim = (m - (n - i)) / n;if(!to) to += n, tim--;int zto = las[to];if(zto <= 0) zto += n, tim--;ll dis = (n - i + zto + tim * n % mod) % mod;Wmerge(zto, i);Wadd(i, zto, dis);Wda(zto, i, dis);}}fo(i, 1, n) if(!yz[i]) Wdfs(i);fill(yz + 1, yz + 1 + n, 0);fo(i, 1, n) if(!yz[i] && !huan[i]) Wdfss(i);fo(i, 1, q){ll qidian = qr, cishu = qr, res = 0;if(cishu == 0){ans[i] = qidian % mod;continue;}int dxqidian = qidian % n;if(!dxqidian) dxqidian = n;int belong = Wfind(dxqidian);res = qidian % mod;if(cishu < bushu[dxqidian]) que[dxqidian].P_B(M_P(cishu, i));else{cishu -= bushu[dxqidian];ll timesl = cishu / daxiao[belong];cishu -= timesl * daxiao[belong];timesl %= mod;res = (res + timesl * len[belong] % mod) % mod;res = (res + dis[dxqidian]) % mod;if(cishu){if(newid[jieru[dxqidian]] - st[belong] + cishu <= daxiao[belong]) res = ((res + sumid[newid[jieru[dxqidian]] + cishu]) % mod - sumid[newid[jieru[dxqidian]]] + mod) % mod;else{int zcc = newid[jieru[dxqidian]] + cishu - daxiao[belong];res = (res + ((sumid[zcc] - sumid[newid[jieru[dxqidian]]] + mod) % mod + len[belong]) % mod) % mod;}}}ans[i] = res;}Wlixian::Wwork();fo(i, 1, q) printf("%lld\n", ans[i]);return Ratio;}
}
signed main(){return Wisadel::main();}
// 佳墙坂诶迦币等渔塞

B. 买东西题

反悔贪心板子。

其实做完两个特殊性质就把正解启发得差不多了,结合一下就过了。

考虑物品按 \(a_i\) 升序,券按 \(w_i\) 升序,双指针扫,这样能够保证当前券可被之前的所有物品使用,方便反悔操作。

发现 \(a_i-b_i\) 实质上就是优惠价给的满减值,我们维护一个堆存放当前可选的满减值,每次操作只有取或不取。若从堆中取了满减,那么将 \(a_i-b_i\) 加入堆。这个操作还挺好理解的,如果 \(a_i-b_i\) 在之后某次抉择中成了最优决策,那么将 \(i\) 用的券给当前物品用,然后 \(i\) 直接用优惠价买一定是优的。

然后就做完了,复杂度 \(\mathcal{O(n\log n)}\)

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define lx ll
inline lx qr()
{char ch = getchar(); lx x = 0, f = 1;for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);return x * f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define ppp pair<pii, pii>
#define fi first
#define se second
#define M_P(x, y) make_pair(x, y)
#define P_B(x) push_back(x)
const int Ratio = 0;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
int n, m;
struct good{int a, b;} g[N];
struct rmm{int w, v;} c[N];
priority_queue<int, vector<int>, less<int> > q;
namespace Wisadel
{short main(){freopen("buy.in", "r", stdin), freopen("buy.out", "w", stdout);n = qr, m = qr;fo(i, 1, n) g[i].a = qr, g[i].b = qr;fo(i, 1, m) c[i].w = qr, c[i].v = qr;sort(g + 1, g + 1 + n, [](good A, good B){return A.a < B.a;});sort(c + 1, c + 1 + m, [](rmm A, rmm B){return A.w < B.w;});int j = 1; ll ans = 0;fo(i, 1, n){while(j <= m && c[j].w <= g[i].a) q.push(c[j++].v);if(q.empty() || g[i].a - g[i].b >= q.top()) ans += g[i].b;else{ans += g[i].a - q.top(); q.pop();q.push(g[i].a - g[i].b);}}printf("%lld\n", ans);return Ratio;}
}
signed main(){return Wisadel::main();}
// 佳墙坂诶迦币等渔塞

C. IMAWANOKIWA (Construction ver.)

大粪掏题。

D. 魔法少女们

魔法题。

为什么只写了两个题就发,你是不是想摆烂?

因为 T1 打了一个下午,T3 看起来就要改很长时间,怕来不及记录就先发了。

谁问你了?

开场直接被隔壁发现是原题,甚至三天前的比赛直接搬。然后因为没人做过所以正常进行,输麻了。

状态?感觉不是,可能主要因为 T1 打了太久被影响了心态。其实 T1 当时已经打了正解的 \(\frac{3}{4}\) 左右了,考虑当时只剩一个半小时就没继续看,结果错误是弱智取模,输麻了。

T2 感觉也不该是想不出来的,不过丁真

image

T3 T4 压根不想看,感觉 T4 讲的优化是那种学了一辈子用不上几次的那种,粉兔讲题更是直言我卡你那个了就不会再卡这个,有点玄学。


完结撒花~

没有

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

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

相关文章

使用 roslyn 的 Source Generator 自动完成依赖收集和注册

roslyn Source Generator 使用案例在 使用 Hosting 构建 WPF 程序 提到,因为不使用 Stylet 默认的 IOC 容器,所以不能自动收集和注册 View/ViewModel,需要动手处理。 如果项目比较大,手动处理显然过于麻烦。这里使用 roslyn 的 Source Generator 自动完成依赖收集和注册。 …

高级语言程序设计第七次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400204 姓名:刘嘉奕 1.2.需要思维贯穿,逻辑性强3.刚开始没用指针,导致结果为负数,但在使用指针过程中还存在不…

叉积

向量基本运算点积叉积一.Transmitters由叉积的基本定理得出,要判断一个点c再一条直线ab的左边还是右边,只要看(b-a)*(c-a)大于0还是小于0,对于这题,我们可以将左右边看成发射范围的半圆,因为要找出覆盖最多点的数量,所以最优解肯定有一个点再直径上,再通过叉积找出所…

内核脏牛提权

脏牛靶机 已知靶机账号密码:msfadmin/msfadmin 靶机开启ssh服务开启靶机获取IP msfadmin/msfadmin登录 ifconfig #获取靶机IP得到靶机IP:192.168.213.247 开启kali ssh链接靶机 直接输入ssh msfadmin@192.168.213.247进行链接会出现报错 出现报错的原因是ssh客户端和服务器之…

[极客大挑战 2019]Secret

首页什么都没有,查看网页源码,发现有一个链接,提示found除去view-source访问,得到以下页面,点击secret直接查阅结束,没回显flag,依旧在卖关子。使用burp suite抓包获取返回的源码,找到注释中有个文件secr3t.php访问secr3t.php得到代码里说flag在flag.php里,直接访问fl…

今年测试这工资是认真的吗?

在如今的求职市场中,软件测试面试中的“八股文”几乎成为了一种必考内容。所谓“八股文”,指的是一系列标准化的技术面试题目,这些题目涵盖了测试理论、接口自动化测试、测试工具框架、性能测试、项目场景等多个方面...📝 博主首页 : 「码上生花」 ,同名公众号 :「伤心的…

开发人员,千万不要去碰那该死的业务参数,无论什么时候!

你好呀,我是歪歪。 前几天发了一个牢骚:本来只是单纯的吐槽一下,但是好多人对其中的细节比较感兴趣。 大家都是搞技术的嘛,对于“踩 BUG”这种喜闻乐见的事情,有兴趣是很正常的。 其实我这个 BUG,其实严格意义上不能叫做 BUG,因为和程序无关,甚至和技术的关系都不算大。…

java小课设:使用MySQL做一个聊天室

bro是个懒狗,耗时一个晚上,只写了一些基础功能,其他的可以根据需要自己添加实现思路:在MySQL数据库中设置一个message表,用来存储聊天信息,聊天界面输入的内容写入message表,用户程序每秒从MySQL中获取一次聊天记录,并加载进入自己的页面,实现聊天室。食用方法: Chat…

Quartz集群增强版_00.How to use?(如何使用)

Quartz集群增强版_00.How to use?(如何使用)转载请著名出处 https://www.cnblogs.com/funnyzpc/p/18540378开源地址 https://github.com/funnyzpc/quartz 表的基本结构 总的来说任务的配置及开发基本遵从上图的表的基本关系,除 app 以及 node 之外均需要手动手动配置,app…

开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)

说明: 1、本来这段时间是一年一度Hackaday硬件设计开源盛宴,但hackaday电子大赛在去年终结了。所以我开源个我的吧。 2、三代示波器的高速波形刷新方案,前两年就做好了,这两年忙H7-TOOL的更新比较多,三代示波器的更新就搁置了。但刷新方案是没问题的,开源分享给大家。 3、…

PSQL 环境安装配置

准备工作:安装包 plsqldev1400x64.msi 注册码 汉化包 chinese.exe 轻量级数据 instantclient_11_2 安装【PSQL】第一步大法操作! 默认的安装路径:C:\Program Files\PLSQL Developer 14安装【轻量级 instantclient_11_2】 复制或解压到 C:\Program Files\PLSQL Developer…

零声QT学习 一

int main(int argc, char *argv[]) {QApplication a(argc, argv);//QApplication a(argc, argv),针对QWidget应用程序,管理和设置Qt程序的运行//QGuiApplication a(argc, argv),针对非QWidget应用程序,如QQuick//QcoreApplication a(argc, argv),针对无界面的应用程序MainWindo…