NOIP2024加赛5

news/2024/12/25 13:37:51/文章来源:https://www.cnblogs.com/hzoi-Cu/p/18548487

喜欢每个包绑一个hack是吧。

暴力操作(opt)

容易发现答案具有单调性,考虑二分答案。还发现只需要处理\(1\sim \left\lceil\frac{n}{2}\right\rceil\)即可。

发现如果\(c_{i}>c_{j}且i<j\),那么选\(j\)肯定更优。

\(\left\lfloor\frac{a}{bc}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor\),所以用个类似埃筛的东西预处理一下,注意要多处理一点。

考虑\(\left\lfloor\frac{a}{b}\right\rfloor=c\)时,有\(\frac{a}{b}<c+1\Leftrightarrow b\ge\frac{a}{c+1}+1\)。用这个东西直接check即可,时间复杂度\(O(n\log m)\)

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCALFILE *InFile = freopen("in.in","r",stdin),*OutFile = freopen("out.out","w",stdout);// FILE *ErrFile = freopen("err.err","w",stderr);
#else// FILE *InFile = stdin,*OutFile = stdout;FILE *InFile = freopen("opt.in","r",stdin),*OutFile = freopen("opt.out","w",stdout);
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#define int long long
#define pii pair<int,int>
#define mk make_pair
const int N = 1e6 + 10;
int n,m,k,c[N],a[N],f[N];
inline bool check(int mid){int res = 0;rep(i,1,n/2+1,1) if(a[i] > mid) res += c[a[i]/(mid+1)+1];return res <= k;
}
inline void solve(){cin>>n>>m>>k;memset(c,0x3f,sizeof c);rep(i,1,n,1) cin>>a[i];sort(a+1,a+1+n);rep(i,1,m,1) cin>>c[i];drep(i,m,1,1) c[i] = min(c[i],c[i+1]);rep(i,2,m,1) rep(j,2,(m+1)/i+1,1) c[min(i*j,m+1)] = min(c[min(i*j,m+1)],c[i]+c[j]);drep(i,m,1,1) c[i] = min(c[i],c[i+1]);int l = 0,r = m,ans = 0;while(l <= r){int mid = (l + r) >> 1;if(check(mid)) ans = mid,r = mid - 1;else l = mid + 1;}cout<<ans<<'\n';
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);solve();
}

异或连通(xor)

模板:线段树分治。

发现每条边的出现位置是几个区间且区间个数不超过\(\log k\),证明转化为二进制即可,用一个trie维护,求出区间即可。

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCALFILE *InFile = freopen("in.in","r",stdin),*OutFile = freopen("out.out","w",stdout);
#else// FILE *InFile = stdin,*OutFile = stdout;FILE *InFile = freopen("xor.in","r",stdin),*OutFile = freopen("xor.out","w",stdout);
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
#define eb emplace_back
const int N = 1e5 + 10;
int n,m,q,k,u[N],v[N],c[N],qpos[N],ans[N];
pair<int,int> Q[N];
struct DSU{vector<int> fa,siz,sta;ll ans;inline void init(int n){fa.resize(n+1),siz.resize(n+1);rep(i,1,n,1) fa[i] = i,siz[i] = 1;ans = 0;}inline int get_fa(int x){while(x ^ fa[x]) x = fa[x];return x;}inline ll get(int x){return 1ll*x*(x-1)/2;}inline void Merge(int x,int y){x = get_fa(x),y = get_fa(y);if(x == y) return;if(siz[x] > siz[y]) swap(x,y);ans += 1ll*siz[x]*siz[y];fa[x] = y;siz[y] += siz[x];sta.eb(x);}inline void undo(){int x = sta.back();sta.pop_back();siz[fa[x]] -= siz[x];fa[x] = x;}inline void undo(int res){while(sta.size() > res) undo();}
}D;
struct SegmentTreeDivide{vector<int> t[N<<2];void upd(int k,int l,int r,int ql,int qr,int p){if(ql <= l && r <= qr) return t[k].eb(p);int mid = (l + r) >> 1;if(ql <= mid) upd(k<<1,l,mid,ql,qr,p);if(qr > mid) upd(k<<1|1,mid+1,r,ql,qr,p);}void qry(int k,int l,int r){int res = D.sta.size(),rans = D.ans;for(auto i:t[k]) D.Merge(u[i],v[i]);if(l == r) ans[l] = D.ans;else{int mid = (l + r) >> 1;qry(k<<1,l,mid);qry(k<<1|1,mid+1,r);}D.undo(res);D.ans = rans;}
}seg;
struct TRIE{int tree[N*29][2],l[N*29],r[N*29],tot = 0;inline int insert(int x,int id){int p = 0;drep(i,29,0,1){int k = (x>>i)&1;if(!tree[p][k]) tree[p][k] = ++tot,l[tot] = id;p = tree[p][k];r[p] = id;}return p;}inline void work(int x,int id){int p = 0;drep(i,29,0,1){int k1 = (x>>i)&1,k2 = (k>>i)&1;if(k2){if(tree[p][k1]) seg.upd(1,1,q,l[tree[p][k1]],r[tree[p][k1]],id);p = tree[p][k1^1];}else p = tree[p][k1];if(!p) break;}}
}trie;
int mp[N];
inline void solve(){cin>>n>>m>>q>>k;D.init(n);rep(i,1,m,1) cin>>u[i]>>v[i]>>c[i];rep(i,1,q,1) cin>>Q[i].first,Q[i].second = i;sort(Q+1,Q+1+q);rep(i,1,q,1) mp[Q[i].second] = i;rep(i,1,q,1) trie.insert(Q[i].first,i);rep(i,1,m,1) trie.work(c[i],i);seg.qry(1,1,q);rep(i,1,q,1) cout<<ans[mp[i]]<<'\n';
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);solve();
}

诡异键盘(keyboard)

不会。

民主投票(election)

发现如果一个人得到\(a\)票时可以,那么他得到\(b(b>a)\)票时也可以。

考虑二分。设\(f_{x,s}\)表示以\(x\)为根的子树,每个点最多有\(s\)票,需要往上传的票数。

那么对于一个点\(x\),设其子树大小(不包含自己)为\(s\),那么\(x\)最多有\(s\)票,二分求出
其他点能否满足每个点最多\(s − 1\)票的条件。

考虑求一个全局的\(s\)使得\(f_{1,s}=0\)(即每个点都不会超),那么 \(size >s\)\(size < s\)的点的答
案均确定了,只需考虑 \(size = s\)的点。此时用 \(s − 1\) 求出一个答案,容易发现由于 \(size_x = s\)\(f_{x,s−1} \le 1\),若\(f_{x,s−1}= 0\) 那么 \(f_{1,s−1}\)不会改变,因此 \(x\)点不能获胜,否则若 \(f_{1,s−1}\)和根到 \(x\) 链上所有点均为 \(1\)\(f_{1,s−1}\) 会改成 \(0\),故 \(x\)可以获胜。

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCALFILE *InFile = freopen("in.in","r",stdin),*OutFile = freopen("out.out","w",stdout);
#else// FILE *InFile = stdin,*OutFile = stdout;FILE *InFile = freopen("election.in","r",stdin),*OutFile = freopen("election.out","w",stdout);
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
const int N = 1e6 + 10;
int n,siz[N],now,f[N];
char s[N];
vector<int> e[N];
void dfs(int x){siz[x] = 0;for(int y:e[x]) dfs(y),siz[x] += siz[y] + 1;
}
bool check(int mid){auto dp = [&](auto &&dp,int x)->void{f[x] = 0;for(int y:e[x]) dp(dp,y),f[x] += f[y];f[x] = max(0,f[x] - mid) + 1;};dp(dp,1);return f[1] == 1;
}
void getans(int mid){auto get = [&](auto &&get,int x)->void{if(siz[x] == mid+1) return s[x] = '1',void();for(int y:e[x]) if(f[y] > 1) get(get,y);};get(get,1);
}
inline void solve(){cin>>n; rep(i,1,n,1) vector<int> ().swap(e[i]);rep(i,1,n,1) siz[i] = 0;rep(i,2,n,1){int f;cin>>f;e[f].emplace_back(i);}dfs(1);int l = 1,r = n,ans;while(l <= r){int mid = (l + r) >> 1;if(check(mid)) ans = mid,r = mid - 1;else l = mid + 1;}rep(i,1,n,1) s[i] = siz[i] > ans?'1':'0';check(ans-1);if(f[1] == 2) getans(ans-1);s[n+1] = '\0';cout<<s+1<<'\n';
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int T;cin>>T;while(T--) solve();
}
p

image
image
image
image
image
image
image
image
image
image
image
image

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

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

相关文章

团队作业4——项目冲刺-5

信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 白蓝昏紫队团队集体协作完成项目开发GitHub链接 https://www.cnblogs.com/zayer11/p/18545116团队简介 队名:白蓝昏紫队 队员姓名 学号许億驰 3122004883(组长)陈文杰 3122004858沈思敏 3122004877王峥…

文件共享服务之实时备份(inotify+rsync)

任务需求 1.对NFS服务器上的静态资源实时备份(inotify+rsync) 主机列表 # 外网地址 内网地址 主机名 192.168.122.207 172.16.1.207 web-test-209 192.168.122.231 172.16.1.231 nfs-test-231 192.168.122.241 172.16.1.241 rsync-test-241架…

专题四:信息安全

信息系统安全属性 机密性:确保信息不暴露给未授权的实体或进程。 完整性:只有得到允许的人才能修改数据,并且能够判断出数据是否已被篡改。 可用性:得到授权的实体在需要时可访问数据,即攻击者不能占用所有的资源而阻碍授权者的工作。 可控性:可以控制授权范围内的信息流…

生产环境中AI调用的优化:AI网关高价值应用实践

随着越来越多的组织将生成式AI引入生产环境,他们面临的挑战已经超出了初步实施的范畴。如果管理不当,扩展性限制、安全漏洞和性能瓶颈可能会阻碍AI应用的推广。实际问题如用户数据的安全性、固定容量限制、成本管理和延迟优化等,需要创新的解决方案。 本文我们深入探讨了一些…

MobileViT-v1-所有patch内相对位置相同的token之间计算自注意力

paper def my_self(x: torch.Tensor):通过这段代码 可以把每张图片图片中相对位置相同的若干个tokens放到最后两个维度# [B, C, H, W] -> [B, C, n_h, p_h, n_w, p_w] # n_h是高度方向上可以分多少个patch p_h patch的高度 n_w 宽度方向上可以分多少个patch p_w patch的宽…

27. 使用MySQL之全球化和本地化

1. 字符集和校对顺序 数据库表被用来存储和检索数据。不同的语言和字符集需要以不同的方式存储和检索。因此,MySQL需要适应不同的字符集(不同的字母和字符),适应不同的排序和检索数据的方法。 在讨论多种语言和字符集时,将会遇到以下重要术语:字符集为字母和符号的集合;…

TCP/IP上三层协议

TCP/IP上三层的角色 同一台设备上的进程间通信有多种方式,如管道、消息队列、共享内存、信号等。而不同设备间的进程通信需要网络通信,由于设备具有多样性,因此协商出了一套通用的网络协议。这个网络协议是分层的,每一层都有各自的作用和职责,接下来将依据 “TCP/IP 网络模…

无线部分

AC堆叠(VAC) 配置两台AC设备,使用虚拟化方案组合成1台虚拟AC。 AC1和AC2之间的G 0/3-4端口作为虚拟交换链路。配置AC1为主,AC2为备。主设备 description为AC1,备用设备description为AC2。 AC1 virtual-ac domain 100device 1 device 1 priority 200 device 1 description …

DHCP欺骗

DHCP 欺骗原理DHCP 协议(Dynamic Host Configuration Protocol) 动态主机配置协议:主要给客户机提供 TCP/IP 参数,包括:IP 地址、子网掩码、网关、DNS、租期工作原理应用层协议,基于UDP 主机向服务器 67 号端口发送 DHCP 请求 服务器响应给客户机的 68号端口配置设置DHCP 服…

Redis运行的时候碰到# Creating Server TCP listening socket *:6379: bind: No error

Redis运行的时候碰到# Creating Server TCP listening socket *:6379: bind: No error 解决方案: 1、启动redis客户端:redis-cli.exe。 2、执行关闭命令:输入shutdown3、执行退出命令:exit4、重新启动Redis输入:redis-server.exe redis.windows.conf

https实验

https 实验原理httphttps https = http + SSL/TLS •SSL: Secure Socket Layer 安全套接层 •TLS: Transport Layer Security 传输层安全协议加密方式:PKI(公钥基础设施)使用公钥技术和数字签名来保证信息安全由公钥密码算法、数字证书(Certificate)、CA(Certificate Aut…

手把手教你搭建OpenScenario交通场景(上)

经纬恒润动力学仿真软件ModelBase基于OpenScenario1.0标准,开发内嵌了场景编辑器,可用于对仿真测试过程中的车辆行驶道路模型之外,继续进行周边动态场景的搭建。 OpenScenario是一种专为自动驾驶系统仿真测试设计的场景描述语言,它基于XML格式,旨在提供一个标准化、…