2025省选模拟5
2025省选模拟5
T1、 枇杷树
题意是说每次会使用前面的两棵树通过每棵树各一个点之间连了一条边然后组成一颗新树,我们可以从这个性质入手。
对于每次
于是答案可以分成子问题去算:
其中
然后问题转化成了求解
然后我们发现又多出来了一个
这样显然会
T2、 上古遗迹
首先如果是全局查询的话,这就是很简单的单调栈就做完了,但对于询问的不是全局而是区间
case 1
对于
case 2
对于
case 3
对于
case 4
对于
时间复杂度为
T3、 吞天得手
看上去好像很简单,但又不想写。
首先考虑我们已经目前一个最优的前缀,比起改变它里面的某个数,一定不如往他后面加入一个数更优,所以思路就是,我们一开始有一个最优前缀
一个好写的做法就是在
讲的可能比较乱,看一下代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define int ll typedef unsigned long long ull; typedef pair<int,int> pii; #define fi first #define se second #define ps push_back #define mk make_pair const int N=1e6+10,inf=0x3f3f3f3f; const ll linf=0x3f3f3f3f3f3f3f3f,mod=998244353; inline ll read(){ char c=getchar();ll x=0;bool f=0; while(!isdigit(c))f=c=='-'?1:0,c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x; } int n,K,b,a[N],rt[N]; int cnt[N<<3],son[N<<3][2],tot; inline void add(int &k,int l,int r,int pos){ cnt[++tot]=cnt[k]+1,son[tot][0]=son[k][0],son[tot][1]=son[k][1]; k=tot; if(l==r)return; int mid=l+r>>1; pos<=mid?add(son[k][0],l,mid,pos):add(son[k][1],mid+1,r,pos); } inline pii ask(int k,int v){ int l=1,r=1e5,mid; while(l<r){ mid=l+r>>1; if(v<=cnt[son[k][0]])k=son[k][0],r=mid; else v-=cnt[son[k][0]],l=mid+1,k=son[k][1]; } return {l,v}; } struct jj{ int pos,ans,k,zhp; inline bool operator <(const jj&x)const{return a[zhp]>a[x.zhp];} }; vector<int> v[N>>3];// v[i] 存放了 a[pos] = i 的所有位置,以便查找 zhp inline void dfs(priority_queue<jj> q){ while(q.size()){ auto k=q.top(); priority_queue<jj> qq; while(q.size()&&q.top().ans==k.ans){ auto i=q.top();q.pop();--K; cout<<i.ans<<'\n'; if(K<=0)exit(0); jj j=i; j.pos=i.zhp;j.k=1; if(j.k+j.pos<=n){ auto tp=ask(rt[j.pos+1],j.k);// ask 为主席树查询第 k 大,返回 pair<int,int> 类型,first 表示第 k 大的值,second表示第 k 大在相同值中是第几个,为了查询 zhp j.ans=(i.ans*b+tp.fi)%mod;j.zhp=v[tp.fi][upper_bound(v[tp.fi].begin(), v[tp.fi].end(),j.pos)-v[tp.fi].begin()+tp.se-1]; qq.push(j); } i.k++;if(i.k+i.pos>n)continue; i.ans=(i.ans-a[i.zhp])%mod; auto tp=ask(rt[i.pos+1],i.k); i.ans=(i.ans+tp.fi)%mod;i.zhp=v[tp.fi][upper_bound(v[tp.fi].begin(), v[tp.fi].end(),i.pos)-v[tp.fi].begin()+tp.se-1]; q.push(i); } dfs(qq); } } signed main(){ // #ifndef ONLINE_JUDGE freopen("ttds.in","r",stdin); freopen("ttds.out","w",stdout); // #endif ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); n=read(),K=read(),b=read(); for(int i=1;i<=n;++i) a[i]=read(),v[a[i]].ps(i); for(int i=n;i;--i) rt[i]=rt[i+1],add(rt[i],1,1e5,a[i]); priority_queue<jj> q; auto tp=ask(rt[1],1); q.push({0,tp.fi,1,*lower_bound(v[tp.fi].begin(), v[tp.fi].end(),1)}); dfs(q); }
upd:感觉刚才好像是睡着了写的,还是把所有代码都沾上来吧
他们去 thu 了,真成留守儿童了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章