2019.9.27 csp-s模拟测试53 反思总结

2023-11-17

这个起名方式居然还有后续?!

为什么起名不是连续的?!

 

T1想了半天,搞出来了,结果数组开小【其实是没注意范围】。T2概率期望直接跳,后来翻回来写发现自己整个理解错了期望的含义【何】。T3错误想到赛道修建结果来了个错误贪心。

关于T2破罐子破摔输出k居然骗了二十分这件事……

 

T1u:

一开始各种想偏,维护哪种值是奇数或偶数个,考虑每次操作影响哪些值变化…这些全都跑出来了。

大概过了一个世纪那么长,突然想着能不能直接优化操作的过程啊,然后对暴力进行钻研,终于开始想到差分。

然后觉着nq的复杂度过不去,开始对差分进行瞎搞。终于又过了一个世纪那么久,发现差分数组也是可以传递转移的……

两个世纪过去了,没有然后了。

#include<iostream>
#include<cstdio>
using namespace std;
int n,q;
long long ans,f[2010][2010],H[2010][2010],L[2010][2010],sum;
int main()
{
    scanf("%d%d",&n,&q);
    if(!q){
        printf("0\n");
        return 0;
    }
    else if(n<=300){
        for(int i=1,r,c,l,s;i<=q;i++){
            scanf("%d%d%d%d",&r,&c,&l,&s);
            for(int j=r;j<r+l;j++){
                for(int k=c;k<=j-r+c;k++){
                    f[j][k]+=s;
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                ans^=f[i][j];
            }
        }
        printf("%lld\n",ans);
        return 0;
    }
    else if(q<=2000){
        for(int i=1,r,c,l,s;i<=q;i++){
            scanf("%d%d%d%d",&r,&c,&l,&s);
            for(int j=r;j<r+l;j++){
                H[j][c]+=s;
                H[j][j-r+c+1]-=s;
            }
        }
        for(int i=1;i<=n;i++){
            sum=0;
            for(int j=1;j<=n;j++){
                sum+=H[i][j];
                ans^=sum; 
            }
        }
        printf("%lld\n",ans);
        return 0;
    }
    else{
        for(int i=1,r,c,l,s;i<=q;i++){
            scanf("%d%d%d%d",&r,&c,&l,&s);
            H[r][c]+=s;
            L[r][c+1]-=s;
            H[r+l][c]-=s;
            L[r+l][c+l+1]+=s;
        }
        for(int i=1;i<=n;i++){
            sum=0;
            for(int j=1;j<=n;j++){
                H[i][j]+=H[i-1][j];
                L[i][j]+=L[i-1][j-1]; 
                sum+=H[i][j]+L[i][j];
                ans^=sum; 
            }
        }
        printf("%lld\n",ans);
        return 0;
    }
}
View Code

 

 

T2v:

整个儿弄错了期望这东西,一言难尽。

题目中的最优策略,指的是在以某一概率选到某一个位置的时候,选择拿前面的球或者拿后面的球的其中一种决策产生的贡献,累计上这个球是不是白球的贡献,取最大值。

所以dfs,枚举选到的是哪个位置,累积贡献,除以可选到多少种位置,就是这一状态的期望。

因为搜索到的状态会有很多重复,考虑记忆化搜索。但是表示某一状态的数字可能很大,数组下标无法表述。那么对于数组表示得出来的,就用数组存。其它更大的用map映射解决。

不同长度的状态可能存在数值上相同的情况,例如010和0010。解决方法是在这一长度的再靠前一位打上一个1的标记,例如010->1010,0010->10010,这样表示不同的状态。

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int n,k;
char s[31];
long long fir;
double ans,num[(1<<25)];
map<long long,double>m;
double dfs(long long x,int k,int lon){
    if(!k)return 0;
    if(lon<=25&&num[x]!=-1.0)return num[x];
    else if(m.find(x)!=m.end())return m[x];
    double f=0,f1=0,val1,val2;
    long long x1,x2;
    for(int i=1;i<=lon/2;i++){
        val1=(x>>(lon-i-1))&1,val2=(x>>(i-1))&1;
        f1=0;
        x1=(x>>1)&(~((1<<(lon-i-1))-1))|(x&((1<<(lon-i-1))-1));
        x2=(x>>1)&(~((1<<(i-1))-1))|(x&((1<<(i-1))-1));
        f1=dfs(x1,k-1,lon-1)+val1;
        f1=max(f1,dfs(x2,k-1,lon-1)+val2);
        f+=f1*(i==lon-i?1.0:2.0);
    }
    f/=(double)(lon-1);
    if(lon<=25)num[x]=f;
    else m[x]=f;
    return f;
}
int main(){
    scanf("%d%d",&n,&k);
    scanf("%s",s+1);
    for(int i=0;i<=(1<<25);i++)num[i]=-1.0;
    fir=1;
    for(int i=1;i<=n;i++){
        fir=(fir<<1)+(s[i]=='W');
    }
    ans=dfs(fir,k,n+1);
    printf("%.10lf",ans);
    return 0;
}
View Code

 

 

T3w:

错误贪心:强行认为每个节点由子节点传上来的路径若有偶数条就自行解决是最优的,奇数条就看当前节点连出去的边目标是不是2,然后无脑传上去。

错误性显而易见……有可能强行传上去的这条会打乱父节点本来可以完整自行配对的组合,给父节点增加一条路径,然后不得不再次穿上去,又增加了长度……还不如在当前节点自行了断。

正解是树形DP。发现最后的总路径数是整棵树路径中的奇度数点数/2。对于每个点,记录它传一条边上去或者不传的时候dp[x][1],dp[x][0],包含子树的最少奇度数点数以及在此基础上的最小总路径长。

一棵一棵子树进行转移。设两个用来统计子树们的最优答案的二元组w1,w2。w1的含义是子树们传了一条边上来,w2是不传让它们两两解决。对于每棵子树y,w1=min(w2+dp[y][1],w1+dp[y][0]),w2=min(w1+dp[y][1],w2+dp[y][0])。比较大小的时候都优先比较奇度数点数c1,再比较路径长度c2。

然后根据当前节点上面这条边的状态和目标状态计算dpx。显然一条边如果已经是目标状态,那么始终不走一定是更优的。如果这条边已经是目标状态,让dp[x][1]=inf。使w1的c1++,w2不变,表示若有边传上来就多一个奇度数点作为收尾,或者没有边传上来就不变,然后dp[x][0]在w1和w2中选择更优的。如果这条边不是目标状态,就让dp[x][0]=inf。w1.c2++。w2.c1++,w2.c2++,表示这个节点作为一个新的开头使奇度数节点增加。依然让dp[x][1]在w1和w2中选择更优的。如果这条边的目标状态是2,就两种情况非inf的部分都做一遍。

#include<iostream>
#include<cstdio>
using namespace std;
const int inf=214748364;
int f[100010][2],opt[100010],goal[100010];
struct node{
    int c1,c2;
}dp[100010][2],tool;
int n,tot,ver[200010],head[100010],edge[200010],edge1[200010],Next[200010];
void add(int x,int y,int z,int w){
    ver[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
    edge[tot]=z;
    edge1[tot]=w;
}
node work(node a,node b,node c,node d){
    node e;
    if(a.c1+b.c1<c.c1+d.c1){
        e.c1=a.c1+b.c1;
        e.c2=a.c2+b.c2;
    }
    else if(a.c1+b.c1==c.c1+d.c1){
        if(a.c2+b.c2<c.c2+d.c2){
            e.c1=a.c1+b.c1;
            e.c2=a.c2+b.c2;
        }
        else{
            e.c1=c.c1+d.c1;
            e.c2=c.c2+d.c2;
        }
    }
    else{
        e.c1=c.c1+d.c1;
        e.c2=c.c2+d.c2;
    }
    return e;
}
void dfs(int x,int fa){
    node w1,w2;
    w1.c1=w1.c2=inf;
    w2.c1=w2.c2=0;
    for(int i=head[x];i;i=Next[i]){
        int y=ver[i];
        if(y==fa)continue;
        opt[y]=edge[i];
        goal[y]=edge1[i];
        dfs(y,x);
        node w11=w1;
        w1=work(dp[y][0],w1,dp[y][1],w2);
        w2=work(dp[y][1],w11,dp[y][0],w2);
    }
    if(goal[x]==2){
        w2.c1++;
        w1.c2++;
        w2.c2++;
        dp[x][1]=work(w1,tool,w2,tool);
        w2.c1--;
        w1.c2--;
        w2.c2--;
        w1.c1++;
        dp[x][0]=work(w1,tool,w2,tool);
    }
    else{
        if(opt[x]!=goal[x]){
            dp[x][0].c1=inf,dp[x][0].c2=inf;
            w2.c1++;
            w1.c2++;
            w2.c2++;
            dp[x][1]=work(w1,tool,w2,tool);
        }
        else{
            dp[x][1].c1=inf,dp[x][1].c2=inf;
            w1.c1++;
            dp[x][0]=work(w1,tool,w2,tool);
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1,x,y,z,w;i<n;i++){
        scanf("%d%d%d%d",&x,&y,&z,&w);
        add(x,y,z,w),add(y,x,z,w);
    } 
    dfs(1,0);
    printf("%d %d\n",dp[1][0].c1/2,dp[1][0].c2);
    return 0;
}
View Code

 

 

结果拖到这会儿才写完。

祝祖国母亲生日快乐。

转载于:https://www.cnblogs.com/chloris/p/11614594.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2019.9.27 csp-s模拟测试53 反思总结 的相关文章

  • Codeforces Round 896 (Div. 2) A~D

    A Make It Zero 思路 长度为偶数 从1到n操作两次 长度为奇数 先从1到n操作一次 然后从1到n 1做两次 最后n 1到n做一次 AC代码 include
  • 弱监督目标检测之二 连续优化多实例学习

    上一次的博客提到了我们实验室发表在CVPR2018以及IEEE TPAMI上的工作MELM 1 这一次的博客进一步介绍基于MELM的最新的工作C MIL 也是实验室今年被CVPR2019接收的4篇论文之一 C MIL Continuatio
  • 读书笔记---《如何高效学习》

    学习是需要方法的 特别是在当今信息爆炸的时代 如何高效的处理信息 有机的整合知识 已经成为学习的关键 如果只用一种方式了解某样事物 你就不会真正了解她 了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系 通过联系 你可将想法内化于
  • 用python做爬虫,怎么入门学什么?

    用python做爬虫 怎么入门学什么 前些日子 写了一篇Python能做什么 当然高端的算法ai领域应用非常广泛 但是对于想学习Python实现找工作或者自己网上接单兼职的小伙伴来说 还是做好爬虫更适合 那么爬虫究竟是什么呢 爬虫可以理解为
  • 【图像识别】图像特征、特征检测、特征提取

    目录 1 图像特征 2 特征检测与特征提取 2 1 特征检测算法 2 2 1Moravec 2 1 2 Harris 2 1 3 FAST 2 1 4 SIFT 2 1 5 SURF 2 1 6 BRIRF 2 1 7 ORB 2 2 特征
  • [Qt] [QDir] 创建文件夹和删除文件夹

    1 创建文件夹 mkdir和mkpath都可以创建文件夹 QDir temp bool result 创建名为test的文件夹 mkdir 若csdn文件夹不存在 则test文件夹创建失败 result temp mkdir d csdn
  • 回溯--深度优先搜索(图的M着色问题 poj1129)

    回溯 图的m着色问题 题目描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中相邻的两个顶点有不同的颜色 这个问题是图的m可着色判定问题 若一个图最少需要m种颜色才能使图
  • 使用QGraphicsItem绘制微信消息文本框

    微信消息框如下 使用QGraphicsItem绘制 怎么绘制呢 先不考虑头像 那文本框就是由一个菱形矩形加一个小箭头组成的 所以很简单就能画出来了 void PopoItem paint QPainter painter const QSt
  • 彻底解决Python(win)导包from import错误问题

    1 一句话 一句话 关键是os sys path这个目录 这个目录有 就from import没问题 没有 就报错 解决办法就是千方百计加进去即可 例如 import os print os sys path import dd from
  • 单链表中求倒数第几个节点

    问题描述 在单链表中求出倒数第K个节点 要求快速 方法一 利用链表的长度 不推荐 此方法必须事先知道链表的长度 在有长度的信息链表中 此方法可行 比如我之前的链表是这样的实现 参考博文 http blog csdn net dawn aft
  • 机器学习之梯度提升决策树(GBDT)

    1 GBDT算法简介 GBDT Gradient Boosting Decision Tree 是一种迭代的决策树算法 由多棵决策树组成 所有树的结论累加起来作为最终答案 我们根据其名字 Gradient Boosting Decision
  • SpringAOP来监控service层中每个方法的执行时间

    使用AOP来说 太方便了 并且特别适合这类场景 代码如下 这里是将要统计的信息写到log文件中 也可以设计成写入表中 package com ecsoft interceptor import org aspectj lang Procee
  • linux版本的发行版和内核版是什么意思

    linux内核版本的分类 Linux内核版本有两种 稳定版和开发版 Linux内核版本号由3组数字组成 第一个组数字 第二组数字 第三组数字 第一个组数字 目前发布的内核主版本 第二个组数字 偶数表示稳定版本 奇数表示开发中版本 第三个组数
  • Linux扫盲篇:CentOS、Ubuntu、Gentoo

    http www williamlong info info archives 197 html Linux最早由Linus Benedict Torvalds在1991年开始编写 在这之前 Richard Stallman创建了Free
  • DirectX在VS2017环境配置

    提示 此方法是解决DirectX9在windows环境下的配置问题 原文 https xygeng cn post 249 html 具体方法 1 问题 无法打开包括文件 stdlib h 解决办法 视图 gt 属性管理器 点击 user属
  • VMware Workstation 16 安装教程

    哈喽 大家好 今天一起学习的是VMware Workstation 16的安装 vm虚拟机是小编非常喜欢的生产力软件 小编之前发布的测试教程钧在vm上进行的实验 VMware Workstation是一款功能强大的桌面虚拟计算机软件 它能够
  • K8s微服务从0到1入门及命令实战

    写在前面 本文主要介绍k8s的核心概念 基础语法 常用命令和常用操作 Kubernetes介绍 Kubernetes是一种流行的开源容器编排和管理系统 它的目标是简化部署 扩展和管理容器化应用程序 Kubernetes最初由Google开发
  • 如何让女人满意?多个心眼爱女人

    别以为只有男人甜言蜜语地哄骗女人 女人有时也会设下甜蜜的陷阱让男人钻 如果有一天 你那个素来刁蛮的小女人突然变得乖巧柔顺 温温柔柔地抱着你的胳膊说 亲爱的 我今天心情特别好 给你一分钟的时间诉诉苦苦吧 平时我有哪些缺点令你敢怒不敢言的 尽管
  • python学习笔记第一天

    一 Python的基本语法元素 Python程序从默认的第一条语句开始 按顺序依次执行各条语句 代码块可视为复合语句 Python使用严格的缩进 空格 来表示代码块 连续的多条具有相同缩进量的语句为一个代码块 注释用于为程序添加说明性的文字
  • Deep learning Reading List

    Following is a growing list of some of the materials i found on the web for Deep Learning beginners Free Online Books De

随机推荐

  • 简单HTML+css太极图

  • Tauri 应用中发送 http 请求

    最近基于 Tauri 和 React 开发一个用于 http https 接口测试的工具 Get Tools 其中使用了 tauri 提供的 fetch API 在开发调试过程中遇到了一些权限和参数问题 在此记录下来 权限配置 在 taur
  • vue中的input输入框按回车键自动搜索

    vue中的input输入框按回车键自动搜索 在input标签内部增加 keyup enter事件即可 事件名为按钮点击名称
  • python之文件夹拷贝(亲测可用)

    效果 import os import shutil def copy dir src path dst path source path os path abspath src path target path os path abspa
  • centos7 mysql 机器重启后pid文件丢失导致mysql 服务无法重启

    1 首先执行命令vim etc my cnf 查看pid存储的路径 pid file xxxxxx 2 到对应的路径下查看发现已经丢失了 mysqld pid创建在系统的run目录下 该目录是运行在内存中的 因此服务器重启后文件不存在 3
  • CentOS 7 下 minikube 部署 && 配置

    CentOS 7 下 minikube 部署 配置 文章目录 CentOS 7 下 minikube 部署 配置 下载 安装 下载安装脚本 安装 minikube 启动 minikube 环境 安装 kubectl 工具 启动 miniku
  • 在Caffe中调用TensorRT提供的MNIST model

    在TensorRT 2 1 2中提供了MNIST的model 这里拿来用Caffe的代码调用实现 原始的mnist mean binaryproto文件调整为了纯二进制文件mnist tensorrt mean binary 测试结果与使用
  • 【Git】git push origin master时发生的各类错误汇总

    文章目录 一 常见的git命令 二 错误一 三 错误二 四 错误三 五 问题解决 一 常见的git命令 使用 git 命令时 您可以执行一系列操作来管理代码仓库 下面是一些常用的 git 命令及其功能 git init 在当前目录初始化一个
  • 【计算机网络】网络层:网际控制报文协议ICMP

    ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告 不是高层协议 是IP层的协议 分为差错报告报文和查询报文两类 ICMP报文作为IP层数据报的数据 加上数据报的首部 组成IP数据报发送出去 ICMP报文直接封装在以太帧 数据链路
  • apache commons-io read-file

    文章目录 依赖
  • asp.net google地图+百度地图绘制行政区域图

    直接贴代码
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法

    简介 相信阿里云服务器ECS已被广大的企业和个人站长所使用 但对于之前没有使用过阿里云服务器的新手小白来说 无疑是一头雾水 今天呢 服务器吧小编就给刚接触阿里云ECS的新手小白带来快速入门阿里云服务器的方法 相信阿里云服务器ECS已被广大的
  • MySQL8新增管理端口

    简介 用过MySQL数据库朋友一定对 ERROR 1040 HY000 Too many connections 这个报错不陌生 出现这个报错的原因有两种情况 一种是单个用户的连接数超过 max user connections 参数定义值
  • 【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

    文章目录 总结 01 递归删除结点 02 删除结点 03 反向输出 04 删除最小值 05 逆置 06 链表递增排序 07 删除区间值 08 找公共结点 09 增序输出链表 10 拆分链表 尾插 11 拆分链表 头插 12 删除相同元素 1
  • Python 生成随机的六位数

    首先给出代码 然后再分析代码中函数的意思 1 生成随机的六位数 import random str for i in range 6 ch chr random randrange ord 0 ord 9 1 str ch print st
  • 深度包检测(DPI)的记录

    20210301 0 引言 大概一年半之前 让学生整理过关于DPI的内容 当时让他部署过nDPI的DPDK版本 当时给我的DPI的材料也没仔细看 这里直接贴到这里来 材料中的内容应该也是从别的地方复制粘贴的 基本上就是一些显而易见的材料 1
  • LLVM编译

    欢迎到我的博客来阅读这篇文章 https qiu weidong github io 2022 05 01 llvm build Windows下编译LLVM 安装Visual Studio 首先需要下载Visual Studio Inst
  • JAVA与C++的区别详解

    转自 微点阅读 https www weidianyuedu com JAVA和C 都是面向对象语言 也就是说 它都能够实现面向对象思想 封装 继乘 多态 而由于c 为了照顾大量的C语言使用者 而兼容了C 使得自身仅仅成为了带类的C语言 多
  • 火山翻译亮相飞书未来无限大会,打造全新翻译体验

    5月19日下午 2021春季飞书未来无限大会在北京召开 火山翻译携带火山同传 VolctransGlass AR智能翻译眼镜现身大会展厅 让观众了解前沿翻译技术和方案 并体验机器翻译如何在日常生活 工作和重要会议上帮助人们实现无障碍交流 本
  • 2019.9.27 csp-s模拟测试53 反思总结

    这个起名方式居然还有后续 为什么起名不是连续的 T1想了半天 搞出来了 结果数组开小 其实是没注意范围 T2概率期望直接跳 后来翻回来写发现自己整个理解错了期望的含义 何 T3错误想到赛道修建结果来了个错误贪心 关于T2破罐子破摔输出k居然