题解:CF207A2 Beaver's Calculator 1.0
这是可以通过 A2 和 A3 的正解做法。
我们把
例如:
很显然,如果有
证明一下:如果取到了元素
我们也可以忽视这个取头部元素的要求,直接使用一个优先队列去维护。
注意到优先队列默认是大根堆,所以我们可以把元素值取反扔进一个 pair
里,大大降低了细节量。
#include<bits/stdc++.h>
using namespace std;
int n;
int k[3];
long long x,y,a[3][200005],m;
int duan[3][200005],cnt[200005],now[200005];
int pan(long long a,long long b){
if(a>=b)return 0;
return 1;
}
//int cnt=0;
priority_queue<pair<long long,int> >q;
signed main(){
cin>>n;
cin>>k[1]>>a[1][1]>>x>>y>>m;
for(int i=2;i<=k[1];i++){
a[1][i]=(a[1][i-1]*x+y)%m;
if(a[1][i]<a[1][i-1]){
duan[1][++cnt[1]]=i-1;
}
}
cin>>k[2]>>a[2][1]>>x>>y>>m;
for(int i=2;i<=k[2];i++){
a[2][i]=(a[2][i-1]*x+y)%m;
if(a[2][i]<a[2][i-1]){
duan[2][++cnt[2]]=i-1;
}
}
duan[1][++cnt[1]]=k[1];
duan[2][++cnt[2]]=k[2];
cout<<max(cnt[1],cnt[2])-1<<endl;
if(k[1]+k[2]>200000)return 0;
for(int i=1;i<=n;i++)now[i]=1;
for(int i=1;i<=max(cnt[1],cnt[2]);i++){
for(int j=1;j<=n;j++){
if(cnt[j]<i)continue;
for(;now[j]<=duan[j][i];now[j]++){
pair<long long,int>ans;
ans.first=-a[j][now[j]];
ans.second=j;
q.push(ans);
}
}
while(!q.empty()){
cout<<-q.top().first<<' '<<q.top().second<<endl;
q.pop();
}
}
return 0;
}
A1 题更改数据范围即可,A3 题此代码会 MLE。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】