2024.9.24 模拟赛 CSP4

news/2024/10/4 0:18:16/文章来源:https://www.cnblogs.com/ppllxx-9G/p/18440644

模拟赛

暴力场。出题人学政治的?

T1 商品

值域线段树

直接看值域上,每两个相邻的点的差提供的贡献,相当于值域上某一区间每一个位置都有 \(1\) 的贡献再减一。

所以直接值域线段树,查询区间和。贪心发现左右端点一定挂在某个点上时最优。注意左右端点挂住的情况分别跑一遍。

边界处理比较细节。

code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define LL long long
const int N = 2e5+5,MAX = 1e9+5;
int n,d;
int a[N],rt;
namespace DSEG
{struct T{int l,r; LL lz,sum;} tr[N<<6];int tot;inline void pushup(int k) {tr[k].sum=tr[tr[k].l].sum+tr[tr[k].r].sum;}inline void pushdown(int k,int l,int r){if(tr[k].lz){int lz=tr[k].lz; tr[k].lz=0;if(!tr[k].l) tr[k].l=++tot;if(!tr[k].r) tr[k].r=++tot;int mid=(r-l>>1)+l;tr[tr[k].l].lz+=lz; tr[tr[k].l].sum+=lz*(mid-l+1);tr[tr[k].r].lz+=lz; tr[tr[k].r].sum+=lz*(r-mid);}}inline void mdf(int &k,int l,int r,int L,int R,int v){if(L>R) return;if(!k) k=++tot;if(l>=L&&r<=R){tr[k].lz+=v; tr[k].sum+=(r-l+1)*1ll*v; return;}pushdown(k,l,r);int mid=(r-l>>1)+l;if(L<=mid) mdf(tr[k].l,l,mid,L,R,v);if(R>mid) mdf(tr[k].r,mid+1,r,L,R,v);pushup(k);}inline LL que(int k,int l,int r,int L,int R){if(L>R) return 0;if(!k) return 0;if(L<=l&&r<=R) return tr[k].sum;pushdown(k,l,r);int mid=(r-l>>1)+l; LL res=0;if(L<=mid) res+=que(tr[k].l,l,mid,L,R);if(R>mid) res+=que(tr[k].r,mid+1,r,L,R);return res;}
} using namespace DSEG;main()
{freopen("goods.in","r",stdin);freopen("goods.out","w",stdout);scanf("%lld%lld",&n,&d); rt=++tot;for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int i=1;i<n;i++){LL l=min(a[i],a[i+1]),r=a[i+1]-l+a[i];mdf(rt,1,MAX,l+1,r,1);}LL ans=0;for(int i=1;i<=n;i++){ans=max(ans,que(rt,1,MAX,a[i]+1,min(1ll*a[i]+d,1ll*MAX)));ans=max(ans,que(rt,1,MAX,max(1ll,a[i]-d+1),a[i]));}printf("%lld\n",ans);return 0;
}

、# 二分

\(\sum_{i=1}^{n-1}|b_i-b_{i+1}|\),另 \(b_i,b_{i+1}\) 中较大的为 \(a\),较小的为 \(b\)

\(\sum a-b=\sum a-\sum b\)。排序后,对于每个 \([l,r]\) 区间,\(a,b\) 都会被分成三段,二分找到转折点,两边直接求和,中间前缀和维护好求。

无码。。。

T2 价值

巨型树上分讨。

题意就是树的叶子加一圈边,求独立集方案数(一条边只能选一个点)。

先考虑没有那一圈边,直接 dp,加上那一圈边,那么就要讨论叶子是否连边。

设计状态 \(f_{u,0/1,0/1/2,0/1/2}\) 表示根为 \(0/1\),选或不选,\(0/1/2\),子树最左/右侧的叶子 一定不选/可以被选(还没选)/已经选了。

树型分讨还得多练。

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e5+5,mod = 998244353;
int n,mn=1e9,mx;
vector<int> g[N];
LL f[N][2][3][3],ff[2][3][3];
void dfs(int u)
{if(g[u].empty()) return mn=min(mn,u),mx=max(mx,u),void(0);for(int v:g[u]) dfs(v);
}
void dp(int u,int tp)
{if(tp&&(u==mn||u==mx)) return f[u][1][2][2]=(mn!=mx),void(0);if(g[u].empty()){f[u][0][0][0]=1; f[u][1][2][1]=1; f[u][1][1][2]=1;return;}for(int v:g[u]) dp(v,tp);int v=g[u][0];for(int j=0;j<=2;j++)for(int k=0;k<=2;k++)f[u][0][j][k]=(1ll*f[v][1][j][k]+f[v][0][j][k])%mod,f[u][1][j][k]=f[v][0][j][k];for(int i=1;i<g[u].size();i++){int v=g[u][i];for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){ff[1][j][k]=ff[0][j][k]=0;for(int x=0;x<=1;x++)for(int y=0;y<=1;y++) if(!(x==0&&y==1))ff[1][j][k]=(1ll*ff[1][j][k]+f[u][x][j][0]*f[v][y][0][k]%mod+f[u][x][j][0]*f[v][y][2][k]%mod+f[u][x][j][2]*f[v][y][0][k]%mod+f[u][x][j][2]*f[v][y][2][k]%mod+f[u][x][j][1]*f[v][y][1][k]%mod)%mod;for(int x=0;x<=1;x++)ff[0][j][k]=(1ll*ff[0][j][k]+f[u][0][j][0]*f[v][x][0][k]%mod+f[u][0][j][0]*f[v][x][2][k]%mod+f[u][0][j][2]*f[v][x][0][k]%mod+f[u][0][j][2]*f[v][x][2][k]%mod+f[u][0][j][1]*f[v][x][1][k]%mod)%mod;}for(int j=0;j<=2;j++)for(int k=0;k<=2;k++)for(int x=0;x<=1;x++)f[u][x][j][k]=ff[x][j][k];}
}
int main()
{freopen("value.in","r",stdin);freopen("value.out","w",stdout);scanf("%d",&n);for(int i=2;i<=n;i++){int x; scanf("%d",&x);g[x].push_back(i);}for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end());dfs(1);	dp(1,0);LL ans=(1ll*f[1][1][0][0]+f[1][0][0][0]+f[1][0][2][0]+f[1][1][2][0]+f[1][0][0][2]+f[1][0][2][2]+f[1][1][0][2]+f[1][1][2][2])%mod;memset(f,0,sizeof(f));dp(1,1);ans=(1ll*ans+f[1][0][2][2]+f[1][1][2][2])%mod;printf("%lld\n",ans);return 0;
}

小凸玩密室

完全二叉树上分讨,注意这个重要的性质。

可以根据完全二叉树下标的规律直接遍历。

观察遍历顺序,对于一个节点,先遍历以它为根的子树,从某一个叶子跳到父亲,然后遍历它的兄弟子树。其中一个叶子可以跳到根节点的另一个儿子,

由于完全二叉树,考虑倍增跳父亲,设计状态 \(f_{u,i}\) 表示遍历完 \(u\) 的子树向上跳到第 \(i\) 级祖先。

发现有一个问题就是已经走过父亲,怎么直接跳到兄弟。

不妨直接加一个 dp 数组,记录从某一个叶子直接跳到兄弟的代价。\(f_{u,i,0/1}\) 表示跳到父亲/兄弟的代价。

转移直接分讨。不放了。注意边界。

code
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define bro(x,i) ((x>>(i-1))^1)
#define fa(i,j) ((i>>(j-1)>=1)?(i>>(j)):-1)
const int N = 2e5+5;
const LL inf = 1e17;
int n;
LL f[N][20][2],ans=1e18,dis[N][20],a[N];
void work()
{for(int i=n;i>=1;i--) for(int j=1;~fa(i,j);j++){if(ls(i)>n) f[i][j][0]=dis[i][j]*a[fa(i,j)],f[i][j][1]=(dis[bro(i,j)][1]+dis[i][j])*a[bro(i,j)];else if(rs(i)>n) f[i][j][0]=f[ls(i)][j+1][0]+dis[ls(i)][1]*a[ls(i)],f[i][j][1]=f[ls(i)][j+1][1]+dis[ls(i)][1]*a[ls(i)];else f[i][j][0]=min(f[rs(i)][1][1]+f[ls(i)][j+1][0]+dis[rs(i)][1]*a[rs(i)],f[ls(i)][1][1]+f[rs(i)][j+1][0]+dis[ls(i)][1]*a[ls(i)]),f[i][j][1]=min(f[rs(i)][1][1]+f[ls(i)][j+1][1]+dis[rs(i)][1]*a[rs(i)],f[ls(i)][1][1]+f[rs(i)][j+1][1]+dis[ls(i)][1]*a[ls(i)]);			}for(int i=1;i<=n;i++){LL tmp=f[i][1][0];for(int j=fa(i,1),k=i;j;j=fa(j,1),k=fa(k,1)){if(bro(k,1)<=n) tmp+=dis[bro(k,1)][1]*a[bro(k,1)]+f[bro(k,1)][2][0];else tmp+=dis[j][1]*a[fa(j,1)];}ans=min(ans,tmp);}
}
int main()
{// freopen("in.in","r",stdin);// freopen("out.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int i=2;i<=n;i++){scanf("%lld",&dis[i][1]);for(int j=2;~fa(i,j);j++) dis[i][j]=dis[i][j-1]+dis[fa(i,j-1)][1];}work();printf("%lld\n",ans);return 0;
}

T3 货币

费用流板子。先咕。。。

T4 资本

生成函数。可做。咕咕咕。。。

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

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

相关文章

记一次内存告警

刚好国庆最后一天上班,遇到一个实例内存使用率100%的告警。 分析JVM内存常用的命令得总结一下:

Leetcode 275. H 指数 II

1.题目基本信息 1.1.题目描述 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。 h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她…

7、卷积神经网络基础

1、边缘检测示例(Edge Detection Example)卷积运算(convolutional operation)是卷积神经网络最基本的组成部分,使用边缘检测(edge detection)作为入门样例。接下来,你会看到卷积是如何进行运算的。在之前的人脸例子中,我们知道神经网络的前几层是如何检测边缘的,然后…

truffle 和 ganache 打印账号列表和发送eth

打印 ganache环境的账户列表const localhost = "http://127.0.0.1:7545"; const {Web3} = require("web3"); const web3 = new Web3(new Web3.providers.HttpProvider(localhost));web3.eth.getAccounts().then(function (result) {console.log("账户…

前端无代码-表单页面的查看和编辑| uiotos致敬amis、appsmith、codewave、goview、dataroom、iotrouter、FUXA、乐吾乐、dooring等

上位机或管理系统,增删改查属于常规操作。其中以点击以查看和编辑,弹出表单页面,最为常见。 UIOTOS支持页面嵌套、属性继承(包括只读属性)。通过配置和连线,也能对表单页面区分查看和编辑,但有些繁琐。 可以利用容器组件的表单只读属性,勾选后,连线传入表单数据,将只…

前端零代码-技术原理:对话框嵌套和自定义按钮| uiotos致敬amis、appsmith、codewave、goview、dataroom、iotrouter、FUXA、乐吾乐、dooring等

对话框有默认标题头和脚,带有默认的取消、确定、关闭等按钮: 对话框编辑状态和运行状态 UIOTOS中对话框属常见容器,内容由任意其他页面嵌套而来。如下所示: UIOT…

数字经济与新质生产力:地理信息与遥感视角下的深度分析

在数字化浪潮的推动下,我们正见证着生产力的一次历史性飞跃。数字经济如何重塑生产力的三大要素:劳动对象、劳动资料和劳动者?让我们来深度分析数字经济如何推动新质生产力的发展。一、数字经济与地理信息的融合地理信息与遥感技术是数字经济中不可或缺的一环。它们为我们提…

土地资源的可持续管理:探索长期利用的绿色路径

在全球化与城市化的双重驱动下,土地资源的可持续管理已成为保障人类福祉与地球健康的迫切议题。本文将深入剖析实现土地资源长期可持续利用的策略与实践,从理论到实践,全方位探索这条绿色发展的必由之路。一、土地资源的现状与挑战当前,土地退化、耕地减少、城市蔓延、生态…

超轻巧modbus调试助手使用说明

一、使用说明 1.1 数据格式和其他的modbus采集工具一样,本组件也支持各种数据格式,其实就是高字节低字节的顺序。 一般是2字节表示一个数据,后面又有4字节表示一个数据,目前好像还有8字节表示一个数据的设备。 不同厂家的设备对应的字节顺序可能不同,要求可以自定义顺序,…

南沙C++信奥赛陈老师解一本通题 1984:【19CSPJ普及组】纪念品

​【题目描述】小伟突然获得一种超能力,他知道未来 T 天 NN种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。 每天,小伟可以进行以下两种交易无限次: 1.任选一个纪念品,若手上有足够金币,以当日价格购买该…

VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布

VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 7.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Fujitsu (富…

SQL Server 2022 RTM Cumulative Update #15 发布下载

SQL Server 2022 RTM Cumulative Update #15 发布下载SQL Server 2022 RTM Cumulative Update #15 发布下载 最新的累积更新 (CU) 下载,包含自 SQL Server 2022 RTM 发布以来的所有更新。 请访问原文链接:https://sysin.org/blog/sql-server-2022/,查看最新版。原创作品,转…