2022NOIP练习总结

种花

1.本题是一道前缀和优化加上枚举的问题。先考虑 C 因为 F 是 C 下边随便加一个点,所以只要求出 C 就求出了 F 。

注意到,并没有要求上下行一样,唯一的要求是 C 的两个横要隔一行,这就是问题的突破点,这题很明显的计数,计数则用到乘法原理和加法原理。

假设上边的有 a 个合法的横,那考虑这一行每一个合法的横(这里说的不同是长度不同)给答案的贡献是什么?是不是每一个贡献 a ,那这一行有 b 个不同的合法的横,那么答案就增加了 a×b,那每一行都这么处理,然后处理完一样就加上上一行的合法的方案数(因为他要求两个横之间至少隔一行)。当遇到土坑的时候就把记录数组清零即可。

想要求出 F ,只要求出这一列上有多少合法的 C 就行了(因为 F 是由 C 下边加上一个竖构成的),所所以我们只要复制过来记录 C 的公式然后把他存在另一个数组里到时候每找到一个能种花的地方 F 的答案加上这个数组就好了。

要想快速查询每一行有多少个合法的横,只需要预处理就可以了。

2.整体思路就是这样,接下来是代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010,mod=998244353;
ll ac,af,c,f;
int n,m,id,t;
int d[N][N],ji,jif,jis;
char ma[N][N];
int main(){cin>>t>>id;while(t--){memset(d,0,sizeof(d));cin>>n>>m>>c>>f;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>ma[i][j];}}for(int i=1;i<=n;i++){for(int j=m-1;j>=1;j--){if(ma[i][j]=='1') d[i][j]=-1;else if(ma[i][j+1]=='0') d[i][j]=d[i][j+1]+1;}}for(int j=1;j<m;j++){ji=jif=jis=0;for(int i=1;i<=n;i++){if(d[i][j]==-1){ji=jif=jis=0;continue;}ac=ac%mod+(1ll*d[i][j]*(ji%mod))%mod;af=(af%mod+jif%mod)%mod;jif=(jif+(1ll*d[i][j]*(ji%mod)))%mod%mod;ji+=max(0,d[i-1][j]);}}cout<<(c*ac)%mod<<' '<<(f*af)%mod<<endl;ac=af=0;}return 0;
}

建造军营

1.一道图论+dp题。只有 B 国炸毁了图的割边,才会使得图不连通,进而可能会导致军营不连通。也就是说,A 国可以随意地看守或不看守不是割边的边。因此想到边双缩点后用树形DP。

题目保证了给定的图连通,那么缩点后的图也必然连通,如果有多个双连通分量构成了环,就不符合双连通分量的定义,即这些首尾相连构成环的“双连通分量”应该被划在同一个双连通分量中。因此,缩点后形成的图连通且无环,也就形成了一棵树。设Vu表示双连通分量u中的点数,Eu表示双连通分量中u的边数,如果有n个双连通分量,则问题可以转化为:有一棵无根树,每个节点有2^{E_{u}}种不建造军营的方案和2^{E_{u}+V_{u}}-2^{E_{u}}种建造军营的方案。

以1为根节点,令 f(u,0/1) 表示以 u 为根的子树中没有/有军营的方案数。

发现每种状态所涵盖的情况过多,不好转移。可以对状态添加限制

令 f(u,0/1) 表示以 u 为根的子树中没有/有军营的方案数,若有军营,则所有的军营必须通过已经派兵看守的边与 u 连通。

先想想该如何统计答案:

对于每个结点u,令u子树外的所有点都不建军营,同时强制不选 fau​→u 的边,再累加方案数。

考虑转移:

显然地,f(u,0)=2^{E_{u}}*\prod_{v\in son(u)}2f(v,0),难点在 f(u,1) 的转移上。

考虑每新增一个子节点 v 对 f(u,1) 产生的贡献。

若到新增前都还未建造一个军营,则以 v 为根的子树中必须有军营,即 f(u,1)←f(u,0)×f(v,1)。

若到新增前已经建造过军营,则以 v 为根的子树中有没有军营皆可,且当以 v 为根的子树中没有军营时,v 点是否与 u 点连通皆可,即 f(u,1)←f(u,1)×[2f(v,0)+f(v,1)]。

综上,f(u,1)←f(u,0)×f(v,1)+f(u,1)×[2f(v,0)+f(v,1)]。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10,M=1e6+10,MOD=1e9+7;
int n,m,p;
int tot,tot2,head[N],head2[N];
int cnt,top,stk[N],dfn[N],low[N],bel[N];
int deg[N],V[N],E[N],s[N];
bool ins[N];
ll ans,f[N][2];
struct edge{int to,nxt;
}e[M<<1],e2[M<<1];
void add(int u,int v){e[++tot]=edge{v,head[u]};head[u]=tot;
}
void add2(int u,int v){e2[++tot2]=edge{v,head2[u]};head2[u]=tot2;
}
void tarjan(int u,int fa){dfn[u]=low[u]=++cnt,ins[stk[++top]=u]=1;for (int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;if(!dfn[v]) tarjan(v,u),low[u]=min(low[u],low[v]);else if(ins[v]) low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){p++;int x;do{ins[x=stk[top--]]=0,bel[x]=p;V[p]++;}while(x!=u);}
}
ll qp(ll base,int e){ll res=1;while(e){if(e&1) res=res*base%MOD;base=base*base%MOD;e>>=1;}return res;
}
void dfs(int u,int fa){s[u]=E[u];for(int i=head2[u];i;i=e2[i].nxt){int v=e2[i].to;if(v==fa) continue;dfs(v,u);s[u]+=s[v]+1;}
}
void dp(int u,int fa){for (int i=head2[u];i;i=e2[i].nxt){int v=e2[i].to;if(v==fa) continue;dp(v,u);f[u][1]=(f[u][1]*(((f[v][0]<<1)+f[v][1])%MOD)%MOD+f[u][0]*f[v][1]%MOD)%MOD;f[u][0]=f[u][0]*((f[v][0]<<1)%MOD)%MOD;}if(u==1) ans=(ans+f[u][1])%MOD;else ans=(ans+f[u][1]*qp(2,s[1]-s[u]-1))%MOD;
}
int main(){cin>>n>>m;while(m--){int u,v;cin>>u>>v;add(u,v),add(v,u);}tarjan(1,0);for(int u=1;u<=n;u++){for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(bel[u]!=bel[v]) add2(bel[u],bel[v]);else E[bel[u]]++;}}for(int i=1;i<=p;i++){E[i]>>=1;f[i][0]=qp(2,E[i]);f[i][1]=qp(2,V[i]+E[i])-f[i][0];}dfs(1,0);dp(1,0);cout<<ans;return 0;
}

比赛

1.20分:暴力

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=3e5+10;
struct Node{int l,id;
};
vector<Node> d[N];
LL a[N],b[N];
LL f[N];
LL x[N],y[N];
LL ans[N];
int main(){int t;int n,q;cin>>t>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){cin>>b[i];}cin>>q;for(int i=1;i<=q;i++){int l,r;cin>>l>>r;d[r].push_back({l,i});}for(int r=1;r<=n;r++){for(int i=1;i<=r;i++){x[i]=max(x[i],a[r]);y[i]=max(y[i],b[r]);f[i]+=x[i]*y[i];}for(auto [l,id]:d[r]){for(int i=l;i<=r;i++)ans[id]+=f[i];}}for(int i=1;i<=q;i++){printf("%lld\n", ans[i]);}return 0;
}

只会写暴力…… 

喵了个喵

1.一道模拟题。

当k=2n-2时,有3种操作:

插入(ins):把不等于栈顶的数入栈。

删除(del):把等于栈顶的数入栈,与栈顶消除。

连接(con):把数放到备用栈(一个钦定的空栈),再与某个栈底进行消除。插入时,如果有高度为1的栈,就任选一个插入;否则就插到高度为0的栈中。显然这样的栈总是存在。

实现时,可以用set,也可以维护一个栈,删除时用栈顶替换。

当k=2n-1时,这样的栈不总是存在了,此时除了将要放入的数(原数),其他数都已存在。我们先忽略这个数,继续往后做。有几种情况:

等于原数:如果执行到这里,则不会出现连接操作而使用备用栈。把它们都放入备用栈中对消,结束循环。

连接:如果执行这种操作,只有可能上面的数被放入偶数次。因此预先放入原数,可以让后面偶数个数对消,不会有影响。结束循环。

删除:如果删除后栈为空,可以把原数放入备用栈,这个栈变成新的备用栈,结束循环。否则继续。

插入:直接插入。(注意插入的地方要和之前保持一致,不能放到别处)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=310,M=2e6+10,K=N*2;
int T,n,m,k,a[M];
int o[M],p[M],b,c[K],c2[K];
int s[N][2],t[N];
int f[N],e[N],z,e2[N],z2;
void ins(int x){if(t[x]==1) e2[f[x]=z2++]=x;else if(!t[x]) e[f[x]=z++]=x;
}
void del(int x){if(t[x]==1) f[e2[--z2]]=f[x],e2[f[x]]=e2[z2];else if(!t[x]) f[e[--z]]=f[x],e[f[x]]=e[z];
}
void ins(int y,int i){int x=a[i];del(y);o[i]=0;p[i]=y;c[x]=y;s[y][t[y]++]=x;ins(y);
}
void del(int y,int i){int x=a[i];del(y);o[i]=0;p[i]=y;c[x]=0;--t[y];ins(y);
}
void con(int y,int i){int x=a[i];del(y);o[i]=e[0];p[i]=y;c[x]=0;++b;s[y][0]=s[y][1];--t[y];ins(y);
}
int main(){cin>>T;while(T--){cin>>n>>m>>k;b=m;memset(c,0,(k+5)<<2);memset(t,0,(n+5)<<2);memset(f,0,(n+5)<<2);z=z2=0;for(int i=n;i;--i)ins(i);for(int i=1;i<=m;++i) cin>>a[i];for(int i=1,j=1;i<=m;i=++j){int x=a[i];if(int y=c[x]){if(s[y][t[y]-1]==x)del(y,i);else con(y,i);}else if(z2||z>1)ins(z2?e2[z2-1]:e[z-1],i);else for(j=i+1;;++j){if(x==a[j]){int y=e[0];ins(y,i);del(y,j);break;}if(int y=c[a[j]]){if(s[y][t[y]-1]==a[j]){del(y,j);if(!t[y]){ins(e[0],i);break;}c2[a[j]]=y;}else{con(y,j);ins(y,i);break;}}else ins(c2[a[j]],j);}}printf("%d\n",b);for(int i=1;i<=m;++i){if(o[i]) printf("1 %d\n2 %d %d\n",o[i],p[i],o[i]);else printf("1 %d\n",p[i]);}}
}

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

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

相关文章

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

Cmake Error:could not find any instance of Visual Studio.

出现以下错误 解决方案&#xff1a; 安装visual stuido 2017。 检查是否安装“使用C的桌面开发” 检查是否安装了扩展开发 点开“单个组件”是否安装了以下组件 编辑计算机环境变量&#xff0c;

如何在macOS开发中给 PKG 签名和公证(productsign+notarytool)

在macOS中&#xff0c;给PKG文件进行签名是一个确保用户能够顺利无警告地安装软件的重要步骤。以下是给PKG签名的详细步骤&#xff1a; 一、准备阶段 获取开发者账号和证书&#xff1a; 首先&#xff0c;需要在苹果开发者网站&#xff08;Apple Developer&#xff09;注册一个…

EtherNet转Profinet主站网关以太网总线协议转换模块一文即可搞懂

稳联技术(WL-ABC2006)EtherNet/IP转Profinet网关是一种工业网络设备&#xff0c;它能够实现两种不同工业以太网协议之间的数据交换和通信。这种网关在工业自动化领域中非常重要&#xff0c;因为它允许不同品牌和协议的设备之间进行互联互通&#xff0c;从而提高了系统的灵活性和…

计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法

文章目录 IPv4IPv4的表示方法IPv4的编址方法分类编址A类地址B类地址C类地址可指派的地址数量一般不使用的特殊IPv4地址 划分子网编址子网掩码默认子网掩码 无分类编址方法地址掩码斜线记法无分类域间路由选择 CIDR IPv4 IPv4&#xff08;Internet Protocol version 4&#xff…

rtp协议:rtcp包发送和接收规则和报告!

RTCP Packet Send and Receive Rules&#xff1a; 发送和接收 RTCP 包的规则在此列出。允许在多播环境或多点单播环境中运行的实现必须满足第 6.2 节中的要求。这样的实现可以使用本节定义的算法来满足这些要求&#xff0c;或者可以使用其他算法&#xff0c;只要其性能等同或更…

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

什么是元件符号什么是封装

话不多说直接上图 左上角就可以理解为元件的符号&#xff0c;右上角可以理解为元件的封装&#xff0c;右下角是封装得3D图&#xff0c;左下角是真实的芯片。 同时注意我们元件符号的小孔&#xff0c;在封装和焊接时我们可以参照小孔的位置以及对应的引脚。如下图所示&#xff…

网站保护神器,雷池社区版的隐藏文件

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

2024双十一值得入手的好物推荐,双十一必买好物清单详细攻略分享

随着双十一购物狂欢节的临近&#xff0c;广大消费者又开始了一年一度的购物盛宴&#xff0c;在这个全民狂欢的时刻&#xff0c;如何在众多商品中挑选出真正值得入手的好物&#xff0c;成为了许多人的难题。为了帮助大家在这个双十一期间理性消费&#xff0c;挑选到真正适合自己…

AI图片生成3D物体和2D视频提取3D动画

包括AI图片生成3D物体的网站&#xff1a; 第一个为Artefacts.AIhttps://app.artefacts.ai/starter 第二个为 https://3d.csm.ai/ 以下4个的视频教程连接https://www.youtube.com/watch?vmQQCyzTA_F8 第三个为Tripo AI: Tripo AI for Web 第四个为Meshy AI: Meshy - Free …

驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)

驾校管理系统平台 目录 基于java和小程序的驾校管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#…

江协科技STM32学习- P23 DMA 直接存储器存取

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

数据结构与算法(二叉树)

树 树的概念与结构 1. 树是⼀种非线性的数据结构&#xff0c;它是由 n 个有限结点组成的⼀个具有层次关系的集合。 2. 之所以把它叫做树&#xff0c;是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下。 2. 有⼀个特殊的结点&#xff0c;称为根…

HarmonyOS应用开发者基础认证——初级闯关习题参考答案大全

相关文章 HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全 HarmonyOS应用开发者高级认证——高级闯关习题参考答案大全 文章目录 HarmonyOS第一课 HarmonyOS介绍判断题单选题多选题 HarmonyOS第一课 DevEco Studio的使用判断题单选题多选题 HarmonyOS第一课 ArkTS语法…

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…

使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图

最近那个男人写的汉语新解火遍了全网&#xff0c;那个男人叫李继刚&#xff0c;国内玩 AI 的同学如果不知道这个名字&#xff0c;可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词&#xff0c;效果却顶得上几千行代码写出来的应用程序。 这段提示词…

面试域——岗位职责以及工作流程

摘要 介绍互联网岗位的职责以及开发流程。在岗位职责方面&#xff0c;详细阐述了产品经理、前端开发工程师、后端开发工程师、测试工程师、运维工程师等的具体工作内容。产品经理负责需求收集、产品规划等&#xff1b;前端专注界面开发与交互&#xff1b;后端涉及系统架构与业…