ABC-411-E - E [max]

思路讲解

在竞技编程中,对于求解概率或期望值的问题,通常可以运用以下技巧:与其求某个最大值与某个特定值重合的概率,不如求该最大值小于或等于该特定值的概率。这个技巧也适用于这个问题:

说实话,这个我确实想到了,但是这个想法被我pass了。其实不应该忽视求什么比较容易的想法的,或者说想到了一些可以求的量,应该去想怎么样做才能求得最终的量。

那么注意到那,我们可以先求概率,接着再求期望,那么P(K)表示≤k最大值小于等于K的概率

alt

alt

这个就是Pk-1和Pk的关系,那么我们现在的重点就是说我们如何快速计算这个,快速完成递推那?

那么这个办法就有很多,我选择是使用优先队列。

AC代码

https://atcoder.jp/contests/abc411/submissions/66998392

  • 源代码

    // Problem: E - E [max]
    // Contest: AtCoder - UNIQUE VISION Programming Contest 2025 Summer (AtCoder Beginner Contest 411)
    // URL: https://atcoder.jp/contests/abc411/tasks/abc411_e
    // Memory Limit: 1024 MB
    // Time Limit: 3000 ms
    // 
    // Powered by CP Editor (https://cpeditor.org)
    
    #include <bits/stdc++.h>
    #define all(vec) vec.begin(),vec.end()
    #define CLR(i,a) memset(i,a,sizeof(i))
    #define pb push_back
    #define SZ(a) ((int) a.size())
    #define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
    #define ROF(i, a, b) for (int i = (a); i >= (b); --i)
    #define debug(var) cerr << #var <<":"<<var<<"\n";
    #define lson(var) (var<<1)
    #define rson(var) ((var<<1)+1)
    
    using namespace std;
    
    typedef long long ll;typedef unsigned long long ull;
    typedef double DB;typedef long double LD;
    typedef __int128 i128;typedef pair<DB,DB> pdd;typedef pair<ll,bool> plb;
    typedef pair<ll,ll> pll;
    typedef array<ll,3> arr3;typedef array<ll,2> arr2;
    constexpr ll MAXN=static_cast<ll>(1e6)+10,INF=static_cast<ll>(1e17)+9; // 1e18+9也是素数
    constexpr ll mod=998244353;
    constexpr double eps=1e-8;
    
    ll N,M,Q,X,K,lT,A[MAXN][10];
    /*
    
    */
    inline void init(){
    	
    }
    ll binpow(ll a,ll k,const ll &p){	// 迭代快速幂
    	ll res=1;
    	while(k>0){
    		if((k&1)==1) res=a*res%p;
    		a=a*a%p;
    		k>>=1;
    	}
    	return res;
    }
    inline void solve(){
    	cin>>N;
    	init();
    	vector<ll> li;
    	li.pb(-INF);
    	priority_queue<arr2> pq;
    	FOR(i,1,N){
    		FOR(j,1,6){
    			cin>>A[i][j];
    			li.pb(A[i][j]);
    			pq.push({A[i][j],i});
    		}
    	}
    	sort(all(li));
    	li.resize(unique(all(li))-li.begin());
    	ll lsz=SZ(li)-1;
    	vector<arr2> dp(lsz+5,{0,0});		// dp[i]指的是max值大于i的概率(i是经过离散化的)
    	dp[lsz][0]=1,dp[lsz][1]=1;
    	vector<ll> cnt(N+5,6);
    	vector<ll> org(N+5,0);
    	ROF(_,lsz-1,1){
    		ll val=li[_+1];ll fac1=1,fac2=1;
    		vector<ll> wp;
    		while(pq.empty()==false && pq.top()[0]==val){
    			ll id=pq.top()[1];
    			pq.pop();
    			org[id]=max(cnt[id],org[id]);
    			cnt[id]--;
    			wp.pb(id);
    		}
    		sort(all(wp));wp.resize(unique(all(wp))-wp.begin());
    		FOR(i,0,SZ(wp)-1){
    			ll id=wp[i];	// 含有k的面<=k-1的面数
    			fac1*=cnt[id];fac1%=mod;
    			fac2*=org[id];fac2%=mod;
    			org[id]=0;
    		}
    		// 分子
    		dp[_][0]=dp[_+1][0]*fac1%mod;
    		dp[_][1]=dp[_+1][1]*fac2%mod;	// 分母
    #ifdef LOCAL
        debug(_);
        debug(dp[_][0]);
        debug(dp[_][1]);
        debug(fac1);debug(fac2);debug(val);
    #endif
    	}
    	ll ans=0;
    	dp[0][1]=1;	// 避免分母为0导致问题
    	ROF(i,lsz,1){
    		ll lans=0;
    		ll fac1=dp[i][0]*dp[i-1][1]-dp[i-1][0]*dp[i][1];fac1%=mod;
    		ll fac2=dp[i][1]*dp[i-1][1];fac2%=mod;
    #ifdef LOCAL
    	cerr<<"---------\n";
        debug(fac1);debug(fac2);
    #endif
    		fac2=binpow(fac2,mod-2,mod);
    		lans=fac1*fac2%mod*li[i]%mod;	// 变为期望值
    		ans+=lans;ans%=mod;
    	}
    	if(ans<0) ans+=mod;
    	cout<<ans<<"\n";
    	// cout<<10*binpow(3,mod-2,mod)%mod<<"\n";
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);cout.tie(0);
    	
    	// cin>>lT;
    	// while(lT--){
    		// solve();
    	// }
    	solve();
    	return 0;
    }
    /*
    AC
    https://atcoder.jp/contests/abc411/submissions/66998392
    */
    
#牛客创作赏金赛#
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
06-16 20:57
已编辑
湖南人文科技学院 C++
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务