首页 > 其他分享 >冲刺国赛模拟 6

冲刺国赛模拟 6

时间:2023-05-22 14:11:06浏览次数:54  
标签:int double dp long 国赛 冲刺 ans include 模拟

长剖调不出来喜提垫底!

评价:同比赛编号。

牛子老师给出三道原题题号:qoj5418、5146、2303。

染色

简单长剖,为啥没有调出来呢?不懂。

首先按深度考虑,设 \(dp_{x,i}\) 为在 \(x\) 把子树深度 \(i\) 染完的最小代价,转移显然

\[dp_{x,i}=\min(\sum_{v}dp_{v,i-1},a_i) \]

这玩意和深度有关,那就长剖一下就行了。取 \(\min\) 是和连续的一段 \(a\) 取 \(\min\),打个左端点标记就好。

没调出来,好似。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cassert>
#define int long long
using namespace std;
int n,a[100010];
struct ST{
    int st[100010][21];
    void build(){
        for(int i=0;i<n;i++)st[i][0]=a[i];
        for(int j=1;j<=__lg(n);j++){
            for(int i=0;i+(1<<j)-1<n;i++){
                st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
            }
        }
    }
    int query(int l,int r){
        int k=__lg(r-l+1);
        return min(st[l][k],st[r-(1<<k)+1][k]);
    }
}st;
struct node{
    int v,next;
}edge[200010];
int t,head[100010];
void add(int u,int v){
    edge[++t].v=v;edge[t].next=head[u];head[u]=t;
}
int dep[100010],son[100010];
void dfs1(int x,int f){
    for(int i=head[x];i;i=edge[i].next){
        if(edge[i].v!=f){
            dfs1(edge[i].v,x);
            if(dep[son[x]]<dep[edge[i].v])son[x]=edge[i].v;
        }
    }
    dep[x]=dep[son[x]]+1;
}
int buf1[100010],*dp[100010],*now1=buf1;
int buf2[100010],*lz[100010],*now2=buf2;
void pushtag(int x,int i){
    if(lz[x][i]+1<=i)dp[x][i]=min(dp[x][i],st.query(lz[x][i]+1,i));
    else dp[x][i]=min(dp[x][i],a[i]);
    lz[x][i]=i;
}
void dfs2(int x,int f){
    dp[x][0]=a[0];
    if(son[x]){
        dp[son[x]]=dp[x]+1;lz[son[x]]=lz[x]+1;
        dfs2(son[x],x);
    }
    for(int i=head[x];i;i=edge[i].next){
        if(edge[i].v!=f&&edge[i].v!=son[x]){
            dp[edge[i].v]=now1;now1+=dep[edge[i].v];
            lz[edge[i].v]=now2;now2+=dep[edge[i].v];
            dfs2(edge[i].v,x);
            for(int j=0;j<dep[edge[i].v];j++){
                pushtag(edge[i].v,j);
                pushtag(x,j+1);
                dp[x][j+1]+=dp[edge[i].v][j];
                pushtag(x,j+1);
            }
        }
    }
}
signed main(){
    scanf("%lld",&n);
    for(int i=0;i<n;i++)scanf("%lld",&a[i]);
    st.build();
    for(int i=1;i<n;i++){
        int u,v;scanf("%lld%lld",&u,&v);
        add(u,v);add(v,u);
    }
    dfs1(1,0);
    dp[1]=now1;now1+=dep[1];lz[1]=now2;now2+=dep[1];
    dfs2(1,0);
    int ans=0;
    for(int i=0;i<dep[1];i++){
        pushtag(1,i);
        ans+=dp[1][i];
    }
    printf("%lld\n",ans);
    return 0;
}

技能

详见 顶级厨师

重排

简单题。他们说是讲题讲过的,我咋没印象。

首先 \(O(n^2)\) 不难,暴力维护所有位置的概率转移就好。然后这玩意和正解没任何关系。

正解考虑操作落在哪里。以下 \(x\) 为给的 \(i\)。两种情况:

  1. 所有操作位置 \(<x\):位置不变,概率 \(\left(\dfrac{x-1}n\right)^k\)。

  2. 有操作位置 \(\ge x\):枚举最大位置 \(i\),概率 \(\left(\dfrac in\right)^k-\left(\dfrac {i-1}n\right)^k\),期望由于 \(i\) 前边全部乱序就是 \(\dfrac{i+1}2\)。

那全加起来就完事。不取模大概是诈骗。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const double eps=0;
int n,x,k;
long double p[1000010],sum[1000010];
long double qpow(long double a,int b){
    long double ans=1;
    while(b){
        if(b&1)ans=ans*a;
        a=a*a;
        b>>=1;
    }
    return ans;
}
int main(){
    scanf("%d%d%d",&n,&x,&k);p[x]=1;
    long double ans=1.0*x*qpow(1.0*(x-1)/n,k);
    for(int i=x;i<=n;i++){
        ans+=1.0*(i+1)/2*(qpow(1.0*i/n,k)-qpow(1.0*(i-1)/n,k));
    }
    printf("%.6Lf\n",ans);
    return 0;
}

标签:int,double,dp,long,国赛,冲刺,ans,include,模拟
From: https://www.cnblogs.com/gtm1514/p/17420458.html

相关文章

  • 程序设计进阶模拟试题
    题目描述程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能是:使数组右上三角元素中的值乘以m。#include<stdio.h>#include<conio.h>#include<stdlib.h>#defineN5intfun(inta[][N],intm)/不得改动此注释文字及位置,begein/{}/不得改动此注释文字......
  • 2022.11.24 NOIP模拟赛
    A.不降序列题目描述lzx2005了解到有一种在\(O(n\logn)\)的时间复杂度内求出一个序列\(a\)的最长不下降子序列的方法如下:维护一个序列\(b\),初始时为空。依次考虑\(a_1,a_2,\ldots,a_n\),当考虑到\(a_i\)时,求出序列\(b\)中第一个比\(a_i\)大的元素,然后使用\(a_i......
  • 算法学习记录(模拟枚举贪心题单):[NOIP2007]字符串的展开(未AC,明天找bug)
    题目链接https://ac.nowcoder.com/acm/contest/20960/1001解题思路很简单的模拟题,以后写模拟要先分两大类,元素在某个集合中存不存在的问题,再细分。未AC代码#include<iostream>#include<string>usingnamespacestd;//碰到'-'的展开条件:// 1.减号两侧同为小写字母......
  • 最快Android模拟器Genymotion的安装
        在这开发Android的一段时间内,一直是使用真机进行测试的,使用过的机子包括华为U8825d,红米,MX3.深知Android的最大问题就是碎片化,就是各种适配问题,甚是头疼。也是一直听说Genymotion的快速与强大,也是亲眼见过别人使用Genymotion,完全把Android自带的AVD碾压的渣都不剩。所以......
  • 在tofino数据平面上实现表的模拟
    在tofino数据平面上实现表的模拟实验目的当需要在数据平面实现较为复杂的信息存储和更新时,经常产生在数据平面存放一张表的需求,例如对于多台感兴趣的交换机,希望记录并更新交换机的各项网络状态信息。从数据抽象上来说,以表的形式来记录是直观的,从使用速率来说,将信息存储在数据平......
  • 请在微信客户端打开链接:火狐浏览器模拟微信浏览器内核教程 ,用chrome模拟微信浏览器访
    背景:微信浏览器能访问,出现,请在微信客户端打开链接。useragentswitcherforfirefox:https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/FF越来越不行了,下载都下载不下来~useragentswitcher1.0.34中文版forchrome:http://www.pc6.com/soft/FireFox_133175.h......
  • PHP模拟登录并获取数据
    cURL是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信息。本文以模拟登录开源中国(oschina)为例,和大家分享cURL的使用。PHP的curl()在抓取网页的效率方面是比较......
  • 程序设计进阶模拟试题
    题目描述请编写函数tun。西数的功能是。统计各年龄段的人数。1个年秘通过调用淹机函数获得,并放在主面救的ke数组中,要求函数赶1至虫9乡年龄段的人敷放在d01户中,把0至9岁年龄段的人数放1d门1中,把2.至沙岁年龄段社人数放在d[2]中,其余依此类推,把100岁(含100)以上年龄的人数都放在d[10]......
  • 模拟运行600万年 数据0损坏!Solidigm把QLC闪存玩到了极致
    不可否认的是,SLC、MLC、TLC、QLC、PLC、HLC……闪存技术一路走下来,整体的可靠性、寿命指标是逐步走低的,这也是NAND闪存架构天然属性所决定的。当然,这不代表QLC、PLC闪存的就难堪大用,关键是看如何设计与优化,从闪存、硬盘的硬件优化,再到主控、算法、负载的软件优化,都至关重要,也直接......
  • R语言布朗运动模拟股市、物种进化树状图、二项分布可视化
    本文模拟了在连续和离散时间布朗演化一些简单的方法。布朗运动的数学模型(也称为随机游动)也可以用来描述许多现象以及微小颗粒的随机运动,如股市的波动和在化石中的物理特性的演变。布朗运动是随机模式,即改变了从一次到下一个是随机从正态分布绘制均值为0.0,方差为σ2×ΔT。换句话......