2022NOIP比赛总结

news2024/11/13 4:11:45

种花

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分:暴力

大体思路:将所有询问按照右端点排序,按照r从大到小处理两个数组的最大值。

f[i]对于每个r,x[i]*y[i]的累加和,相当于固定左端点是i,右端点是[i,r]任意数的贡献和。答案为\sum _{i=l}^{r}f_i,转化为固定p,移动q,时间复杂度为O(n*n+n*q),应该只能过前两个测试点。

#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.coloradmin.cn/o/2228230.html

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

相关文章

《DIY项目之“一只眼狗链”》:视频方案

项目背景 《DIY项目之“一只眼狗链”》合集主要记录完成一个DIY项目的所有过程。该合集预计更新频率为2~3周一篇&#xff08;同样属于一边做一边记录发布&#xff0c;时间上主要涉及PCB绘板、零部件采购、样品制作、编程等&#xff0c;存在一定的不可控性&#xff09;。 当前项…

若依微服务15 - RuoYi-Vue3 实现前端独立运行

正文开始&#xff1a; RuoYi-Vue3 使用 Vue3 Element Plus Vite 技术栈。 GitHub 开源地址&#xff1a;https://github.com/yangzongzhuan/RuoYi-Vue3 本文介绍使用若依提供的在线后端接口&#xff0c;仅启动前端项目并进行界面开发&#xff0c;而无需启动后端服务。 一、克隆…

【ROS】详解ROS文件系统

参考&#xff1a;ROS入门笔记&#xff08;七&#xff09;&#xff1a;详解ROS文件系统 - 少云清的文章 - 知乎 https://zhuanlan.zhihu.com/p/338042120 ROS文件目录 这里的软件包指的是src下的文件夹&#xff0c;因为在ROS下创建软件包的流程如下&#xff1a; 把软件包…

Unity游戏上传微信小游戏步骤

准备一个小程序账号&#xff0c;在首页设置服务类目为小游戏&#xff08;需要新创建的小程序才能设置&#xff0c;之前设置过的不能更改为小游戏&#xff09; AppID(小程序ID) 在网页左下角点击进入账号设置-基本设置 下拉找到小程序Id(后面用到) 点击进入下载微信开发者…

SAP 根据不同生产版本创建销售预测简介

SAP 根据不同生产版本创建销售预测简介 业务场景前台操作1、创建BOM2、创建工艺路线3、创建生产版本4、创建销售预测5、调整销售预测6、查看物料需求业务场景 很多工厂一个物料可能会存在多个BOM,当有多个BOM存在的情况下就会存在多个生产版本,当创建计划独立需求的时候,系…

【java batik_使用BATIK解析SVG生成PNG图片】

矢量图的介绍及应用场景 矢量图是什么意思&#xff1f; 矢量图&#xff0c;也称为向量图&#xff0c;英文名字是Vector graphics。 矢量图是一种基于矢量的图形&#xff0c;由一系列的线段和曲线组成。由数学公式和算法生成的。这意味着矢量图可以在任何分辨率下清晰地显示&…

浅谈钓鱼攻防之道-制作免杀excel文件钓鱼

如果我告诉你我很厉害&#xff0c;也许你会说我在吹牛。但是如果我告诉你我并不厉害&#xff0c;你肯定知道我在撒谎。 1、CSV注入之RCE CSV公式注入(CSV Injection)是一种会造成巨大影响的攻击向量&#xff0c;攻击这可以向Excel文件中注入可以输出或以CSV文件读取的恶意攻击…

Linux Shell 实现一键部署mariadb11.6

mariadb MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius主导开发…

在 Elasticsearch 中顺利管理季节性时间变化

作者&#xff1a;来自 Elastic Valeriy Khakhutskyy, James Gowdy 用于 Elasticsearch 异常检测的新夏令时日历。 每年春季和秋季两次&#xff0c;许多国家/地区都会调整时钟以更好地利用日光。这些时钟调整不仅会带来时差和 “困倦的星期一” 的感觉&#xff0c;还会带来来自…

开源一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款基于若依的wms仓库管理系统&#xff0c;支持lodop和网页打印入库单、出库单的源码。 前言 在当今快速发展的商业环境中&#xff0c;库存管理对于企业来说至关重要。然而&#xff0c;许多企业仍然依赖于传统的、手动…

C++ | Leetcode C++题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution { public:int fib(int n) {if (n < 2) {return n;}vector<vector<int>> q{{1, 1}, {1, 0}};vector<vector<int>> res matrix_pow(q, n - 1);return res[0][0];}vector<vector<int>>…

「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用

在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。 关键词 Image 组件图片加载本地资源远程图片图片轮播一、Image 组件基础…

【CSS3】css开篇基础(5)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

怎么将文件批量重命名001到100?6个超好用的方法汇总

怎么将文件批量重命名001到100&#xff1f;在日常工作和学习中&#xff0c;我们经常需要处理大量的文件。这些文件可能包括文档、图片、音频、视频等各种类型&#xff0c;而它们的命名往往各不相同&#xff0c;这给我们的查找工作带来了很大的困扰。为了提高查找效率&#xff0…

【运动的&足球】足球运动员球守门员裁判检测系统源码&数据集全套:改进yolo11-DBBNCSPELAN

改进yolo11-FocalModulation等200全套创新点大全&#xff1a;足球运动员球守门员裁判检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示…

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式&#xff0c;每种模式的功能和用途不同&#xff1a; 一、命令模式 (Command Mode)&#xff1a; - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标&#xff0c;输入各种命令&#xff08;如删除、复制、粘贴等&#xff09;。 yy&#xff1a;…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…

电脑使用技巧:怎么清理C盘碎片?

在日常使用电脑的过程中&#xff0c;C盘作为系统盘&#xff0c;常常会因为各种文件、缓存、临时文件等的堆积而变得拥挤不堪。这不仅会降低电脑的运行速度&#xff0c;还可能导致系统不稳定。而磁盘碎片问题则是另一个影响电脑性能的重要因素。本文将详细介绍如何清理C盘碎片&a…

数据结构 ——— 二叉树的概念及结构

目录 二叉树的概念 特殊的二叉树 一、满二叉树 二、完全二叉树 二叉树的概念 二叉树树示意图&#xff1a; 从以上二叉树示意图可以看出&#xff1a; 二叉树每个节点的度不大于 2 &#xff0c;那么整个二叉树的度也不大于 2 &#xff0c;但是也不是每个节点都必须有 2 个…