ABC298 CDE 题解 -fangyanli

fangyanli 2023-08-17 19:04:10 3

C题

题意:给定 个盒子,你需要满足一下三种操作:

  • ,把数字 扔到盒子 里面;
  • ,查询盒子 里面的数字,按升序输出;
  • ,查询数字 出现在的盒子编号,按升序输出。(若多个同一数字出现在一个盒子,那么这个盒子编号只输出一次。)

思路:用set存盒子编号,用mulitset存数字编号

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,a[200001];
set<int> s[200001];
multiset<int> ss[200001];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    cin>>n>>q;
    while(q--){
    	int op,i;cin>>op>>i;
    	if(op==1){
    		int j;cin>>j;
    		ss[j].insert(i);
    		s[i].insert(j);
		}
		if(op==2){
			for(multiset<int>::iterator it=ss[i].begin();it!=ss[i].end();it++){
				cout<<*it<<" ";
			}
			cout<<"\n";
		}
		if(op==3){
			for(set<int>::iterator it=s[i].begin();it!=s[i].end();it++){
				cout<<*it<<" ";
			}
			cout<<"\n";
		}
	}
    return 0;
}

D题

题意:有一序列,初始有 你需要满足以下三种操作:

  • :将一个数字 加到序列最后面;

  • :删除 最前面;

  • :查询 从前往后,由数位拼凑的数字。对 取模。

思路:用queue直接模拟,对于操作2,用当前ans减去pow(10,len-1)则为操作后的数组

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
int Q,ans=1,len;
queue<int> q;
int qpow(int x,int y){
	int out=1;
	while(y){
		if(y&1) out=out*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return out;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    cin>>Q;
    q.push(1);
    while(Q--){
    	int opt;
    	cin>>opt;
    	if(opt==1){
    		int x;
    		cin>>x;
    		ans=(ans*10%mod+x)%mod;
    		q.push(x);
    		len++;
		}
		if(opt==2){
    		ans=(mod+(ans-qpow(10,len)*q.front()%mod)%mod)%mod;
    		len--;
    		q.pop();
		}
		if(opt==3){
    		cout<<ans<<"\n";
		}
	}
    	
}

E题

题意:两个人(分别记甲和乙)手上分别有初始值

甲有个骰子,等概率从 中出现一个数,让甲当前值加上出现的数。乙同理,不过是等概率从 中出现一个数。

当前的数先大于等于 的人胜利。甲先甩,甲乙轮流。问甲获胜的几率。答案对 取模。

思路:概率DP,求出逆元之后五重循环枚举轮数,甲的位置,乙的位置,甲的步数,乙的步数,用刷表的方法转移

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
int n,a,b,p,q,dp[102][102][102],ans;
int qpow(int x,int y=mod-2){
	int out=1;
	while(y){
		if(y&1) out=out*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return out;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    cin>>n>>a>>b>>p>>q;
    int inv=qpow(p)*qpow(q)%mod;
    dp[0][a][b]=1;
    for(int i=1;i<=n;i++){
    	for(int l=a;l<n;l++){
		    for(int r=b;r<n;r++){
			    for(int lstep=1;lstep<=p;lstep++){
			    	for(int rstep=1;rstep<=q;rstep++){
			    		dp[i][min(n,l+lstep)][min(n,r+rstep)]=(dp[i][min(n,l+lstep)][min(n,r+rstep)]+inv*dp[i-1][l][r]%mod)%mod;
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=b;j<=n;j++){
			ans=(ans+dp[i][n][j])%mod;
		}
	}
	cout<<ans;
}
{{ vote && vote.total.up }}