NOIP2023 做题笔记

news/2025/1/15 17:31:27/文章来源:https://www.cnblogs.com/nagato--yuki/p/18515119

NOIP将近,由于我实力太菜,所以只能写写真题提升自己了。

P9868 [NOIP2023] 词典

简单字符串题,注意到可以换无限次,所以直接处理出每个字符串中最小的字符数和最大字符数就行了。


#include<bits/stdc++.h>
#define mxn 3010
using namespace std;
char s[mxn][mxn];
int n,m,cnt[mxn][27];
int minn[mxn],maxn[mxn],flg;
int main(){//freopen("dict.in","r",stdin);//freopen("a.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m;memset(minn,0x3f,sizeof(minn));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>s[i][j];cnt[i][s[i][j]-'a'+1]++;minn[i]=min(minn[i],s[i][j]-'a'+1);maxn[i]=max(maxn[i],s[i][j]-'a'+1);}for(int i=1;i<=n;i++){flg=1;for(int j=1;j<=n;j++){if(i==j)continue;if(minn[i]<maxn[j])continue;flg=0;break;}if(flg)cout<<1;else cout<<0;}return 0;
}

P9869 [NOIP2023] 三值逻辑

这题折腾了我一下午+三分之一个晚上,我真菜啊。
考虑用并查集将每个操作模拟。
每个值为 \(unknown\) 当且仅当出现两种情况:
\(1.\ x\) 的祖先是 \(-x\)
\(2.\ x\) 的祖先为 \(unknwon\)
这样判断就可以了。
同时,发现查询是会有负数,整体右移就行了。
对于死循环的情况,用 \(vis\) 数组判断就行了。


#include<bits/stdc++.h>
#define mxn 100010
#define U 0
#define T 100001
#define F -100001
using namespace std;
int n,m,_,type,ans;
int f[mxn],vis[mxn<<1];
int fnd(int u){if(u==T||u==F||u==U)return u;if(vis[-u+n])return U;if(vis[u+n])return T;if(u>0){vis[u+n]=1;int ret=fnd(f[u]);f[u]=ret;vis[u+n]=0;return ret;}else{vis[u+n]=1;int ret=fnd(-f[-u]);vis[u+n]=0;return ret;        }return 0;
}
void solve(){ans=0;cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=m;i++){char opt;cin>>opt;if(opt=='T'){int x;cin>>x;f[x]=T;}if(opt=='F'){int x;cin>>x;f[x]=F;}if(opt=='U'){int x;cin>>x;f[x]=U;}if(opt=='+'){int x,y;cin>>x>>y;f[x]=f[y];}if(opt=='-'){int x,y;cin>>x>>y;f[x]=-f[y];}}for(int i=1;i<=n;i++)if(fnd(i)==U)ans++;cout<<ans<<'\n';return; 
} 
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>type>>_;while(_--)solve();return 0;
}

P9870 [NOIP2023] 双序列拓展

一开始很容易想到一个 \(35pts\)\(O(qnm)\) 暴力。
根据特殊性质能发现,
我们找到 \(X\) 的最小值与 \(Y\) 的最大值的位置,把那一行和那一列标出来:

(偷题解的图)

发现如果能从左上角走到红线处,就可以从红线处走到右下角。
于是分治计算就行了。


#include<bits/stdc++.h>
#define ll long long
#define mxn 500010
using namespace std;
struct node{int minn,maxn;
};
int c,q,a[mxn],b[mxn],xx[mxn],yy[mxn];
node prex[mxn],prey[mxn],sufx[mxn],sufy[mxn];
bool check1(int a,int b,int n,int m){if(a==1||b==1)return 1;if(xx[prex[a-1].minn]<yy[prey[b-1].minn])return check1(prex[a-1].minn,b,n,m);if(xx[prex[a-1].maxn]<yy[prey[b-1].maxn])return check1(a,prey[b-1].maxn,n,m);return 0;
}
bool check2(int a,int b,int n,int m){if(a==n||b==m)return 1;if(xx[sufx[a+1].minn]<yy[sufy[b+1].minn])return check2(sufx[a+1].minn,b,n,m);if(xx[sufx[a+1].maxn]<yy[sufy[b+1].maxn])return check2(a,sufy[b+1].maxn,n,m);return 0;
}
bool solve(int x[],int y[],int n,int m){if(x[1]>=y[1])return 0;for(int i=1;i<=n;i++)xx[i]=x[i];for(int i=1;i<=m;i++)yy[i]=y[i];prex[1]=node{1,1},prey[1]=node{1,1},sufx[n]=node{n,n},sufy[m]=node{m,m};for(int i=2;i<=n;i++)prex[i]=node{x[prex[i-1].minn]>x[i]?i:prex[i-1].minn,x[prex[i-1].maxn]<x[i]?i:prex[i-1].maxn};for(int i=2;i<=m;i++)prey[i]=node{y[prey[i-1].minn]>y[i]?i:prey[i-1].minn,y[prey[i-1].maxn]<y[i]?i:prey[i-1].maxn};for(int i=n-1;i;i--)sufx[i]=node{x[sufx[i+1].minn]>x[i]?i:sufx[i+1].minn,x[sufx[i+1].maxn]<x[i]?i:sufx[i+1].maxn};for(int i=m-1;i;i--)sufy[i]=node{y[sufy[i+1].minn]>y[i]?i:sufy[i+1].minn,y[sufy[i+1].maxn]<y[i]?i:sufy[i+1].maxn};if(x[prex[n].maxn]>=y[prey[m].maxn])return 0;if(x[prex[n].minn]>=y[prey[m].minn])return 0;return check1(prex[n].minn,prey[m].maxn,n,m)&&check2(prex[n].minn,prey[m].maxn,n,m);
}
int x[mxn],y[mxn],n,m;
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>c>>n>>m>>q;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=m;i++)cin>>b[i];if(solve(a,b,n,m)||solve(b,a,m,n))putchar('1');else putchar('0');while(q--){for(int i=1;i<=n;i++)x[i]=a[i];for(int i=1;i<=m;i++)y[i]=b[i];int kx,ky;cin>>kx>>ky;for(int i=1;i<=kx;i++){int p,v;cin>>p>>v;x[p]=v;}for(int i=1;i<=ky;i++){int p,v;cin>>p>>v;y[p]=v;}if(solve(x,y,n,m)||solve(y,x,m,n))putchar('1');else putchar('0');}return 0;
}   

P9871 [NOIP2023] 天天爱打卡

有点复杂的dp。
朴素的dp是从左到右遍历,枚举左端点。这样做 \(O(Tnmk)\),会炸飞。
然后我们考虑优化,能不能快速维护区间最大值和区间修改?可以用线段树解决。


#include<bits/stdc++.h>
#define ll long long
#define mxn 100010
#define pll pair<ll,ll>
#define pb push_back
#define mp make_pair
using namespace std;
ll n,m,k,d,c,t;
ll b[mxn<<1],len,cnt,dp[mxn<<1];
struct chlg{ll x,y,v;
}a[mxn<<1];
vector<pll> p[mxn<<1];
namespace seg{ll sum[mxn<<3],lazy[mxn<<3];void push_down(ll rot){sum[rot<<1]+=lazy[rot],sum[rot<<1|1]+=lazy[rot];lazy[rot<<1]+=lazy[rot],lazy[rot<<1|1]+=lazy[rot];lazy[rot]=0;}void push_up(ll rot){sum[rot]=max(sum[rot<<1],sum[rot<<1|1]);}void build(ll rot,int l,int r){sum[rot]=lazy[rot]=0;if(l==r)return;int mid=(l+r)>>1;build(rot<<1,l,mid);build(rot<<1|1,mid+1,r);}void add(ll rot,int l,int r,int x,int y,ll k){if(l>=x&&r<=y){sum[rot]+=k,lazy[rot]+=k;return;}push_down(rot);int mid=(l+r)>>1;if(x<=mid)add(rot<<1,l,mid,x,y,k);if(y>mid)add(rot<<1|1,mid+1,r,x,y,k);push_up(rot);}ll query(ll rot,int l,int r,int x,int y){if(l>=x&&r<=y)return sum[rot];if(r<x||l>y)return 0;push_down(rot);int mid=(l+r)>>1;return max(query(rot<<1,l,mid,x,y),query(rot<<1|1,mid+1,r,x,y));}
}
void init(){cnt=0;cin>>n>>m>>k>>d;for(int i=1;i<=m;i++){cin>>a[i].y>>a[i].x>>a[i].v;a[i].x=a[i].y-a[i].x+1;b[++cnt]=a[i].x,b[++cnt]=a[i].y;}sort(b+1,b+cnt+1);len=unique(b+1,b+cnt+1)-b-1;for(int i=0;i<=len;i++)dp[i]=0;seg::build(1,1,len);return;
}
void solve(){init();for(int i=1;i<=m;i++){a[i].x=lower_bound(b+1,b+len+1,a[i].x)-b;a[i].y=lower_bound(b+1,b+len+1,a[i].y)-b;p[a[i].y].pb(mp(a[i].x,a[i].v));}for(int i=1;i<=len;i++){for(int j=0;j<p[i].size();j++){pll pp=p[i][j];seg::add(1,1,len,1,pp.first,pp.second);}dp[i]=max(dp[i],dp[i-1]);int pos1=lower_bound(b+1,b+len+1,b[i]-k+1)-b;int pos2=(b[i-1]==b[i]-1)?i-2:i-1;ll dpi=dp[pos2>=0?pos2:0];dp[i]=max(dp[i],seg::query(1,1,len,pos1,i-1)-b[i]*d-d);dp[i]=max(dp[i],seg::query(1,1,len,i,i)+dpi-d);seg::add(1,1,len,i,i,dpi+b[i]*d);}cout<<dp[len]<<'\n';for(int i=1;i<=len;i++)p[i].clear();
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>c>>t;while(t--)solve();return 0;
}

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

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

相关文章

Windows 多次制作母盘,备份文件变大的问题

公司产品基于Win11 23H2镜像版本制作母盘,我们发现随着版本迭代,基于上一版本母盘生成新母盘备份,母盘文件会越来越大。 此处说明下镜像与母盘文件的区别, 1. 镜像是指操作系统的压缩文件,常见格式是ISO、WIM、ESD,用于安装,有灵活的安装部署选项。 2. 母盘文件是指在某…

怎么利用hadoop搭建自己的云计算

我们为了能够更加方便来识别主机,我们使用主机名而不是使用IP地址,以免多处配置带来更多的麻烦。把hd-master、hd-node1、hd-node2三台虚拟机服务器中的主机名(hostname)分别更改为master、node1、node2。一、怎么利用hadoop搭建自己的云计算 (1) 我们为了能够更加方便来识…

28 计算机网络

两台机器连接就构成的网络 计算机近距离构成的网络叫做局域网,lan;一根电缆连接几台电脑,相互之间通过电缆传输信息。最著名是以太网技术。 一台上传,其余都可以在电缆里收到。为了避免接受无意义信息,每台电脑前加一个

Phonegap和Titanium用作移动开发,各有哪些优缺点

Phonegap和Titanium都是流行的移动开发框架,各自具有独特的优缺点。1、Phonegap:优点包括易学习、跨平台兼容、社区支持丰富;缺点有性能限制、原生功能限制。2、Titanium:优点涵盖了原生体验、强大的性能、大量的自定义选项;缺点则是学习曲线较陡、社区支持有限。例如,Ph…

DBeaver如何插入一行新数据或者复制一行新数据,真方便

前言 我们在使用DBeaver时,经常是需要操作数据库表的,比如新加一行数据等。DBeaver给我们提供了快速的操作方法,今天就来介绍下。 如何插入新数据 首先,我们选中要插入数据的那个位置,就是要选中一行数据。然后,我们点击下面的这两个按钮,其中一个按钮是新增一行,一个按…

二叉树的递归遍历

二叉树的递归遍历(前、中、后序)二叉树的递归遍历 题目链接: 前序遍历: LeetCode 144 中序遍历: LeetCode 94 后序遍历: LeetCode 145 描述 给你二叉树的根节点 root ,返回它节点值的 前序 、 中序 、 后序 遍历。示例1:前序遍历输入:root = [1,null,2,3] 输出:[1,2,3]示…

靈機 AI 解夢:傳統周公解夢的現代升級

# 靈機AI解夢:傳統周公解夢的現代升級在人類文化的長河中,夢一直是一個充滿神秘色彩的領域。人們對夢的解讀和探索從未停止,從古老的周公解夢到現代的各種解夢理論和方法,都反映了人類對潛意識世界的好奇與渴望。靈機AI解夢平台的出現,為解夢領域帶來了新的活力和可能,與…

20222418 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 实验内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程(2)通过组合应用各种技术实现恶意代码免杀 如果成功实现了免杀的,简单语言描…

Android添加OpenCV支持,一步一步添加。

首先下载OpenCV的SDK 推荐在官网下载。 官网地址:https://opencv.org/releases/ 也可以在OpenCV的GitHub上现在 GitHUb链接:https://github.com/opencv/opencv/releases 官网下载:GitHub下载下载完成后,解压压缩包,会得到以下目录其中SDK文件夹是我们要导入的目标。在进行…

有哪些好用的互联网项目远程协作工具

好用的互联网项目远程协作工具有:一、Slack;二、Microsoft Teams;三、Trello;四、Asana;五、Google Workspace。其中,Slack具有强大的聊天和通知功能,它允许用户创建不同的频道来组织讨论,并支持与其他工具的集成。一、Slack Slack是一款流行的实时沟通工具,以其强大的…

xshell终端识别http ftp 链接 ctrl点击打开链接

前言全局说明xshell终端识别http ftp 链接 ctrl点击打开链接一、说明终端链接可以直接点击,比复制一下方便很多二、开启,中断连接识别 2.1 点工具--选项2.2 点 键盘鼠标 -- 鼠标 按图片勾选免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。参考、…

麒麟系统(arm64/aarch64)docker部署prometheus系统

备注:1.不推荐yum或者源码安装,安装包跟系统架构不兼容,推荐docker方式部署,这样就可以忽略系统不兼容的问题。2.准备工作:开通端口映射,即公网的ip加grafana的默认端口9090到内网部署grafana服务的服务器的9090端口的映射,就可以通过外网访问。 一、目标:收集所有节点…