首页 > 其他分享 >2024.10.08

2024.10.08

时间:2024-10-14 08:53:46浏览次数:7  
标签:2024.10 return int ll mid maxn sum 08

2024.10.08

P3251 JLOI2012 时间流逝

设 \(f(S)\) 为可重复集 \(S\) 进化的期望天数。

\[f(S)=pf(P)+\frac{1-p}{m}\sum_{i=1}^mf(T)+1 \]

\(P\) 为 \(S\) 除去最小值的集合,\(T\) 为 \(S\) 加上一个元素的集合。

不难发现,集合构成了一颗树的形态,根是空集,\(S\) 父亲为 \(P\),\(T\) 父亲为 \(S\)。

假设所有 \(f(S)\) 满足 \(f(S)=kf(P)+b\)。

数学归纳法,叶子节点显然满足,对于非叶子节点:

\[f(S)=pf(P)+\frac{1-p}{m}\sum_{i=1}^mk_if(S)+b_i \]

记:

\[t=\frac{1-p}{m},K=\sum_{i=1}^mk_i,B=\sum_{i=1}^mb_i \]

有:

\[f(S)=\frac{p}{1-tK}f(P)+\frac{1+tB}{1-tK} \]

#include<bits/stdc++.h>
using namespace std;

#define db double
#define pdd pair<double,double>
#define fi first
#define se second

const int maxn=55;

int n,T;
double p;

int a[maxn];

inline pdd dfs(int s,int mn)
{
    if(s>T) return {0,0};
    db k=0,b=0,t=(1-p)/mn;
    pdd ret;
    for(int i=1;i<=mn;i++) ret=dfs(s+a[i],i),k+=ret.fi,b+=ret.se;
    if(!s) t=1.0/mn;
    return {p/(1-t*k),(1+t*b)/(1-t*k)};
}

int main()
{
    while(~scanf("%lf%d%d",&p,&T,&n))
    {
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        printf("%.3lf",dfs(0,n).se);
    }
}

P5303 GXOI/GZOI2019 逼死强迫症

不难发现,如果确定为 \(1\times 1\) 的块放的区域的长度,仅有唯二的方案。

设 \(g_i\) 为 \(1\times 1\) 放置区域的长度为 \(i\) 的方案数,有:

\[g_i=g_{i-1}+g_{i-2} \]

是斐波那契数列。

对于答案 \(F_i\),类似的推出 \(F_i=F_{i-1}+F_{i-2}+2\times g_{i-1}-2\)。

使用矩阵加速,即可 AC。

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const ll mod=1e9+7;
const int maxn=8;

struct Matrix
{
    int n,m;
    int a[maxn][maxn];
    Matrix(int x=0,int y=0)
    {
        memset(a,0,sizeof(a));
        n=x,m=y;
    }
    inline void SetUnit()
    {
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=(i==j);
    }
    friend inline Matrix operator * (Matrix a,Matrix b)
    {
        Matrix ret(a.n,b.m);
        for(int i=1;i<=ret.n;i++)
            for(int k=1;k<=a.m;k++)
                for(int j=1;j<=ret.m;j++)
                {
                    ret.a[i][j]=(ret.a[i][j]+1ll*a.a[i][k]*b.a[k][j]%mod)%mod;
                }
        return ret;
    }
}s;
inline Matrix ksm(Matrix x,int y)
{
    Matrix sum(5,5);sum.SetUnit();
    for(;y;y/=2,x=x*x) if(y&1) sum=sum*x;
    return sum;
}

int main()
{
    s.n=5,s.m=5;
    s.a[1][1]=s.a[1][2]=s.a[2][1]=s.a[3][3]=s.a[3][4]=s.a[4][3]=s.a[5][5]=1;
    s.a[3][1]=2,s.a[5][1]=mod-2;
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n;
        scanf("%d",&n);
        if(n<3){puts("0");continue;}
        Matrix A(1,5);
        A.a[1][3]=2,A.a[1][4]=A.a[1][5]=1;
        printf("%d\n",(A*ksm(s,n-2)).a[1][1]);
    }
}

P4229 某位歌姬的故事

见博客

P4647 IOI2007 sails 船帆

每次选择 \(k\) 个最少放置船帆的位置放帆,将 \(h\) 升序排序,船帆放置数量随高度至下向上数量递减,每次选择 \([h-k+1,h]\) 之间的位置放置,但对于与放置数量 \(h-k+1\) 高度相同的高度,需要将选择平移维护单调性。

#include<bits/stdc++.h>
using namespace std;

const int maxn=100005;

int n,ans;
struct node{int h,k;}a[maxn];

inline bool cmp(node a,node b){return a.h<b.h;}

namespace linetree
{
    #define lch(p) p*2
    #define rch(p) p*2+1
    struct treenode{int mx,mi,lazy;}tr[maxn*8];
    int lx,rx;
    inline void clr(){lx=maxn,rx=0;}
    inline void push_down(int p,int l,int r)
    {
        if(l==r) {tr[p].lazy=0;return ;}
        tr[rch(p)].lazy+=tr[p].lazy;tr[rch(p)].mi+=tr[p].lazy,tr[rch(p)].mx+=tr[p].lazy;
        tr[lch(p)].lazy+=tr[p].lazy;tr[lch(p)].mi+=tr[p].lazy,tr[lch(p)].mx+=tr[p].lazy;
        tr[p].lazy=0;
    }
    inline void push_up(int p,int l,int r)
    {
        if(l==r) return ;
        tr[p].mi=min(tr[lch(p)].mi,tr[rch(p)].mi);
        tr[p].mx=max(tr[lch(p)].mx,tr[rch(p)].mx);
    }
    inline void updata(int p,int l,int r,int lx,int rx,int val)
    {
        if(rx<lx) return ;
        if(r<lx||l>rx) return ;
        push_down(p,l,r);
        if(lx<=l&&r<=rx)
        {
            tr[p].lazy+=val;
            tr[p].mi+=val,tr[p].mx+=val;
            return ;
        }
        int mid=(l+r)>>1;
        updata(lch(p),l,mid,lx,rx,val);
        updata(rch(p),mid+1,r,lx,rx,val);
        push_up(p,l,r);
    }
    inline int qry1(int p,int l,int r,int x)
    {
        push_down(p,l,r);
        if(r<x||l>x) return 0;
        if(l==r) return tr[p].mi;
        int mid=(l+r)>>1;
        return qry1(lch(p),l,mid,x)+qry1(rch(p),mid+1,r,x);
    }
    inline void qry2(int p,int l,int r,int x)
    {
        push_down(p,l,r);
        if(tr[p].mx<x||tr[p].mi>x) return ;
        if(tr[p].mi==x) rx=max(rx,r);
        if(tr[p].mx==x) lx=min(lx,l);
        if(tr[p].mx==x&&tr[p].mi==x) return ;
        int mid=(l+r)>>1;
        qry2(lch(p),l,mid,x),qry2(rch(p),mid+1,r,x);
    }
}

int main()
{
    int m=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&a[i].h,&a[i].k),m=max(a[i].h,m);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        int p=linetree::qry1(1,1,m,a[i].h-a[i].k+1);linetree::clr();linetree::qry2(1,1,m,p);
        int l=max(linetree::lx,1),r=min(linetree::rx,a[i].h);
        linetree::updata(1,1,m,r+1,a[i].h,1);linetree::updata(1,1,m,l,l+a[i].k-(a[i].h-r)-1,1);
    }
    long long ans=0;
    for(int i=1;i<=m;i++)
    {
        int p=linetree::qry1(1,1,m,i);
        ans+=1ll*p*(p-1)/2;
    }
    printf("%lld",ans);
}

P8321 『JROI-4』沈阳大街 2

将 \(a,b\) 合并为一个数组 \(c\) 后排序,然后将其中的 \(a,b\) 两两配对,记权值为较后点的权值。

设 \(f[i][j]\) 表示前 \(i\) 个配对了 \(j\) 对的总贡献,有转移:

\[f[i][j]=f[i-1][j-1]\times c[i]\times(tmp-(j-1))+f[i-1][j] \]

其中 \(tmp\) 表示 \(c[1\sim i-1]\) 中与 \(i\) 颜色不同的数的个数。

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define mod 998244353

const int maxn=5005;

struct node{int val,sub;}a[maxn*2];

int n;
int cnt[2][maxn*2];

ll f[maxn*2][maxn];

inline ll ksm(ll x,ll y)
{
    ll sum=1;
    for(;y;y/=2,x=x*x%mod) if(y&1) sum=sum*x%mod;
    return sum;
}
inline bool cmp(node a,node b){return a.val>b.val;}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i].val),a[i].sub=0;
    for(int i=n+1;i<=2*n;i++) scanf("%d",&a[i].val),a[i].sub=1;
    sort(a+1,a+n*2+1,cmp);
    for(int i=1;i<=n*2;i++)
    {
        cnt[0][i]=cnt[0][i-1],cnt[1][i]=cnt[1][i-1];
        cnt[a[i].sub][i]++;
    }
    f[0][0]=1;
    for(int i=1;i<=n*2;i++)
    {
        ll tmp=cnt[!a[i].sub][i];
        f[i][0]=1;
        for(int j=1;j<=n;j++)
        {
            if(j<=tmp)
                f[i][j]=(f[i-1][j-1]*a[i].val%mod*(tmp-(j-1))%mod)%mod;
            f[i][j]=(f[i][j]+f[i-1][j])%mod;
        }
    }
    ll res=1;
    for(int i=1;i<=n;i++) res=res*i%mod;
    printf("%lld",ksm(res,mod-2)*f[n*2][n]%mod);
}

标签:2024.10,return,int,ll,mid,maxn,sum,08
From: https://www.cnblogs.com/binbin200811/p/18463370

相关文章

  • 2024.10.13 速度奇慢
    我就知道不能睡觉,以后要求自己,天天趴着入睡,那可是完全不能入睡的节奏。几乎只有浅睡眠。 这就是我对自己的要求,天天坐着睡觉,我觉得对健康很不利,但是,你醒着不能干活,那再不健康也得执行。 要求自己必须每天早上6点,无论缘由。 最后,我说一下相关性要不要考虑。类似于【近朱......
  • 2024.10.11 LGJ Round
    C有\(N\)人站在一条数轴上。他们人手一个烟花,每人手中的烟花都恰好能燃烧\(T\)秒。每个烟花只能被点燃一次。开始时,只有\(K\)号的烟花开始燃烧,当两人位置重叠且其中一人手中的烟花燃着时,另一人手中的烟花就可以被点燃。求至少需要以多快的速度跑,才能使所有人的烟花都曾被点......
  • 2024.10.12 test
    A一棵二叉树,相同深度的点位置相邻的有一条边,给出两条根开始的路径,可以向上/左/右/左儿子/右儿子走,问最后走到的两个点最短距离。路径长度\(\le10^5\)。考虑求出两条路径分别走到的位置,用根开始的路径表示,每次向左/向右,用\(0/1\)表示。最后统计答案,两个点一定是走到某个深度......
  • 2024.10.13 2010版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024-2025 20241308《计算机基础与程序设计》第三周学习总结
    这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))这个作业的目标1、数字分类与计数法位置计数法,2、进制转......
  • Error: error:0308010C:digital envelope routines::unsupported
    原因:运行Node.js应用程序时遇到了一个与加密算法相关的错误。具体来说,error:0308010C:digitalenveloperoutines::unsupported错误通常是因为Node.js尝试使用了一个不受支持的加密算法或选项,尤其是在使用某些依赖于OpenSSL的库时。主要是因为nodeJsV17版本发布了OpenSSL3.0......
  • 2024.10.13 1332版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 008. vue组件的嵌套
    页面层级#1.main.ts引入App.文件import{createApp}from'vue'import'./style.css'importAppfrom'./简答组件的使用/App.vue'createApp(App).mount('#app')#2.定义Footer.vue<scriptsetuplang="ts"></......
  • CF908D-New Year and Arbitrary Arrangement
    CF908D-NewYearandArbitraryArrangement前言不是这题为啥星\(2200\)啊,感觉做的很多\(3000\)左右的题都比这道题水吧。简化题意给定空字符串,每次在串尾加入\(a\)或\(b\),各有一定概率。若其中有\(\gek\)个\(ab\)子序列,则停止加入。问至加入结束时,含有\(a......
  • 2024.10.12
    根据你提供的MyBatis配置文件,确实有一个小问题需要注意:驼峰命名配置你已将mapUnderscoreToCamelCase设置为注释(<!--<settingname="mapUnderscoreToCamelCase"value="true"/>-->),这意味着驼峰命名转换功能被禁用了。为了启用它,你需要取消注释并确保该设置的值为true。修......