当前位置: 首页 > news >正文

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

大体思路:将所有询问按照右端点排序,按照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]);}}
}

相关文章:

2022NOIP比赛总结

种花 1.本题是一道前缀和优化加上枚举的问题。先考虑 C 因为 F 是 C 下边随便加一个点&#xff0c;所以只要求出 C 就求出了 F 。 注意到&#xff0c;并没有要求上下行一样&#xff0c;唯一的要求是 C 的两个横要隔一行&#xff0c;这就是问题的突破点&#xff0c;这题很明显…...

Leetcode 排序链表

这段代码的算法思想是 归并排序&#xff0c;一种适合链表的排序方法。它通过递归地将链表拆分成两部分&#xff0c;分别排序&#xff0c;然后合并已排序的部分&#xff0c;从而达到整体排序的目的。以下是代码的中文解释&#xff1a; 算法步骤&#xff1a; 找到链表的中点&…...

哈希函数简介

哈希函数是一种将任意大小的数据输入&#xff08;通常称为“消息”&#xff09;转换为固定大小的输出&#xff08;称为“哈希值”或“摘要”&#xff09;的算法。 主要特点&#xff1a; 1、输出固定长度 无论输入数据的大小如何&#xff0c;哈希函数的输出总是固定长度。例如…...

nginx------正向代理,反向代理生产,以及能否不使用代理详解

在生产环境中&#xff0c;选择使用正向代理还是反向代理取决于具体的应用场景和需求。下面详细解释这两种代理的用处以及为什么在不同情况下会选择它们。 正向代理 (Forward Proxy) 用途 匿名访问&#xff1a; 隐藏客户端的真实 IP 地址&#xff0c;提供隐私保护。常用于绕过…...

iptables限制docker端口禁止某台主机访问(使用DOCKER链和raw表的PREROUTING链)

背景&#xff1a; 在Linux上docker映射了端口&#xff0c;想着对服务端口进行限制指定IP访问&#xff0c;发现在filter表的INPUT链限制无效 环境&#xff1a; 主机192.168.56.132上的docker容器部署了nginx并将容器80端口映射到主机8000端口 [rootlocalhost ~]# docker ps …...

【VM实战】VMware迁移到VirtualBox

VMware 虚拟机开机卸载VMware Tools 调整虚拟磁盘 对于Windows 10及以上的虚拟机&#xff0c;一般VMware默认都会选Nvme固态硬盘。在导出前必须将其改为SATA&#xff0c;否则VirtualBox导入会报Appliance Import错误 (E_INVALIDARG 0x80070057) 先删掉当前盘的挂载&#xff…...

Android WebView加载不到cookie

以下配置根据需求酌情添加&#xff0c;建议逐个试验&#xff0c;cookie操作不是内存操作&#xff0c;建议修改配置后卸载app再重新运行防止缓存影响测试结果。 1.设置应用程序的 WebView 实例是否应发送并接受 Cookie CookieManager cookieManager CookieManager.getInstanc…...

c++qt

1.显示画布 #include "code.h" #include <QtWidgets/QApplication> #include<iostream> #include<vector> #include <QWindow> #include <QGraphicsView> #include <QGraphicsScene>using namespace std;//1.空格 2.墙 3.入口…...

零跑汽车嵌入式面试题汇总及参考答案

C++ 的三大特性是什么? C++ 的三大特性分别是封装、继承和多态。 封装 概念:封装是把数据和操作数据的函数绑定在一起,对数据的访问进行限制。通过将数据成员声明为私有或保护,只允许通过公共的成员函数来访问和修改数据,从而隐藏了类的内部实现细节。这有助于提高代码的安…...

LC:贪心题解

文章目录 376. 摆动序列 376. 摆动序列 题目链接&#xff1a;https://leetcode.cn/problems/wiggle-subsequence/description/ 这个题目自己首先想到的是动态规划解题&#xff0c;贪心解法真的非常妙&#xff0c;参考下面题解&#xff1a;https://leetcode.cn/problems/wiggle…...

ubuntu交叉编译dbus库给arm平台使用

1.下载dbus库源码 https://www.freedesktop.org/wiki/Software/dbus 克隆源码: https://gitlab.freedesktop.org/dbus/dbus/-/tree/dbus-1.12?ref_type=heads 下载1.12.20版本: 指定pkgconfig环境变量: export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PWD/../expat-2.3.…...

ansible开局配置-openEuler

ansible干啥用的就不多介绍了&#xff0c;这篇文章主要在说ansible的安装、开局配置、免密登录。 ansible安装 查看系统版本 cat /etc/openEuler-latest输出内容如下&#xff1a; openeulerversionopenEuler-24.03-LTS compiletime2024-05-27-21-31-28 gccversion12.3.1-30.…...

连锁收银系统的优势与挑战

在快速发展的零售环境中&#xff0c;连锁收银系统不仅是收银的工具&#xff0c;更是现代零售管理的重要组成部分。它在提升效率、优化客户体验以及数据管理等方面发挥了关键作用。然而&#xff0c;随着技术的进步和市场环境的变化&#xff0c;连锁收银系统也面临着诸多挑战。本…...

轻型民用无人驾驶航空器安全操控理论培训知识总结-多旋翼部分

航空器知识 螺旋桨 螺旋桨为多旋翼民用无人驾驶航空器提供升力,多旋翼民用无人驾驶航空器通过飞控系统控制电机调节螺旋桨转速,来实现飞行。 天线 多旋翼民用无人驾驶航空器的图像传输以及遥控控制信号,主要是通过无线信道进行的,靠民用无人驾驶航空器与遥控器的天线传…...

springboot092安康旅游网站的设计与实现(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 基于JSP的安康旅游网站的设计与实现 姓  名 学  号 院  系 专  业 指导老师 2021 年 月 教务处制 目 录 目 录 摘 要 Abstract 第一章 绪论 1.1 研究现状 1.2 设…...

优化 Git 管理:提升协作效率的最佳实践20241030

优化 Git 管理&#xff1a;提升协作效率的最佳实践 引言 在现代软件开发中&#xff0c;版本控制系统是确保代码质量和团队协作顺畅的基石。Git 作为最流行的分布式版本控制工具&#xff0c;其灵活性和强大功能使得开发者能够高效地管理项目代码。然而&#xff0c;仅依靠工具本…...

Cocos使用精灵组件显示相机内容

Cocos使用精灵组件显示相机内容 1. 为什么使用精灵渲染 在游戏引擎中&#xff0c;游戏场景内除webview和video外所有的节点都是渲染在Canvas上&#xff0c;这导致了webview和video只能存在于所有节点的最上层或最下层&#xff0c;而这种层级关系会出现节点事件无法正常监听或者…...

AListFlutter(手机alist)——一键安装,可在手机/电视上运行并挂载各个网盘

前面提到软路由系统OpenWRT的时候&#xff0c;当时说过可以在OpenWRT里安装alist&#xff0c;然后挂载网盘&#xff0c;这样就可以通过webdav的方式在家庭局域网下的任何设备都可以访问操作这些网盘&#xff0c;摆脱硬盘空间不够的问题。 但alist的官方版本是没有手机版本的&a…...

2024快手面试算法题-生气传染

问题描述 思路分析 生气只会向后传播&#xff0c;最后一个生气的人一定是最长连续没有生气的人中的最后一个人&#xff0c;前提是前面得有一个人生气。 注意&#xff0c;一次只能传播一个人&#xff0c;比如示例1&#xff0c;第一次只会传播给第一个P&#xff0c;不会传播给第…...

组织如何防御日益增加的 API 攻击面

应用程序编程接口 (API) 日益重要。随着 API 超出手动控制范围&#xff0c;组织可能面临更大的安全挑战。 在这里&#xff0c;我们与 Akamai 安全技术战略总监 Karl Mattson 进行了交谈。 请介绍一下您的职位和背景。 我在网络安全和技术领导方面拥有超过 25 年的经验&am…...

如何防止U盘盗取电脑数据?

数据安全无论是对企业还是个人都至关重要。这些用户群体随时面临着数据被窃取的风险&#xff0c;而 U 盘则成为了潜在的安全隐患。如果你想要禁止电脑上使用 这类USB 存储设备&#xff0c;看完这篇文章&#xff0c;防止 U 盘盗取数据并非难事。 禁止使用usb存储设备 打开电脑上…...

python爬虫抓取豆瓣数据教程

环境准备 在开始之前&#xff0c;你需要确保你的Python环境已经安装了以下库&#xff1a; requests&#xff1a;用于发送HTTP请求。BeautifulSoup&#xff1a;用于解析HTML文档。 如果你还没有安装这些库&#xff0c;可以通过以下命令安装&#xff1a; pip install requests…...

Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句

Mybatis 注意传递多种参数&#xff0c;不一定都有参数值&#xff0c;用xml如何写出查询语句 有一张User表&#xff0c;传递name和age参数&#xff0c;通过mybatis的xml格式编写查询namelike“%张%”&#xff0c;或者age18的学生信息&#xff0c;但是注意传递name和age参数&…...

【Windows】Redis 部署

1、部署 &#xff08;1&#xff09;下载 目前 Redis官网 没有提供Windows版本的安装程序&#xff0c;如果需要安装&#xff0c;需要到Github上下载适合Windows的版本。 具体下载地址为&#xff1a; Redis-x64-3.0.504.zipRedis-x64-5.0.14.1.zip &#xff08;2&#xff09…...

【经典】Vue中this指向问题??

在Vue中&#xff0c;this关键字的指向取决于this在何处被定义。在Vue的组件方法中&#xff0c;this指向当前组件实例&#xff0c;即Vue的实例。 以下是一些常见场景的this指向示例&#xff1a; 组件方法内部&#xff1a; export default { methods: { someMethod() { …...

Oracle数据泵(expdp)导入导出数据

源数据库操作&#xff08;数据备份&#xff09; 自定义变量 1.查询当前数据库的自定义变量&#xff08;里面包含导出数据文件路径变量配置&#xff0c;即DUMP_DIR&#xff09; select * from dba_directories; 2.若没有配置&#xff0c;则创建一个dump_dir&#xff08;变量…...

得物App 3D球鞋博物馆亮相两博会,打造沉浸式消费新体验

近日&#xff0c;2024中国体育文化博览会、中国体育旅游博览会&#xff08;简称“两博会”&#xff09;在苏州国际展览中心拉开帷幕。得物App携手Apple Vision Pro共同打造的3D球鞋博物馆亮相两博会上海展区&#xff0c;并通过3D技术为观众呈现独特的沉浸式消费新体验。 在3D球…...

深度学习中的迁移学习

文章目录 一、迁移学习的基本概念二、迁移学习的步骤三、迁移学习的策略四、迁移学习的应用五、迁移学习的挑战与未来展望 深度学习中的迁移学习是一种重要的机器学习方法&#xff0c;其 核心思想在于利用从一个任务&#xff08;源任务&#xff09;中学到的知识或模型&#xf…...

【深入浅出】深入浅出Bert(附面试题)

本文的目的是为了帮助大家面试Bert&#xff0c;会结合我的面试经历以及看法去讲解Bert&#xff0c;并非完整的技术细致讲解&#xff0c;介意请移步。 深入浅出】深入浅出Bert&#xff08;附面试题&#xff09; 网络结构Pre-TrainingFine-Tuning 输入编码词向量编码句子编码位置…...

Docker-安装

操作系统&#xff1a;Ubuntu 20.04.6 LTS 更新apt sudo apt update 删除旧版本docker sudo apt-get remove docker docker-engine docker.io 安装docker sudo apt install docker.io 查看docker版本 docker --version 启动docker 启动docker sudo systemctl start docker 启用…...