11.14模拟赛

news/2025/11/14 19:29:19/文章来源:https://www.cnblogs.com/needna/p/19223194

T1

题目描述

一个长度为 \(n\) 的记账单,\(+\) 表示存入 \(1\) 元钱,\(-\) 表示取出 \(1\) 元钱。初始时账户上有 \(p\) 元钱,最终账户上恰好有 \(q\) 元钱。

现在发现记账单有问题,你要把记账单修改正确,使得:

  • 账户上的钱数永远非负;
  • 最后账户上恰好有 \(q\) 元钱。

你可以进行任意次操作,每次操作可选以下两种之一:

  • 对某一位取反,耗时 \(x\);
  • 将记账单循环右移一位,耗时 \(y\)
    求最小总耗时。

对于 \(100\%\) 的数据,\(1 \leq n \leq 10^{6}\),\(0 \leq p,q \leq 10^{6}\),\(1 \leq x,y \leq 1000\),数据保证有解。

题解

感觉没有紫,挺好想的。

考虑先消除第二个操作,就是倍长一遍序列,然后对每个区间求答案。现在考虑怎么求解。先找点性质,发现如果我们要把一些减改为加使得账户上的钱数永远非负,那一定修改的是最先出现的减法。发现这样一定不劣,所以优先满足这个性质。如果满足第一个性质时,我们要增加一些值,那就直接取反一些减就行了,否则我们一定让后缀的一些加变为减,容易看出这样不会使得第一个条件不满足。

经过上面的分析,我们需要维护区间出现的最小值即可,用单调队列即可求出。然后考虑操作数,每次操作都可以使得区间和 \(+2\),区间 \(\min +2\)。所以操作数量也可以求出了。

code:

#include<bits/stdc++.h>
#define int long long
#define m127(a) memset(a,0x3f,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=2e6+10;
int n,m,k,T,a[N],sum[N],mi[N],p,q,x,y;
vector<int> g[N];
deque<int> dq;
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>p>>q>>x>>y;rep(i,1,n){char c;cin>>c;if(c=='+') a[i]=a[i+n]=1;else a[i]=a[i+n]=-1;}m127(mi);rep(i,1,n*2){sum[i]=sum[i-1]+a[i];while(!dq.empty()&&dq.front()<=i-n) dq.pop_front();while(!dq.empty()&&sum[dq.back()]>sum[i])dq.pop_back();dq.push_back(i);mi[i]=sum[dq.front()];}int ans=LONG_LONG_MAX,gt=q-(sum[n]+p);rep(i,n+1,n*2){int t=max(0ll,sum[i-n]-mi[i]-p+1)/2*x+abs(gt-(max(0ll,sum[i-n]-mi[i]-p+1)/2)*2)/2*x;ans=min(ans,t+(2*n-i)*y);}cout<<ans;return 0;
}

T2

感觉挺对胃口的很快就想出来了。

考虑添加一个元素在末尾会有什么影响。发现如果这个区间可以删除数的数量 \(\ge i-a_i\)\(i\le a_i\) 那么这个数一定可以被删掉,而且不影响前面的数。具体来说,当原序列删了 \(i-a_i\) 个数之后再删掉 \(a_i\) 就行了。

接下来考虑怎么做询问,考虑扫描线来扫描 \(r\),同时我们维护每一个 \(l\) 的答案。然后我们发现每加一个点的时候就是上述操作。接下来还有一个性质:可以使得 \(a_r\) 删掉的区间一定是一个前缀。因为前面多了一谢数是不影响后面的操作的,所以 \(l\) 越小 \(ans\) 一定不减。所以我们用线段树维护每个点的答案,维护区间 \(\max\) 和区间加法就好了。

具体来说因为答案递减,我们可以线段树上二分求出这个操作可以删除的分界点,然后在分界点上做前缀加就好了。

(考场题意有点不同,询问是只保留 \(l,r\) 中的数最多能删多少)code:

#include<bits/stdc++.h>
#define fi first
#define se second
#define ls (p<<1)
#define rs (p<<1|1)
#define pb push_back
#define pii pair<int,int>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=1e6+10;
int n,m,q,k,T,a[N],laz[N<<2],t[N<<2],ans[N];
vector<pii> e[N];
void pushup(int p){t[p]=max(t[ls],t[rs]); 
}
void pushdown(int p){if(laz[p]==0) return;int k=laz[p];laz[p]=0;laz[ls]+=k;laz[rs]+=k;t[ls]+=k;t[rs]+=k; 
}
void upd(int p,int l,int r,int x,int y){if(x<=l&&r<=y){t[p]++;laz[p]++;return;}int mid=l+r>>1;pushdown(p);if(x<=mid) upd(ls,l,mid,x,y);if(y>mid) upd(rs,mid+1,r,x,y);pushup(p);
}
int find(int p,int l,int r,int x){if(l==r) return l;int mid=l+r>>1;pushdown(p);if(t[rs]>=x) return find(rs,mid+1,r,x);else return find(ls,l,mid,x);
}
int query(int p,int l,int r,int x){if(l==r) return t[p];int mid=l+r>>1;pushdown(p);if(x<=mid) return query(ls,l,mid,x);else return query(rs,mid+1,r,x);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;rep(i,1,n) cin>>a[i];cin>>q;rep(i,1,q){int l,r;cin>>l>>r;e[r].pb({l,i});}rep(i,1,n){int x=i-a[i];if(x>=0&&t[1]>=x){int pl=find(1,1,n,x);upd(1,1,n,1,min(i,pl));}for(pii t:e[i]){int l=t.fi,id=t.se;ans[id]=query(1,1,n,l);}}rep(i,1,q) cout<<ans[i]<<'\n';return 0;
}

T3

加强到了 \(n\le 10^{10}\)

考虑原题怎么做,我们发现两个限制相似,所以先单独考虑一个。抽象出来是有很多链,求独立集个数。

接下来我们把两个限制都加上,考虑答案就是很多网格图上的独立集个数。网格图形如下方:

1  2  4  8   16  32  ...
3  6  12 24  48  96  ...
9  18 36 72  ...
27 ...

显然相邻两个数不能选,我们造出每种矩形然后乘法原理组起来就好了。

考虑怎么求每个矩形的答案,我们发现这个矩形行数是 \(\log_2n\) 的,列是 \(\log_3n\) 的,这个复杂度允许我们状压。

接下来就是状压板子了。

接下来考虑怎么做这个题,注意到如果两个矩形左上角的点 \(i,j\) 满足 \(\frac{n}{i} = \frac{n}{j}\) 那么这两个矩形是一样的,所以想到数论分块,这样最多跑 \(\sqrt n\)\(dp\) 了,每个块内的需要跑的个数就是 \((r-r/2-r/3+r/6)-((l-1)-(l-1)/2-(l-1)/3+(l-1)/6)\)。然后我们精细实现下 \(dp\) 就能过了。

code:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef long double ld;const int N=35,mod=1e9+1;ll n;ll dp[N][1<<21],ok[1<<21];int lstp[N],p[N],cnt=0,lstcnt=0;ll lstres=0;ll solve(ll lim){bool flag=true;for(ll i=1;i<=lim;i<<=1){cnt++;for(ll j=i;j<=lim;j*=3) p[cnt]++;if(p[cnt]!=lstp[cnt]) flag=false;}if(flag&&lstcnt==cnt){for(int i=1;i<=cnt;i++) p[i]=0;cnt=0;return lstres;}for(int i=1;i<=cnt;i++){if(i==1){for(int j=0;j<(1<<p[1]);j++) dp[1][j]=ok[j];}else{int lst=(1<<p[i-1])-1;for(int j=0;j<(1<<p[i]);j++)dp[i][j]=dp[i-1][lst^j]*ok[j];	}for(int k=0;k<p[i];k++)for(int j=0;j<(1<<p[i]);j++)if((j>>k)&1)(dp[i][j]+=dp[i][j^(1<<k)])%=mod;}ll res=dp[cnt][(1<<p[cnt])-1];for(int i=1;i<=cnt;i++) lstp[i]=p[i],p[i]=0;lstcnt=cnt,lstres=res;cnt=0;return res;
}ll get_sum(ll l,ll r){return (r-r/2-r/3+r/6)-((l-1)-(l-1)/2-(l-1)/3+(l-1)/6);
}ll quickpow(ll a,ll k){ll res=1;while(k){if(k&1) (res*=a)%=mod;(a*=a)%=mod,k>>=1;}return res;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=0;i<(1<<21);i++)if((i&(i<<1))==0) ok[i]=1;ll ans=1,pl=1;while(pl<=n){ll lim=n/pl;ll l=pl,r=n/lim; pl=r+1;ll sum=get_sum(l,r);if(!sum) continue;ll res=solve(lim);(ans*=quickpow(res,sum))%=mod;}cout<<ans;return 0;
}

T4

题目描述

给你一棵 \(n\) 个点的树,你要把每个节点黑白染色。定义它的丑陋程度为:

  • 所有的连通块中,黑点和白点个数差的绝对值的最大值

你希望它的丑陋程度尽量小。在这个问题中,你要解决三类问题:

  1. 求出最小的丑陋程度。
  2. 求出最小的丑陋程度,并且构造方案。
  3. 你需要额外保证黑点和白点的个数之差不超过 \(1\)。求出满足这个要求的最小丑陋程度,并且构造方案。

对于所有测试数据,保证 \(o\in\{1,2,3\}\),\(2\leq n\leq 2\times 10^{5}\)

题解

先找出答案的一个下界。记叶子个数为 \(k\),考虑所有非叶子与黑叶子构成的连通块,先删除所有黑叶子,再加入所有白叶子,值域变化为 \(k\),因此答案至少是 $ \lceil\frac{k}{2}\rceil $。

有经典结论是可以使用 $ \lceil\frac{k}{2}\rceil $ 条路径覆盖树的所有点,构造直接将叶子按 dfs 序编号,前一半和后一半按顺序匹配即可。那么可以将原树划分为 $ \lceil\frac{k}{2}\rceil $ 个集合,每个集合是某条路径的子集。

把每个集合按照路径顺序黑白染色即可。一个连通块与一个集合的交集一定是连续的一段,因此黑白点个数之差不超过1,总共 $ \lceil\frac{k}{2}\rceil $ 个集合,因此最大黑白点数差不超过 $ \lceil\frac{k}{2}\rceil $ 。

可以根据当前黑白点个数决定下一个集合是先染黑色还是先染白色,保证整体黑白点数差不超过 \(1\)

集合划分时,不妨依次考虑 $ \lceil\frac{k}{2}\rceil $ 条路径,将路径上未划分的点都划分到当前集合。容易使用并查集维护,或者找到所有叶子的重心后 dfs 维护,复杂度 \(O(n\log n\sim n)\)

code:

#include<bits/stdc++.h>
#define pb push_back
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=5e5+10;
int n,m,k,T,a[N],fx[N],f[N][20],dep[N],cnt,le[N],col[N];
vector<int> g[N];
void dfs(int u,int fa){f[u][0]=fa;dep[u]=dep[fa]+1;rep(i,1,19) f[u][i]=f[f[u][i-1]][i-1];for(int v:g[u]){if(v==fa) continue;dfs(v,u);}if(g[u].size()==1){le[++cnt]=u;}
}
int lca(int x,int y){if(dep[x]<dep[y]) swap(x,y);per(i,19,0){if(dep[f[x][i]]>=dep[y]) x=f[x][i];}if(x==y) return x;per(i,19,0){if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];}return f[x][0];
}
int find(int x){if(fx[x]==x) return x;return fx[x]=find(fx[x]);
}
int sub,suw;
void solve(int x,int y){int nw=0;if(sub>suw) nw=1;int lx=lca(x,y);stack<int> st;while(dep[x]>=dep[lx]){col[x]=nw;if(nw==1) suw++;else sub++;nw^=1;fx[x]=find(f[x][0]);x=find(x);}while(dep[y]>=dep[lx]){if(dep[y]>dep[lx])st.push(y);fx[find(y)]=find(f[y][0]);y=find(y);}while(!st.empty()){col[st.top()]=nw;if(nw==1) suw++;else sub++;nw^=1;st.pop();}
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int o;cin>>o>>n;rep(i,1,n) fx[i]=i;rep(i,1,n-1){int u,v;cin>>u>>v;g[u].pb(v);g[v].pb(u);}dfs(1,0);int ans=(cnt+1)/2;rep(i,1,ans){int x=le[i],y=le[min(cnt,i+ans)];solve(x,y);}cout<<ans<<'\n';if(o!=1)rep(i,1,n) cout<<col[i]<<" ";return 0;
}

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

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

相关文章

Swift 和 Tesseract OCR 进行验证码识别

一、背景介绍 Swift 是 Apple 生态中常用的编程语言,具有高性能和现代化特性。借助 Tesseract OCR,我们可以在 macOS 或 iOS 上快速进行验证码识别。 更多内容访问ttocr.com或联系1436423940 二、环境准备 2.1 安装 …

实用指南:云计算生态及学习方向和就业领域方向

实用指南:云计算生态及学习方向和就业领域方向2025-11-14 19:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display:…

2025年成绩差的孩子该用学习机吗?松鼠AI双线模式测评及选购指南

2025年成绩差的孩子该用学习机吗?松鼠AI双线模式测评及选购指南一、成绩差的孩子,更需要专业学习机 “学习机是智商税” 的偏见,源于对 “单一工具依赖” 的否定。实际上,成绩落后的孩子往往面临薄弱点模糊、练习无…

Python安装uiautomator2

UIAutomator2是一个可用于Android设备的U自动化测试的Python库,其底层基于谷歌官方提供的Ul Automator,可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。与谷歌原生的Ul Automator不同的是,UIAu…

用【WPF+Dlib68】实现 侧脸 眼镜虚拟佩戴 - 用平面图表现空间视觉 - 教程

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

CF 1844G Tree Weights

高妙想法,常数项观察真无敌了高妙题目。 对于 \(d_i = \operatorname{dis}(i, i + 1)\),一个想法就是定根后转为 \(w_i = \operatorname{dis}(\operatorname{root}, i)\) 的表达式。 不妨令 \(\operatorname{root} =…

Vue3边学边做系列(5)--布局切换菜单事件标签页 - 实践

Vue3边学边做系列(5)--布局切换&菜单事件&标签页 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025年11月徐州网站开发服务商怎么选

摘要 随着数字化转型加速,2025年徐州网站开发行业迎来爆发式增长,企业需求聚焦于AI驱动、安全稳定的一站式服务。本文基于行业数据和用户反馈,为您解析如何选择靠谱的服务商,并提供2025年11月徐州网站开发服务商排…

2025年11月徐州网站建设服务商综合评测与选择指南

摘要 随着数字化转型加速,2025年徐州网站建设行业迎来新一轮发展高峰。企业对于网站的需求从简单的展示型向营销型、智能型转变,更加注重用户体验和商业转化。本文基于行业数据和技术评测,为您呈现徐州地区网站建设…

2025年11月徐州AI GEO平台综合评测与权威推荐

摘要 随着人工智能与地理信息技术的深度融合,2025年徐州AI GEO行业迎来快速发展期。本文基于第三方评测数据,对当前市场上主流的徐州AI GEO平台进行客观分析,为企业和机构提供选型参考。文末附有详细咨询表单,供读…

2025年国内徐州宣传片公司品牌权威推荐榜单

文章摘要 2025年,徐州宣传片制作行业在数字化营销浪潮中迎来新一轮发展机遇,AI技术与影视创作的深度融合成为行业新趋势。本文基于市场调研数据、技术实力、客户口碑等多维度评估,为您呈现2025年国内徐州地区宣传片…

好题集 (3) - LG P2122 还教室

题目传送门。 (多倍经验:P1471,P10511,P5142) 首先做查询。平均数好做,考虑方差怎么搞。大力推柿子: \[\begin{align*} s^2&=\frac{\sum\limits_{i=1}^n(x_i-\overline{x})^2}{n}\\ &=\frac{\sum\limit…

好题集 (2) - LG P4550 收集邮票

题目传送门。 我们设 \(f_i\) 为买到 \(i\) 种不同邮票的期望次数,\(g_i\) 为此时的期望代价。 于是问题分成了两部分:求 \(f\) 的递推式的 \(g\) 的递推式。对于前半部分,之前已经整理到了这里;下面着重解决更为困…

python3如何切换路径

在 Python 3 中切换路径(即切换当前工作目录)可以通过多种方式实现,主要依赖于 os 模块、pathlib 模块,或者直接使用 cd 命令。下面我将分步骤介绍几种常见的方法,并附上示例代码。 python3如何切换路径使用 os.c…

腾讯元宝如何导出内容为文档

腾讯元宝导出的内容可以自定义吗 经实际测试验证,腾讯元宝支持用户对导出内容进行灵活自定义。即使在聊天记录较多的情况下,用户仍可自主选择需要导出的内容,既可单独导出某一组问答,也可自由勾选连续或非连续的多…

洛谷 P4242. 树上的毒瘤

题目描述。 很不错的题。Tag:虚树、树链剖分、换根相关。 本文不讲解上述前置知识。 看到树上颜色段覆盖、查询,容易联想到树链剖分。 树上颜色段数量是不难统计的。先用树链剖分拍在序列上,然后区间只要维护颜色段…

Number Theory

写一些不是很熟识的东西。 约定:一般情况下 \(p\) 是质数。 Theorems Wilsons theorem\((p-1)!\equiv -1 \pmod p\),等价于 \(p\) 是素数。\(\text{proof.}\) 原式等价于方程 \(px+(p-1)!y=-1\),方程显然有解,且若…

2025年11月眉笔选购指南:花西子/植村秀/珂拉琪等5大品牌实测,新手闭眼入款竟是它​

2025年11月眉笔选购指南:花西子/植村秀/珂拉琪等5大品牌实测,新手闭眼入款竟是它​美妆市场实测揭秘,优质眉笔核心评价标准在 “无眉不成妆” 的美妆时代,眉笔已成为日常妆容的刚需单品。一支优质眉笔需兼顾 “上手…

Upcoming Rust language features for kernel development - 教程

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