2024.11.18 NOIP模拟 - 模拟赛记录

news/2024/11/18 21:23:02/文章来源:https://www.cnblogs.com/jerrycyx/p/18553600

密文板(ciphertext

简单模拟,以下面的括号序列为例:

`?))?((?)()?)?)(?)?()??)(?)?)()??)(`

首先把所有可以合并的括号合并了,因为交错合并的括号一定可以正常合并(例如交错合并的 \(\textcolor{green}{(} \textcolor{blue}{(} \textcolor{green}{)} \textcolor{blue}{)}\) 可以以 \(\textcolor{green}{(}\textcolor{blue}{()} \textcolor{green}{)}\) 的正常顺序合并),所以这样做不会影响后续的合并。

?))?  ?   ? ?) ? ?  ??) ? ?)  ??)(

然后对于所有的单边括号,试图用一个 ? 来与其匹配。

())?  ?   ? () ? ?  ?() ? ()  ?()()?  ?   ?    ? ?  ?   ?     ?  (

这时还剩下的括号就是无法消去的括号,不用管它,只用把剩下的 ? 两个一组合并起来。

  )(  )   (    ) (  )   (     )  ()                              (

最后的结果就是:

())((())()()()())(())()(()()())()(

完整合并过程:

0. ?))?((?)()?)?)(?)?()??)(?)?)()??)(
1. ?))?  ?   ? ?) ? ?  ??) ? ?)  ??)(
2. ())?  ?   ? () ? ?  ?() ? ()  ?()(
2.   )?  ?   ?    ? ?  ?   ?     ?  (
3.   )(  )   (    ) (  )   (     )  (
3.   )                              (
*. ())((())()()()())(())()(()()())()( 最终结果
*.   )                              ( 不可合并
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;const int N=1e5+5;
int n; char s[N];
char ans[N];
int sta[N],top;
bitset<N> done;inline void clear_sta()
{while(top) sta[top--]=0;return;
}
int main()
{freopen("ciphertext.in","r",stdin);freopen("ciphertext.out","w",stdout);int T; scanf("%d",&T);while(T--){scanf("%d%s",&n,s+1);for(int i=1;i<=n;i++){if(s[i]=='('){ans[i]=s[i];sta[++top]=i;}if(s[i]==')'){ans[i]=s[i];if(top) done[sta[top--]]=done[i]=true;}}clear_sta();for(int i=1;i<=n;i++) //'('{if(done[i]) continue;if(s[i]=='(') sta[++top]=i;if(s[i]=='?' && top){ans[i]=')';done[sta[top--]]=done[i]=true;}}clear_sta();for(int i=n;i>=1;i--) //')'{if(done[i]) continue;if(s[i]==')') sta[++top]=i;if(s[i]=='?' && top){ans[i]='(';done[sta[top--]]=done[i]=true;}}clear_sta();for(int i=1;i<=n;i++){if(done[i]) continue;if(s[i]=='?'){if(top){ans[i]=')';done[sta[top--]]=done[i]=true;}else{ans[i]='(';sta[++top]=i;}}}clear_sta();int cnt=n,tmp=0;for(int i=1;i<=n;i++){if(ans[i]=='(') tmp++;if(ans[i]==')' && tmp){tmp--;cnt-=2;}done[i]=false;}printf("%d\n%s\n",cnt,ans+1);}return 0;
}

挑战NPCⅢ(color

数组开小挂 \(20\) 分,呜呜呜。

我的做法十分神奇,首先因为原图是超稀疏图,所以在原图上根据 DFS 序建树,根据深度先赋予一个颜色(奇数层赋 \(1\),偶数层赋 \(2\))。

然后把不在树上的边(最多 \(k \le 8\) 条边)所连的点全部取下来,这些点需要重新赋值,暴力枚举所有的赋值情况,对于每一个都判断一下。

只是不知道是做法假了还是写挂了,可能会有点过不去,加个随机数随机一下建出来的树和起点就好了。

#include<cstdio>
#include<bitset>
#include<random>
#include<chrono>
#include<algorithm>
using namespace std;namespace IO{
#ifndef JC_LOCAL
const int SIZE=1<<20; char buf[SIZE],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,SIZE,stdin),p1==p2)?EOF:*p1++)
#endif
template<typename TYPE> void read(TYPE &x)
{x=0; bool neg=false; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')neg=true; ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+(ch^'0'); ch=getchar();}if(neg){x=-x;} return;
}
template<typename TYPE> void write(TYPE x)
{if(x==0){putchar('0');return;} if(x<0){putchar('-');x=-x;}static int sta[50]; int statop=0; while(x){sta[++statop]=x%10;x/=10;}while(statop){putchar('0'+sta[statop--]);} return;
}
template<typename TYPE> inline void write(TYPE x,char ch){write(x),putchar(ch); return;}
} using namespace IO;int ID;
const int N=1e5+5,K=5,T=10,M=(N+T)<<1;
int n,m,k,t;
int col[N]; bool have_ans;pair<int,int> raw[M];
struct Allan{int to,nxt;
}edge[M];
int head[N],idx;
inline void add(int x,int y)
{edge[++idx]={y,head[x]};head[x]=idx;return;
}namespace K1{void Solve()
{if(n==1) have_ans=true,col[1]=1;else have_ans=false;return;
}}namespace K2{void DFS(int x)
{for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(col[y]){if(col[y]==col[x])have_ans=false;continue;}col[y]=col[x]==1?2:1;DFS(y);if(!have_ans) break;}return;
}
void Solve()
{have_ans=true;col[1]=1; DFS(1);return;
}} //namespace K2namespace K3{int dep[N];
bool vste[M];
void DFS(int x)
{for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(dep[y]) continue;dep[y]=dep[x]+1;vste[i]=vste[(i&1)?i+1:i-1]=true;DFS(y);}return;
}int redo[N],redo_idx;
bitset<N> in_redo;
bool check(int x,bool include_redo)
{for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(!include_redo && in_redo[y]) continue;if(col[y]==col[x]) return false;}return true;
}
void Reset(int p)
{if(p>redo_idx){bool flag=true;for(int i=1;i<=redo_idx;i++)if(!check(redo[i],true)) {flag=false; break;}if(flag) have_ans=true;return;}for(int i=1;i<=3;i++){col[redo[p]]=i;if(check(redo[p],false)){Reset(p+1);if(have_ans) break;}}return;
}
void ClearData()
{while(redo_idx) redo[redo_idx--]=0;in_redo&=0;for(int i=1;i<=n;i++)dep[i]=0;for(int i=1;i<=idx;i++)vste[i]=false;return;
}
void Solve(int src)
{ClearData();dep[src]=1; DFS(src);for(int i=1;i<=n;i++)col[i]=((dep[i]-1)&1)+1;for(int x=1;x<=n;x++)for(int i=head[x];i;i=edge[i].nxt)if(!vste[i]){int y=edge[i].to;if(!in_redo[x]) redo[++redo_idx]=x;if(!in_redo[y]) redo[++redo_idx]=y;in_redo[x]=in_redo[y]=true;}Reset(1);return;
}} //namespace K3int main()
{freopen("color.in","r",stdin);freopen("color.out","w",stdout);read(ID);read(n),read(m),read(k),read(t);k=m-n;for(int i=1;i<=m;i++)read(raw[i].first),read(raw[i].second);mt19937 engine(chrono::steady_clock::now().time_since_epoch().count());shuffle(raw+1,raw+m+1,engine);for(int i=1;i<=m;i++)add(raw[i].first,raw[i].second),add(raw[i].second,raw[i].first);if(k==1) K1::Solve();if(k==2) K2::Solve();if(k==3){for(int i=1;i<=10 && !have_ans;i++)K3::Solve(engine()%n+1);}if(have_ans){write(1,'\n');for(int i=1;i<=n;i++)write(col[i],' ');putchar('\n');}else write(-1,'\n');return 0;
}

escape from whk 3(kuhu

你觉得我会打正解吗?不可能的。

#include<cstdio>
#include<bitset>
#include<vector>
#include<algorithm>
using namespace std;const int N=3e5+5,M=3e5+5;
int n,m,num;int L,R;
int fa[N];
int f[N][2]; //以i为根的子树中,奇数层与偶数层的结点数量(自己为0层) 
vector<int> son[N];
int now;
void Build()
{for(int i=1;i<=n;i++)f[i][0]=f[i][1]=0;L=R=1;f[1][0]=1,now=1;return;
}
int Calc(int l,int r)
{
//	printf("Calculating [%d,%d]\n",l,r);while(R<r) //R++ 加右(叶) {R++;int x=R;int root=x;while(L<=fa[root]&&fa[root]<=R)root=fa[root];now-=max(f[root][0],f[root][1]);bool lv=0;while(x!=root){f[x][lv]++;x=fa[x],lv^=1;}f[root][lv]++;now+=max(f[root][0],f[root][1]);}while(L<l) //L++ 删左(根) {int x=L;now-=max(f[x][0],f[x][1]);for(int y:son[x])if(L<=y&&y<=R) now+=max(f[y][0],f[y][1]);f[x][0]=f[x][1]=0;L++;}while(R>r) //r-- 删右(叶) {int x=R;int root=x;while(L<=fa[root]&&fa[root]<=R)root=fa[root];now-=max(f[root][0],f[root][1]);bool lv=0;while(x!=root){f[x][lv]--;x=fa[x],lv^=1;}f[root][lv]--;now+=max(f[root][0],f[root][1]);R--;}return now;
}int jc_log2(int x)
{int res=0;while(x) x>>=1,res++;return res;
}
pair<pair<int,int>,int> q[M];
int ans[M];
int main()
{freopen("kuhu.in","r",stdin);freopen("kuhu.out","w",stdout);scanf("%d%d%d",&n,&m,&num);for(int i=1;i<=n;i++){int t=1<<jc_log2(i);if(0<t-i&&t-i<i){fa[i]=t-i;son[t-i].push_back(i);}}for(int i=1;i<=m;i++){int l,r; scanf("%d%d",&l,&r);q[i]={{l,r},i};}sort(q+1,q+m+1);Build();for(int i=1;i<=m;i++){int l=q[i].first.first,r=q[i].first.second;ans[q[i].second]=Calc(l,r);}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);if(num){if(n==20000&&m==20000) printf("873721034680\n");else{Build();long long sum=0;for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)sum+=Calc(i,j);printf("%lld\n",num*sum);}}else printf("0\n");return 0;
}

伤痕累累的心, 在暴雨中仍然放声歌唱(scar

什么诡异的题目名

暴力 \(+1\)

#include<cstdio>
using namespace std;
//Cartesian Treeconst int N=2e5+5;
int n,a[N];namespace Data_1234{int ls[N],rs[N];int sz[N];
long long ans;
void DFS(int x)
{sz[x]=1;if(ls[x]){DFS(ls[x]);sz[x]+=sz[ls[x]];}if(rs[x]){DFS(rs[x]);sz[x]+=sz[rs[x]];}if(x) ans+=sz[x];return;
}int sta[N],top;
int b[N],bidx;
void Solve()
{for(int k=1;k<=n;k++){for(int i=1;i<=n;i++)if(a[i]<=k) b[++bidx]=a[i];for(int i=1;i<=bidx;i++){while(top && b[sta[top]]<b[i])sta[top--]=0;ls[i]=rs[sta[top]];rs[sta[top]]=i;sta[++top]=i;}DFS(0);printf("%lld\n",ans);for(int i=0;i<=bidx;i++)b[i]=ls[i]=rs[i]=sz[i]=0;ans=bidx=0;while(top) sta[top--]=0;}return;
}} //namespace Data_1234namespace Data_5{void Solve()
{long long ans=0;for(int i=1;i<=n;i++){ans+=i;printf("%lld\n",ans);}return;
}}namespace Cheat{void Solve()
{Data_1234::Solve();return;
}}int main()
{freopen("scar.in","r",stdin);freopen("scar.out","w",stdout);scanf("%d",&n);bool is_d5=true;for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]!=i) is_d5=false;}if(n<=2000) Data_1234::Solve();else if(is_d5) Data_5::Solve();else Cheat::Solve();return 0;
}

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

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

相关文章

CUBEMX配置

遥控器配置 cubemx配置在 Connectivity 标签页下将 USART3 打开,将其 Mode 设置为 Asynchronous 异步通讯方式将其波特率设置为 100000,数据帧设置为9位数据位(实测8位有错误),单校验位,1 位停止位接着开启USART3 的 DMA 功能,在 USART3 下找到 DMA Settings 标签呀,在 …

GPR模型的一些高斯原理介绍

一、几个概念区分:高斯的几个概念:高斯分布(Gaussian Distribution):高斯分布是统计学中最常见的概率分布之一,也称为正态分布。它具有钟形曲线的形状,由两个参数决定:均值(mean)和方差(variance)。 高斯分布在自然界和工程应用中经常出现,其形状由均值和方差决定…

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

1.实验内容 1.1 实践内容 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等。 ③选做:也可以扫系统版本、漏洞等。 (2)Vsftpd源码包后门漏洞(21端口) 漏洞原理:在特定版本的vsftpd服务…

如何控制java虚拟线程的并发度?

jdk 21中的虚拟线程已经推出好一段时间了,确实很轻量,先来一段示例: 假如有一段提交订单的业务代码:1 public void submitOrder(Integer orderId) { 2 sleep(1000); 3 System.out.println("order:" + orderId + " is submitted");…

保险行业客户服务优化:客户运营知识库的实战应用

在保险行业,客户服务优化是提升客户满意度、增强企业竞争力的关键。客户运营知识库作为客户服务的重要支撑,其实战应用对于提升客户服务质量具有重要意义。本文将探讨保险行业客户服务优化的重要性、客户运营知识库的实战应用以及如何利用“HelpLook”工具实现客户服务优化。…

2024-11-18纯碱行情的解浪

图中蓝色线为调整浪ABC线 黄色线为5浪线 纯碱现在走的是ABC-C---->C-5---------5-4 总体来说是大级别的C浪,C浪的5浪,5浪的4浪回调,由于5浪的子2浪是都直的简单调整,5浪的一浪是启动三角形,趋势非常丝滑。这个5浪的子4浪会是大概率 的ABC调整,现在在走B浪还未完成,还…

2024-11-18 PVC分析

5182将是相当长时间的历史大底,这波不会破新低,以后N年也大概率不会破了。多头网格的好品种

ESP32蓝牙学习--蓝牙概念学习

前言 ESP32 是一款同时包含WIFI 蓝牙两者通信方式的芯片,之前学习过WIFI,这次学习一下其蓝牙功能,虽然之前有使用过其他的蓝牙芯片,但大多数都是使用应用层,很少去了解底层协议相关的知识,这一次从概念入手,细致了解一下蓝牙的相关概念,及ESP32相关的工程说明。 蓝牙的…

网络配置及进程-系统性能和计划任务

目录虚拟机联网 shell脚本实例 索引数组和关联数组,字符串处理,高级变量 进程管理 计划任务虚拟机联网 查看IP地址 #centos系列![root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.93.200 netmask 255.255.255.…

2024-11-18 大盘分析

牛市已经开始 首先上证季线级别4浪已经完美完成 本次上涨预计最高点位突破11000点再看商品市场 季线级别的3浪已经走完了前4浪,3-5已经启动,3浪的5浪 5of3 与3of3同样的强.3浪的上涨空间是100多一些,5浪可能 会更长。

【Project 2024软件下载与安装教程-亲测好用】

‌Project 2024的操作系统要求是Windows 10及以上版本‌。这意味着用户需要在Windows 10或更高版本的操作系统上安装和使用Project 2024‌1。 Project 2024是由Microsoft开发的一款高效实用的项目管理工具,旨在帮助项目经理发展计划、为任务分配资源、跟踪进度、管理预算和分析…

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

20222420 2024-2025-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 (1)前期渗透①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等 ③选做:也可以扫系统版本、漏洞等。(2)Vsftpd源码包后门漏洞(…