codeforces#8807 div2 C. Mark and His Unfinished Essay 放心暴力
就是说字符串每次会选取一个区间[L,R],然后把这段截取出来放到后面
给出q个询问,问结束所有操作后第k个字母是多少
注意到操作次数很小,C<=40,所以大概思路就是每次找到当前字母是从哪里转移来的就好
比如问第15个字母多少,存在某次操作后长度为17,前一次操作完长度是13,区间是7-10
那么这个字符肯定是前一次的第8个
以此类推.....
(实现起来自己写了一个大bug,wa了n发,还被学长严肃批评了qaq
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct lys{ ll l,r,len; }f[1000]; string s; void solve(){ ll n,c,q; cin>>n>>c>>q; cin>>s; f[0].len=n; for(ll i=1;i<=c;i++){ cin>>f[i].l>>f[i].r; f[i].len=f[i-1].len+(f[i].r-f[i].l+1); } for(ll i=1;i<=q;i++){ ll id; cin>>id; ll l=0,r=c,ans=0; while(l<=r) { ll mid=(l+r)/2; if(f[mid].len>=id) { ans=mid;r=mid-1; } else l=mid+1; } while(ans>0&&id>f[0].len) { l=0,r=c; while(l<=r) { ll mid=(l+r)/2; if(f[mid].len>=id) { ans=mid;r=mid-1; } else l=mid+1; } id=id-f[ans-1].len+f[ans].l-1; } cout<<s[id-1]<<endl; } } int main() { //freopen("lys.in","r",stdin); int t; cin>>t; while(t--){ solve(); } }
分类:
思维题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)