2023 CCPC哈尔滨 报告

比赛链接:Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforcesicon-default.png?t=O83Ahttps://codeforces.com/group/w6iGs8kreW/contest/552949

做题数:3 题

三题都是队友写的。所以来补一下 B L J。

B题


B. Memory

Little G used to be a participant in programming contests and he had attended nn contests in total, and for the ii-th contest, Little G got aiai happiness. However, Little G would also be influenced by past contests since memory also plays an important role to influence one's mood. So we can use following formula to value Little G's mood after the ii-th contest:

Mood(i)=∑j=1i2j−i×ajMood(i)=∑j=1i2j−i×aj

Now Little G is recalling the past and is curious about the moods after every contest, so he wants to tag the moods for every contest. Specifically, Little G will tag a positive sign ("+") for the ii-th contest if Mood(i)>0Mood(i)>0, or tag a negative sign ("-") if Mood(i)<0Mood(i)<0, or tag a zero ("0") if Mood(i)=0Mood(i)=0. But Little G is busy working and working, so he is now asking you, the best programming contestant, to help him tag the moods.

Input

The first line contains one integers nn (1≤n≤1051≤n≤105), denoting the number of contests Little G had attended.

The second line contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109), denoting the happiness values after every contest.

Output

Output one line containing a string which is of length nn and only contains "+", "-" or "0", denoting the mood tags after every contest.


WA:一开始觉得这题就是签到题(最后看似乎也差不多。。。是我菜)。可以从题目给的解释找到很简单的规律。假设上一次(i-1)的答案为k,那么第i次的答案就是 k/2+a[i]。一开始就这么用double暴力写的。但是!double会爆精度。所以wa了很多次。然后又想着用分子分母来表示,但是!这样会爆long long。所以就要考虑别的策略了。

AC:我们需要考虑小数对答案的影响。我们发现,本来有小数部分的数不管怎么/2 ,都有小数部分(也就是不可能为0)。那么我们就可以把一个数分为两部分来表示:a.b 。a表示整数部分,b是小数部分。然后模拟。

这题赛后补题的时候我思路特别乱,然后队友帮我掰正了捋了一遍。要感谢模拟大王队友^-^。事实就是,模拟的时候,一步一步来,不要上来就想着该怎么分怎么分,先把这一步的运算结束了,再考虑分类讨论。分类也要有条理。比如这题,一般情况,小数部分是不会对整数部分产生影响的,但当a/2+k[i]后a变号的时候,就要看有没有小数了。比如a=5,k=-4,5/2-4=-1.5。如果a/2还用a表示,运算完之后a就要再+1(-2+1=-1)。

看一下代码:

#include<iostream>
#include<cmath>
using namespace std;
#define int long longint n;
int k[1000010];
int a,b;signed main()
{cin>>n;for(int i=1;i<=n;i++){cin>>k[i];}a=k[1],b=0;if(a>0){cout<<'+';}else if(a==0){cout<<'0';}else{cout<<'-';}for(int i=2;i<=n;i++){if(a%2!=0){if(a>0)b=1;else if(a<0)b=-1;}a/=2;int g=a;a+=k[i];if(g*a<0){if(g>0&&b!=0){a++;b=-b;}else if(g<0&&b!=0){a--;b=-b;}}if(a==0&&b==0){cout<<'0';}else if(a>0||(a==0&&b>0)){cout<<'+';}else{cout<<'-';}
//		cout<<a<<" "<<b<<endl;}return 0;
}

L题


L. Palm Island

Toph is playing a card game. She has nn cards and each card has a unique number of 1,2⋯n1,2⋯n. In this game, Toph can operate the deck of the cards. We may wish to assume that the cards from the top to the bottom of the deck are p1,p2,⋯pnp1,p2,⋯pn (a permutation), then each operation must be one of the following two cases:

  1. Place the top card at the bottom of the deck, that is, change the order of the deck into p2,p3⋯pn,p1p2,p3⋯pn,p1.
  2. Place the second card from the top at the bottom of the deck, that is, change the order of the deck into p1,p3⋯pn,p2p1,p3⋯pn,p2

Now, you know that the initial order(from top to bottom) of Toph's deck is a1,a2,⋯ana1,a2,⋯an, and Toph wants to change the order of the deck into b1,b2,⋯bnb1,b2,⋯bn after some operations. Please construct the operation sequence to help Toph implement the change.

Toph has no patience. So the number of operations should not exceed n2n2.

Input

The first line contains an integer TT , indicating the number of test cases.

For each test case:

  • The first line contains an integer, n(3≤n≤1000)n(3≤n≤1000), indicating the number of Toph's cards.
  • The second line contains nn integers a1,a2,⋯ana1,a2,⋯an, a permutation indicating the order of the deck initially.
  • The third line contains nn integers b1,b2,⋯bnb1,b2,⋯bn, a permutation indicating the order of the deck want to make.

It is guaranteed that the sum of nn in TT test cases is not exceed 10001000.

Output

For each test case:

  • Output a line, which contains a string s1s2…sk(si∈{1,2}, 1≤i≤k)s1s2…sk(si∈{1,2}, 1≤i≤k) as your operation sequence. The length of the string should not exceed n2n2, or you will get "Wrong Answer".
  • If there are multiple solutions, output any of them.

AC:这题还是要感谢队友,提供了两个很重要的方向。一个是,这其实就是一个排序问题。例如,一开始数列是 2 4 5 3 1,要变成 4 1 2 5 3。那么等价操作就是,先把 4 1 2 5 3 编号 1 2 3 4 5,那么 问题就是把 3 1 4 5 2 变成 1 2 3 4 5。这不就是一个排序问题吗?排序问题是第一个点。还有一个点就是 把两个操作等效为 冒泡排序。冒泡排序怎么排呢,就是不断比较相邻两点大小,把大的往后移(swap),那么其实 2 1 操作就相当于一次swap。这是第二个点。

看一下代码:

#include<bits/stdc++.h>using namespace std;int t;
int n;
int a[1010],b[1010],id[1010];int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){cin>>b[i];id[b[i]]=i;}for(int i=1;i<=n;i++){for(int j=1;j<=n-1;j++){if(id[a[j]]>id[a[j+1]]){cout<<'2';swap(a[j],a[j+1]);}elsecout<<'1';}cout<<'1';}cout<<'\n';}return 0;
}

J题:

j题比赛可谓半点不会,而且之前从来没有做过树上博弈论问题。(准确地说 都不知道sg函数。。。)补题的时候研究两天sg函数的原理(包括树上sg如何和nim游戏联系起来)。终于ac了。现在先贴一下从各大佬文章里看到的有关sg重要的公式。

算法学习笔记(博弈论中的SG函数)-CSDN博客

用sg判断胜负状态的关键大概是:把原游戏看成k个子游戏(例如 本题就是每个数是一个“子状态”,又或者nim游戏中每堆石子的个数是一个“子状态”)。那么,把这k个“子状态”的sg函数值求异或,若异或和为0,那么 必败。否则,存在必胜态。

那么,每个状态的sg函数值怎么求呢?用这个子状态的子状态的sg函数值求mex。

(mex函数的值表示不属于集合的最小非负整数)

可以自己推算,很容易证明出nim游戏必胜态的规律(每堆石子数异或和为0则必败)。

但我们一直被困在 如何将nim游戏和博弈论联系起来。我们一直以为 nim游戏的异或和公式是由sg函数导出的。但其实,我们是将sg的性质nim游戏相联系。我们要注意sg函数的定义:一个状态sg函数值为k,那么 它的子状态的sg函数 一定包含0~k-1的所有数。!!!这点和nim游戏的性质一样啊。nim游戏的性质是:数量为k的石子堆可以在下个状态中变为从0~k-1中的任意一个状态。那么,我们就可以用nim游戏的结论来引入sg函数赢的结论:所有状态的sg函数异或和为0,则为必败态。

所以以后博弈论问题,我们就如何判断一个状态的胜负态呢?把所有分立状态的sg函数值异或和,为0则是必败态。

例如这题,我们手推发现,数点数为奇数是树的sg函数为1,偶数是为2,点数为0时sg函数为0。那么就暴力走dfs,把每个状态都走一遍,看看子状态sg函数异或和,若为0,则ans++(子状态必输,则现在必赢)。

看代码吧~:

#include<iostream>
using namespace std;int n,m,ans;
struct EDGE{int u,v;EDGE* ne;
}edge[1000010];
struct NODE{EDGE* fir;
}node[1000010];
int fa[10000010];
int SG;int sg(int i){if(i==0)return 0;else return (2-i%2);
}void init(int n){for(int i=1;i<=n;i++){fa[i]=i;}
}
int find(int i){if(fa[i]==i){return fa[i];}fa[i]=find(fa[i]);return fa[i];
}
void unionn(int i,int j){int fa_i=find(i);int fa_j=find(j);fa[fa_i]=fa_j;
}int tot;
void my_build(int u,int v){edge[tot].u=u;edge[tot].v=v;edge[tot].ne=node[u].fir;node[u].fir=&edge[tot];tot++;
}int siz[1000010];
void dfs1(int u,int fa){siz[u]=1;EDGE* i=node[u].fir;while(i!=NULL){if(i->v==fa){i=i->ne;continue;}dfs1(i->v,u);siz[u]+=siz[i->v];i=i->ne;}
}void dfs2(int u,int fa,int k){int nowsg=0;EDGE* i=node[u].fir;while(i!=NULL){if(i->v==fa){i=i->ne;continue;}nowsg^=sg(siz[i->v]);dfs2(i->v,u,k);i=i->ne;}//delete nodeif((SG^sg(siz[k]-siz[u])^nowsg)==0){ans++;}//delete edgeif(fa!=0&&(SG^sg(siz[u])^sg(siz[k]-siz[u]))==0){ans++;}
}int main()
{cin>>n>>m;int u,v;init(n);for(int i=1;i<=m;i++){cin>>u>>v;my_build(u,v);my_build(v,u);unionn(u,v);}for(int i=1;i<=n;i++){if(find(i)==i){dfs1(i,0);SG^=sg(siz[i]);}}for(int i=1;i<=n;i++){if(find(i)==i){SG^=sg(siz[i]);dfs2(i,0,i);SG^=sg(siz[i]);}}cout<<ans;return 0;
}

呼...整了三天,才整完银牌题。路漫漫其修远兮...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559022.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计 内蒙古旅游景点数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Http 协议和 RPC 协议有什么区别?

Http 协议和 RPC 协议有什么区别&#xff1f; 三个层面来述说&#xff1a; 从功能特性来说&#xff1a; HTTP是一个属于应用层的超文本传输协议&#xff0c;是万维网数据通信的基础&#xff0c;主要服务在网页端和服务端的数据传输上。 RPC是一个远程过程调用协议&#xff0…

安装Unity3D并配置VisualStudio

安装Unity3D并配置VisualStudio 由于近期课程要求&#xff0c;需要在电脑上安装Unity3D并配置VisualStudio&#xff0c;所以顺便写了本篇博文 1.下载Unity Hub 首先我们找到Unity中文官网&#xff0c;下载Unity Hub&#xff0c;它可以帮助我们管理我们的Unity项目和版本&#…

c++11~c++20 thread_local

线程局部存储是指对象内存在线程开始后分配&#xff0c;线程结束时回收且每个线程有该对象自己的实例&#xff0c;简单地说&#xff0c;线程局部存储的对象都是独立各个线程的。实际上这并不是一个新鲜个概念&#xff0c;虽然C一直没因在语言层面支持它&#xff0c;但是很早之前…

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优

处理Java内存溢出问题&#xff08;java.lang.OutOfMemoryError&#xff09;&#xff1a;增加JVM堆内存与调优 在进行压力测试时&#xff0c;遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…

【斯坦福CS144】Lab4

一、实验目的 完成一个网络接口实现。 二、实验内容 完成一个网络接口实现&#xff0c;其大部分工作是&#xff1a;为每个下一跳IP地址查找(和缓存)以太网地址。而这种协议被称为地址解析协议ARP。 三、实验过程 在minnow目录下输入git merge origin/check4-startercode获…

DAMA数据管理知识体系(第15章 数据管理成熟度评估)

课本内容 15.1 引言 概要 能力成熟度评估&#xff08;Capability Maturity Assessment&#xff0c;CMA&#xff09;是一种基于能力成熟度模型&#xff08;Capability Maturity Model&#xff0c;CMM&#xff09;框架的能力提升方案&#xff0c;描述了数据管理能力初始状态发展到…

简易登录注册;测试类;postman测试;

项目是如何创建的&#xff0c;最简易的登陆注册功能是怎么实现的&#xff0c;数据库不能明文存放密码&#xff0c;密码经过了怎么样的处理存入数据库 前端使用nodejs18 后端项目需要等待maven加载完相关依赖&#xff0c;后端使用java17 1后端 1.1 创建项目所需要的数据库 内…

Sentinel最全笔记,详细使用步骤教程清单

一、Sentinel的基本功能 1、流量控制 流量控制在网络传输中是一个常用的概念&#xff0c;它用于调整网络包的发送数据。然而&#xff0c;从系统稳定性角度考虑&#xff0c;在处理请求的速度上&#xff0c;也有非常多的讲究。任意时间到来的请求往往是随机不可控的&#xff0c;…

Unity转Unreal5之从入门到精通 Spline(样条曲线)组件的使用

前言 Spline 组件 能编辑 样条曲线,定义一条路径,路径上的点可以通过距离起点的长度获取,因此可以实现 物体沿路径连续移动 的效果或者 物体沿路径分布 的效果。 今天我们就来实现一个简单的Spline样条曲线的Demo 实现一个沿路径运动的功能 1.新建一个基于 Actor 的蓝图…

ICE/TURN/STUN/Coturn服务器搭建

ICE 当我们想要实现在公网环境下的语音/视频通话功能时&#xff0c;就需要用到ICE交互式连接建立。ICE不是一种协议&#xff0c;整合了 STUN 和 TURN 两种协议&#xff08;用于 NAT 穿透&#xff09;的框架。 ICE的主要目标是解决NAT&#xff08;网络地址转换&#xff09;穿越…

[ C++ ] C++ 类和对象 -- 类的六个默认成员函数

目录 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值操作符重载 5.两个取地址操作符的重载 在C中当你创建一个空类&#xff0c;那这个空类是什么都没有吗&#xff1f;不是的&#xff0c;编译器会默认帮你生成六个成员函数 1.构造函数 构造函数是特殊的成员函数&#xff0c;…

leetcode 10.9 94.二叉树的中序遍历

94. 二叉树的中序遍历 已解答 简单 相关标签 相关企业 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a…

makefile的基本练习

假设有如下目录结构&#xff1a;&#xff08;目录结构图&#xff09; 完成以下操作&#xff1a; 1、通过纯命令编写Makefile文件&#xff0c;并发现使用纯命令的不足&#xff1b; 2、在Makefile中&#xff0c;添加变量&#xff0c;简化参数的重复书写&#xff1b; 3、尝试在多目…

『网络游戏』客户端使用PESorket发送消息到服务器【14】

上一章服务器已经完成使用PESorket 现在我们将其导出在客户端中使用 生成成功后复制 粘贴到Unity项目中 进入Assets文件夹 粘贴两个.dll 创建脚本:ClientSession.cs 编写脚本: ClientSession.cs 编写脚本:GameStart.cs 将GameStart.cs脚本绑定在摄像机上 运行服务器 运行客户端…

Linux网络驱动实验

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用&#xff0c;方便进一步记录自己的实践总结。 网络驱动是 linux 里面驱动三巨头之一&#xff0c;linux 下的网络功能非常强大&#xff0c;嵌入式 linux 中也常常用到网络功能。前面我们已经讲过…

8.12 矢量图层面要素单一符号使用十三(插值线渲染边界)

8.12 矢量图层面要素单一符号使用十三(插值线渲染边界)-CSDN博客 目录 前言 插值线渲染边界&#xff08;Outline: Interpolated Line&#xff09; QGis设置面符号为插值线渲染边界&#xff08;Outline: Interpolated Line&#xff09; 二次开发代码实现插值线渲染边界&…

Base64字符串转图片在线工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 Base64编码&#xff0c;作为一种将二进制数据转换为文本格式的方法&#xff0c;其核心在于利用64个可打印字符来表征任意的二进制信息。这一编码方式的出现&#…

erlang学习:Linux命令学习11

crontab命令 crontab命令是用于管理定时任务的命令行工具。它提供了多种选项和参数&#xff0c;可以用来创建、编辑、查看和删除用户的定时任务。 常用命令 以下是一些常用的crontab命令&#xff1a; crontab -e&#xff1a;编辑当前用户的定时任务列表。该命令会在默认编辑…

PostgreSQL学习笔记三:数据类型和运算符

数据类型和运算符 PostgreSQL 支持多种数据类型和运算符&#xff0c;以下是一些常见的数据类型和运算符的概述&#xff1a; 数据类型 基本数据类型 整数类型&#xff1a; SMALLINT&#xff1a;2 字节&#xff0c;范围 -32,768 到 32,767。INTEGER&#xff1a;4 字节&#xff0…