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();
    }
}
复制代码

 

posted @   liyishui  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示