noip模拟9

news/2024/11/13 10:00:07/文章来源:https://www.cnblogs.com/ccjjxx/p/18537930

来自官方题解.md

星际联邦

做法比较多,可以直接用 Prim 来做,但最简单的做法仍然是考虑 Borůvka 算法,我们在每一轮需要找到这个点向外到另一个联通块内的最小边。注意到当 \(i\) 固定时,最小边要么是前缀 \([1, i)\) 的最大值取到的,要么是 \((i, n]\) 内的最小值取到的。我们只需要对每个前缀维护最大值,以及和最大值不在同一个联通块内的最大值,就可以快速求出该联通块向外的最小边。总的时间复杂度为 \(O(n \log n)\)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=3e5+1;
const int INF=1e9;
int n, a[300005];
LL ans;
struct Node{int val,id;
} s[300005];
bool cmp(Node a,Node b)
{return a.val < b.val;
}
signed main() {// freopen("a.in", "r", stdin);freopen("star.in", "r", stdin);freopen("star.out", "w", stdout);cin>>n;for (int i=1;i<=n;i++)cin>>a[i],s[i].id=i,s[i].val=a[i];sort(s+1,s+1+n,cmp);int j=0;int maxn=-INF;for(int i=1;i<=n;i++){if(s[i].id<=j)continue;int dmax=-INF;while(j<s[i].id){j++;if(j==s[i].id){dmax=max(dmax,a[j]);break;}int del=min(s[i].val-a[j],a[j]-dmax);if (del<a[j]-maxn)dmax=max(dmax,a[j]);else maxn=max(maxn,a[j]),del=a[j]-maxn;ans+=del;}if(i>=2)ans+=s[i].val-maxn;maxn=max(maxn,dmax);}printf("%lld\n",ans);return 0;
}

和平精英

首先考虑枚举按位与和按位或的值,假设结果是 \(val\),那么显然所有 \(a_i<val\) 都应该放到 or 集合里,所有 \(a_i>val\) 都应该放到 and 集合里,如果暴力 check 可以做到 \(O(nQV)\)

考虑再发掘一些性质,考虑枚举 \(val\) 的 popcount,设为 \(p\),那么显然所有 \(popcount(a_i)<p\) 都应该放到 or 集合里,所有 \(popcount(a_i)>p\) 都应该放到 and 集合里,\(popcount(a_i)=p\) 的把上面的结论拉下来发现这些数应当全部相等,如果暴力 check 可以做到 \(O(nQ \log v)\),大概有 25pts。

然后考虑直接离线分治回答询问,可以轻松做到 \(O(n\log^2 n)\),如果你不幸写了一个根号复杂度,也可以获得多于暴力的分数。

摆烂合唱

为了方便描述,下面的部分都在表达式树上进行。

分析一下:如果一个变量 \(i\)(叶结点)的取值影响到了整个表达式(根结点 1)的值,那么必然是 \(i\) 到 1 这条路径上每一个点的值都被影响,所以我们设 \(f(u, j)\) 表示当 \(u\) 的左/右(对应 \(j=0\)\(j=1\))子结点的值分别取 0,1 时 \(u\) 的值不同的概率,那么答案就应该是 \(i\) 到 1 这条链上 \(f(u, j)\) 的乘积。

\(g(i)\) 表示随机情况下 \(i\) 点的值为 1 的概率,以 and 型结点,\(j=0\) 为例,如果 \(r s_i\) 的值为 0,那么 \(l s_i\) 就不能影响 \(i\) 的取值(\(i\) 的值总是 0),否则就能影响,所以 \(f(i, 0)=g\left(r s_i\right)\)

做 DP 过程中算出 \(g(i)\) 外顺带算出 \(f(i, 0)\),最后 DFS 一次求出一个点到根节点链上的 \(f(u, j)\) 的积,即可快速得到答案。

时间复杂度为 \(O(n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5,mod=998244353,inv2=((mod+1)>>1);
struct Node{int typ,ch[2];}tr[N];
int get(char x)
{if(x=='x')return 0;if(x=='&')return 1;if(x=='|')return 2;if(x=='^')return 3;assert(false); 
}
int n,cnt=0,rt,f[N],g[N][2];char s[N<<1];
stack<int>st;stack<pair<int,int>>op;
void build() {int len=strlen(s+1);for(int i=1;i<=len;i++){if(s[i]=='x')st.push(++cnt);if(s[i]=='|'||s[i]=='&'||s[i]=='^')op.push({++cnt,get(s[i])});if(s[i]==')'){int u=st.top();st.pop();int v=st.top();st.pop();pair<int,int>t=op.top();op.pop();tr[t.first].ch[0]=v;tr[t.first].ch[1]=u;tr[t.first].typ=t.second;st.push(t.first);}}rt=st.top();return;
}
void dfs(int u)
{if(!u)return;if(tr[u].typ==0){g[u][0]=g[u][1]=inv2;return;}int v0=tr[u].ch[0],v1=tr[u].ch[1];if(v0)dfs(v0);if(v1)dfs(v1);if(tr[u].typ==1)g[u][0]=(1-1ll*g[v0][1]*g[v1][1]%mod+mod)%mod;if(tr[u].typ==2)g[u][0]=1ll*g[v0][0]*g[v1][0]%mod;if(tr[u].typ==3)g[u][0]=(1ll*g[v0][0]*g[v1][0]%mod+1ll*g[v0][1]*g[v1][1]%mod)%mod;g[u][1]=(1-g[u][0]+mod)%mod;return;
}
void getans(int u)
{if(!u||tr[u].typ==0)return;int v0=tr[u].ch[0],v1=tr[u].ch[1];if(tr[u].typ==1){f[v0]=1ll*f[u]*g[v1][1]%mod;f[v1]=1ll*f[u]*g[v0][1]%mod;}if(tr[u].typ==2){f[v0]=1ll*f[u]*g[v1][0]%mod;f[v1]=1ll*f[u]*g[v0][0]%mod;}if(tr[u].typ==3){f[v0]=f[v1]=f[u];}getans(v0);getans(v1);return;
}
int main()
{freopen("binary.in","r",stdin);freopen("binary.out","w",stdout);scanf("%d %s",&n,s+1);build();dfs(rt);f[rt]=1;getans(rt);for(int i=1;i<=cnt;i++){if(tr[i].typ==0)printf("%d\n",f[i]);}	return 0;
}

对称旅行者

考虑先求旅行者 \(i\) 的期望位置,设为 \(f_i\),那么答案就为 \(f_i * 2^{m K}\)

当旅行者 \(i\) 旅行时时,由于期望的线性性,\(f_i \longleftarrow \frac{1}{2}\left(2 f_{i-1}-f_i+2 f_{i+1}-f_i\right)=f_{i-1}+f_{i+1}-f_i\),考虑其几何含义,发现是把 \(f_i\) 关于 \(f_{i-1}\)\(f_{i+1}\) 的中点对称,如果设 \(g_i=f_{i+1}-f_i\),那么跳第 \(i\) 枚棋子相当于交换 \(g_{i-1}\)\(g_i\)

因此一轮旅行就对应一个 \(1 \sim n-1\) 的置换,用类似快速幂的方法就可以求出 \(K\) 轮旅行后的 \(\left\{g_i\right\}\),再注意到 \(f_1\) 始终不变,就可以求出所有棋子的期望位置,时间复杂度为 \(O(n \log K)\)

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

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

相关文章

【Mplus 8.7软件下载与安装教程】

1、安装包 Mplus 8.7: 链接:https://pan.quark.cn/s/128e81c51dbe 提取码:1X7B Mplus 8.3: 链接:https://pan.quark.cn/s/5ea5ff583480 提取码:Vdjt Mplus 7.4: 链接:https://pan.quark.cn/s/414ec0c8cb14 提取码:8jhm 2、安装教程 1) 双击Mplus8.7 Demo(64-bi…

Day13 备战CCF-CSP练习

202312-3Day 13 题目描述 题目分析 大模拟,用栈储存每一个多项式,最后根据导数的加法原则依次求导相加,注意取模。 C++代码 #pragma GCC optimize(3, "Ofast", "inline") #include <bits/stdc++.h> #define int long longusing namespace std; co…

OOP实验三

任务1: 源码:1 #pragma once2 3 #include <iostream>4 #include <string>5 6 using std::string;7 using std::cout;8 9 // 按钮类 10 class Button { 11 public: 12 Button(const string &text); 13 string get_label() const; 14 void click()…

鸿蒙NEXT开发案例:转盘1W

【1】引言(完整代码在最后面) 在鸿蒙NEXT系统中,开发一个有趣且实用的转盘应用不仅可以提升用户体验,还能展示鸿蒙系统的强大功能。本文将详细介绍如何使用鸿蒙NEXT系统开发一个转盘应用,涵盖从组件定义到用户交互的完整过程。 【2】环境准备 电脑系统:windows 10 开发工…

开源 - Ideal库 - 常用时间转换扩展方法(二)Qv

合集 - Ideal库 - Common库(2)1.开源 - Ideal库 - 常用时间转换扩展方法(一)11-07:悠兔机场2.开源 - Ideal库 - 常用时间转换扩展方法(二)11-09收起 书接上回,我们继续来分享一些关于时间转换的常用扩展方法。01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为Date…

存储器的知识

以W25Q256为例子(外部Flash),结构如下:扇区的内部结构以F10系列为例子 64位代表的是8个字节的数据,一个地址最多可以存储8个字节的数据(double数据类型就是8个字节),4k,16k,64k,32k代表的是地址的总数,主存储块又可以分为很多个页,页里面也有存储的空间大小嵌入式闪存的组成

什么是git,什么是github,git和github的使用

Git实战注意:本项目是学习笔记,来自于哔哩哔哩武沛齐老师的Git实战视频, 网址:【武沛齐老师讲git,看完绝对上瘾!!!】 https://www.bilibili.com/video/BV1ne4y1E7np/?share_source=copy_web&vd_source=2c9a5d5590d3759367594e264ff079c4另外,因为这个博客是我直接…

law Intermediate walkthrough pg

靶场很简单分数只有10分跟平常做的20分的中级靶场比确实简单 我拿来放松的 算下来30分钟解决战斗 nmap 扫到80端口web界面 是个框架 搜exp https://www.exploit-db.com/exploits/52023 他的脚本可能有点问题看不到回显 我们审脚本直接看到漏洞点所在 命令执行 curl -s -d "…

streamlit run执行报错,Invalid value: File does not exist: XXX.py

streamlit run执行报错,Invalid value: File does not exist: XXX.py 在终端执行 streamlit run xxx.py 的时候报错提示 Invalid value: File does not exist: XXX.py 网上众说纷纭,但是我个人的解决方法其实非常简单 在终端中执行的时候会发现中间多了个warning翻译过来就是…

03_muduo_base3

5.6 互斥锁和条件变量的封装 类图该类是封装了互斥锁的一些基本操作,包括互斥锁的初始化、销毁、上锁、解锁等功能。但是实际上使用RAII技术又封装了一个类,那就是MutexLockGuard。这主要也是采取了类似智能指针的封装思路,让互斥锁的生命周期交给操作系统去管理,释放的时机…

B样条(BSpline,即 Basis Spline)

B 样条(BSpline)是一种在计算机图形学、计算机辅助设计、数值分析等领域广泛应用的数学曲线和曲面表示方法。以下是对 B 样条的详细定义: 一、基本概念 B 样条是基于一系列控制点(Control Points)来定义曲线或曲面的。它通过一个特定的基函数(Basis Functions)集合与这些…

实验3 类和对象

实验任务1: button.hpp#pragma once#include <iostream> #include <string>using std::string; using std::cout;// 按钮类 class Button { public:Button(const string &text);string get_label() const;void click();private:string label; };Button::Butto…