gym 101137 L Lazy Coordinator(概率)

本文介绍了一种计算题库中题目期望时间的方法。通过分析两种操作——添加和移除题目,文章给出了一种从后向前计算每道题在题库中停留期望时间的算法。该算法使用动态规划思想,考虑了题目被抽取的概率变化。

题意:

对题库有两种操作,一种是在ti时刻加一道题,一种是在ti时刻减一道题拿来比赛,问每道题待在题库里的期望时间。


思路:

从后往前考虑,当前项i为减一道题时,之前的题在这一时刻被取出的概率是1/k,k表示之前还剩多少道题,而在这之后取出的概率就是1-1/k,用sum表示从n到i+1之间某一刻取出的期望时间,那么从n到i某一刻取出的期望时间就是sum*(1-1/k)+1/k*time[i]。


代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=1e5+5;
const int mod=1e9+7;
int a[maxn];
int d[maxn];
LL dp[maxn][32][3];
int sum[32];
LL cal(int n, int m)
{
    if(m==0)return 0;
    LL res=0;
    d[1]=a[1];
    memset(sum, 0, sizeof sum);
    memset(dp, 0, sizeof dp);
    for(int i=2; i<=n; i++)
    {
        int x=a[i]^a[i-1];
//        printf("%d\n", x);
        for(int j=0; j<=30; j++)
        {
            if((x>>j)&1)
            {
                dp[i][j][0]=dp[i-2][j][1];
                dp[i][j][1]=dp[i-2][j][0]+1;
            }
            else 
            {
                dp[i][j][0]=dp[i-2][j][0]+1;
                dp[i][j][1]=dp[i-2][j][1];
            }
//            printf("%d ", dp[i][j][1]);
        }
//        printf("\n");
        d[i]=d[i-1]^a[i];
        if(i>=m+2)
        {
            int x=d[i]^d[i-m-2];
            for(int j=0; j<=30; j++)
            {
                if((x>>j)&1)
                {
                    dp[i][j][1]--;
                }
                else dp[i][j][0]--;
            }
        }
        for(int j=0; j<=30; j++)sum[j]+=dp[i][j][1];
    }
    for(int j=0;j<=30; j++)
    {
//        printf("%d ", sum[j]);
        res=(res+(((1LL<<j)*sum[j])%mod))%mod;
    }
//    printf("\n");
//    printf("%d %lld\n", m, res);
    return res%mod;
}
int main()
{
    int n, l, r, i, j;
    cin>>n>>l>>r;
    for(i=1; i<=n; i++)
    {
        scanf("%d", &a[i]);
    }
    LL ans=cal(n, r/2*2)-cal(n, (l-1)/2*2); 
    ans=(ans%mod+mod)%mod;
    cout<<ans<<endl;
}


在编程竞赛和算法训练中,Codeforces Gym 提供了大量高质量的训练题目,这些题目通常用于团队训练或个人提升。Gym 103861L 是其中一道编号问题,尽管目前无法直接访问该题目的完整内容,但可以通过编号规则和 Gym 题目的一般特征进行推测与分析。 通常,Gym 编号如 "Gym 103861L" 中的前六位数字代表比赛或训练集的编号,而最后的字母 "L" 表示题目的顺序。这类题目可能涉及动态规划、图论、字符串处理或数学计算等算法领域。 对于类似编号问题的解决方案,通常需要以下几个步骤: - **理解问题描述**:仔细阅读题目要求,明确输入输出格式,以及约束条件。 - **分析问题模型**:将问题抽象为数学模型或算法模型,例如最短路径、背包问题、区间调度等。 - **设计算法**:根据模型选择合适的算法,例如贪心、深度优先搜索(DFS)、广度优先搜索(BFS)、动态规划(DP)等。 - **实现代码**:编写高效且正确的代码,并注意边界条件和数据类型的选择。 - **调试与优化**:通过测试样例验证程序的正确性,并进行必要的性能优化。 以引用中的 Gym 100090L 问题为例,其涉及前缀和数组的还原问题,解决思路是通过差分数组的方法,将前缀和数组转换回原始数组。具体实现如下: ```cpp #include <cstdio> #include <iostream> using namespace std; typedef long long ll; int main() { int n; ll sum[200005]; while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) scanf("%lld", &sum[i]); sum[0] = 0; for (int i = 1; i <= n; i++) { printf("%lld%c", sum[i] - sum[i - 1], i == n ? '\n' : ' '); } } return 0; } ``` 对于 Gym 103861L 的问题,如果已知其具体内容,可以采用类似的方式进行建模与实现。建议访问 [Codeforces Gym 页面](https://codeforces.com/gym) 并搜索 "103861" 查找该比赛的具体信息,从而获取完整的题目描述和测试用例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值