首页 > 其他分享 >231114校内模拟赛

231114校内模拟赛

时间:2023-11-14 18:22:44浏览次数:36  
标签:pre 231114 校内 cout int pos ans 模拟 define

T1 平凡

原题链接

首先,我们容易发现直接求 \(A\) 不是最小的子序列的排列的个数有些困难

#include<bits/stdc++.h>
#define mod 998244353
#define N 1000010
#define int long long
using namespace std;
int n,k,a[N],t[N],vis[N],ans,all,pos;
signed main(){
	freopen("ordinary.in","r",stdin);
	freopen("ordinary.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>k;
	ans = all = 1;
	for(int i = k+1;i<=n;i++)
		all = all*i%mod;
	for(int i = 1;i<=k;i++){
		cin>>a[i];
		t[a[i]] = 1;
	}
	for(int i = 1;i<=k;i++){
		if(a[i]>a[i+1]){
			pos = i;
			for(int j = i+1;j<=k;j++)
				vis[a[j]] = 1;
			break;
		}
	}
	int sum = 0;
	for(int i = 1;i<=n;i++){
		if(!vis[i]){
			if(!t[i])
				ans = ans*(sum+(i>a[pos]))%mod;
			sum++;
		}
	}
	cout<<(all-ans+mod)%mod;
	return 0;
}

T2 奇迹

来源: P8227 「Wdoi-5」建立与摧毁的结界

洛谷题解讲的很明白了,不过代码实现上不够清楚

对于 \(pre\) 函数就是处理出了每一个括号配对的位置

\(getans\) 函数就是就是题解中所说的 \(f,g\) 两个数组,对于 \(flag\) 就是判断到底当前是哪种序列

\(dfs\) 函数就是对于每一个区间递归计算答案,先处理出哪些左括号是当前层的左括号

然后比较两个字符串是否相同,当前层相同则不操作,否则计算答案,最后还原数组

#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int n,ans,apair[N],bpair[N],aleft[N],bleft[N];
char a[N],b[N];
inline void pre(char s[],int t[]){
	stack<int>stk;
	for(int i = 1;i<=n;i++){
		if(s[i]==')'){
			t[i] = stk.top();
			t[t[i]] = i;
			stk.pop();
		}else stk.push(i);
	}
}
int getans(int t[],int l,int r,bool flag){
	if(l+1==r) return 0;
	if(t[l+1]==r-1){
		if(!flag) return getans(t,l+1,r-1,1)+1;
		return getans(t,l+1,r-1,1);
	}else{
		int res = 0;
		for(int i = l+1;i<r;i = t[i]+1)
			res+=getans(t,i,t[i],0);
		return res+(flag?1:2);
	}
}
int dfs(int l,int r){
	if(l+1==r) return 0;
	int res = 0;
	for(int i = l;i<=r;i = apair[i]+1) aleft[i] = 1;
	for(int i = l;i<=r;i = bpair[i]+1) bleft[i] = 1;
	for(int i = l;i<=r;i = apair[i]+1)
		if(bleft[i]&&apair[i]==bpair[i])
			res+=dfs(i+1,apair[i]-1);
	for(int i = l;i<=r;i = apair[i]+1)
		if(!bleft[i]||apair[i]!=bpair[i])
			res+=getans(apair,i,apair[i],0);
	for(int i = l;i<=r;i = bpair[i]+1)
		if(!aleft[i]||apair[i]!=bpair[i])
			res+=getans(bpair,i,bpair[i],0);
	for(int i = l;i<=r;i = apair[i]+1) aleft[i] = 0;
	for(int i = l;i<=r;i = bpair[i]+1) bleft[i] = 0;
	return res;
}
int main(){
	freopen("miracle.in","r",stdin);
	freopen("miracle.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>a+1>>b+1;
	pre(a,apair);
	pre(b,bpair);
	cout<<dfs(1,n);
	return 0;
}

标签:pre,231114,校内,cout,int,pos,ans,模拟,define
From: https://www.cnblogs.com/cztq/p/17832236.html

相关文章

  • YCOJ734 [ 20231114 NOIP 模拟赛 T3 ] 二次函数
    题意给定\(n\)个形如\(f(x)=(x-m)^2+k\)的二次函数。\(1,m,k\)表示加入一个顶点位\((m,k)\)的二次函数。\(2,x,t\)表示删除所有\(f(x)\let\)的二次函数。求每次操作结束后还剩余几个二次函数。Sol注意到题中二次系数为\(1\),这就意味着每一个函......
  • 20231114打卡
    早上,我在课堂上学习了拓扑排序和关键路径两个在工程实践中非常重要的概念。拓扑排序是一种拓扑排序算法,用于高效地解决有向无环图(DAG)中的依赖问题。关键路径则可以帮助我们确定项目计划中的关键节点和关键路径,是工程项目管理中非常常用的技术。通过课堂讲解和案例分析,我对这两个概......
  • 202311141210——《一些修改表字段的sql语句》
    ALTERTABLEuserADDCOLUMNtelCHAR(11)AFTERwechat;#添加列ALTERtablecustomermodifycolumnpasswordvarchar(200);#修改列类型ALTERTABLEuserALTERCOLUMNstatusSETDEFAULT1;#设置默认值ALTERTABLEuserMODIFYcolumnemp_idTIMESTAMPDEFAULTNULL......
  • 20231114学习总结
    推荐参考书:[1]范淼,李超.Python机器学习及实践,清华大学出版社.[2]PeterHarrington.机器学习实战,人民邮电出版社。《机器学习B实验任务书1》一、上机安排时间地点第10周周一2023.11.06第6-7节九实4-3、4-4第11周周一2023.11.13第6-7节九实......
  • C++模拟键盘操作
    前言:C++/C语言模拟键盘操作十分的黑科技啊,作者也是借鉴了C/C++模拟键盘操作(一)_折竹丶的博客-CSDN博客_c++模拟键盘​​​​​​​​​​​​​​  来做一个小小的全面总结,有兴趣可以去看原创 键盘操作:在C++中有一个头文件:windows.h我们可以尝试导入他: #include<......
  • 2023年11月13日模拟赛
    同步更新于我的博客总结昨日中二病发作写了一篇离谱文章,请直接无视,别看阿⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄。害怕......
  • 11.13 模拟赛小记
    30+0+10+0全真模拟。今天的模拟赛有一种格外的说不上来的绝望的感觉。很不好描述的。一直在想如果这是真实的noip赛场那我不就大寄特寄了。下午因为不舒服所以玩了一下午(?)一直在机惨别人(?)玩的很开心。但还是想看大家在机房跳钢管舞喵(?A.game赛时看到这个题之后就变得很愚蠢。......
  • 模拟集成电路设计系列博客——3.4.3 低压降稳压器
    3.4.3低压降稳压器当稳压器输出必须要仅比\(V_{DD}\)低\(200-400mV\),并且无法低阈值电压(\(V_t\)接近零)的NMOS器件时,有必要使用一个PMOS器件作为\(Q_1\)。如下图所示,在这个例子中,栅电压\(V_1\)低于\(V_{DD}\),稳压器压只受到\(V_{eff,1}\)限制,这个电路被称为低压降稳压器(LDO),是电路......
  • NOIP模拟赛35T1T2
    T1KAMEN只能说一言难尽。60pt暴力模拟每一个石头往下掉的情况。在这里,我并没有打暴力,而是用set存储了每一列的X和O的石子分布情况。当前节点的位置在(x,y),寻找x列中比y大的第一个位置在ny(这里可以用upper_bound),那么石子在这一列能往下掉到的位置就是(x,ny-1)然后再判断能......
  • 【2023.11.13】NOIP2023模拟试题-33.md
    T1贪心地找到和最大的组的较大数删除是最优选择,因此开线段树维护全局最大数,并单点更新指定位置的值。参考代码展开代码#include<bits/stdc++.h>usingnamespacestd;#definefi(l,r)for(inti=l;i<=r;++i)#defineff(i,l,r)for(inti=l;i<=r;++i)#definelllonglon......