“华为杯“华南理工大学程序设计竞赛(同步赛)

目录

最长回文子串

又一道好题

信号塔

网格树

异色边2


M

最长回文子串

构造+马拉车

#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
//#define f first
//#define s second
const int inf = 0x3f3f3f3f3f3f3f3f, N = 1e5 + 5, mod = 1e9 + 7;
signed main()
{ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);int T;cin >> T;while (T--){int n;cin >> n;vector<int>a(n + 1);for (int i = 1; i <= n; i++) cin >> a[i];vector<int>f(n + 1);f[1] = f[2] = 1;for (int i = 2; i < n; i++) {if (a[i] == 1) {f[i + 1] = 1 - f[i - 1];}else {f[i + 1] = f[i - 1];}}vector<int>tmp(n * 2 + 5);int cnt = 0;tmp[++cnt]=-2, tmp[++cnt] = -1;for (int i = 1; i <= n; i++) {tmp[++cnt] = f[i];tmp[++cnt] = -1;}tmp[++cnt] = -3;int mr = 0, mid = 0, ans = 0;vector<int>p(n * 2 + 5);for (int i = 2; i <= cnt - 1; i++) {//mid-(i-mid)if (i < mr)p[i] = min(p[mid - (i - mid)], mr - i + 1);else p[i] = 1;while (tmp[i - p[i]] == tmp[i + p[i]]) ++p[i];if (i + p[i] > mr) mr = i + p[i] - 1, mid = i;}bool ok = true;for (int i = 3; i <= cnt - 2; i += 2) {if ((p[i] / 2-1)*2+1 != a[i/2])ok = false;}if (ok) {for (int i = 1; i <= n; i++) {cout << f[i];}cout << "\n";}else {cout << -1 << '\n';}}
}

K

又一道好题

 启发式合并

int g[N], idx[N], val[N], m;
unordered_set<int>st[N];
int getid(int v) {if (g[v] == -1) {g[v] = ++m;val[g[v]] = v;}return g[v];
}
void join(int x, int y, int v) {val[x] = v;g[v] = x;for (int w : st[y]) {st[x].insert(w);idx[w] = x;}st[y].clear();g[v - 1] = -1;
}
signed main()
{ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);int T;cin >> T;while (T--){int n, Q;cin >> n >> Q;for (int i = 0; i <= Q; ++i) g[i] = -1;for (int i = 1; i <= n; ++i) {st[0].insert(i);idx[i] = 0;}g[0] = 0;val[0] = 0;m = 0;int QQ=Q;while (Q--){int op, x;cin >> op >> x;if (op == 1) {int p = idx[x];int v = val[p] + 1;st[p].erase(x);int w = getid(v);st[w].insert(x);idx[x] = w;}else {if (g[x] == -1)  continue;int x1 = g[x];int x2 = getid(x + 1);if (st[x1].size() < st[x2].size()) {join(x2, x1, x + 1);}else {join(x1, x2, x + 1);}}}for (int i = 1; i <= n; i++) {cout << val[idx[i]] << ' ';}cout << "\n";for (int i = 0; i <= QQ; i++) {st[i].clear();}}
}
H

信号塔

换根dp

dp 0表示当前没有信号塔子树最少需要信号塔数,1 当前有信号塔子树需要的信号塔数

#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
//#define f first
//#define s second
const int inf = 0x3f3f3f3f3f3f3f3f, N = 2e5 + 5, mod = 1e9 + 7;
vector<int>q[N];
PII dp[N];//0 no 1 yes
int sz[N];
int f[N];
void dfs(int x, int fa)
{f[x] = fa;sz[x] = 1;dp[x] = { 0,1 };for (auto w : q[x]) {if (w == fa) continue;dfs(w, x);sz[x] += sz[w];dp[x].first += dp[w].second;dp[x].second += min(dp[w].first, dp[w].second);}
}
map<PII, int>mp;
int res[N];
void dfs2(int x, int fa) {for (auto w : q[x]) {if (w == fa) continue;dp[x].first -= dp[w].second;dp[x].second -= min(dp[w].first, dp[w].second);dp[x].first += dp[fa].second;dp[x].second += min(dp[fa].first, dp[fa].second);res[mp[{min(x, w), max(x, w)}]] = min(dp[x].first, dp[x].second) + min(dp[w].first, dp[w].second);dfs2(w, x);dp[x].second-= min(dp[fa].first, dp[fa].second);dp[x].first-= dp[fa].second;dp[x].first += dp[w].second;dp[x].second += min(dp[w].first, dp[w].second);}
}
signed main()
{ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);int T;cin >> T;while (T--){int n;cin >> n;for (int i = 1; i <= n; i++) q[i].clear();for (int i = 1; i < n; i++){int u, v;cin >> u >> v;mp[{min(u, v), max(u, v)}] = i;q[u].push_back(v);q[v].push_back(u);}dfs(1, 0);dfs2(1, 0);for (int i = 1; i < n; i++) {cout << n - res[i] << ' ';}cout << "\n";mp.clear();}
}
G

网格树

暴力dfs+剪枝

#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
const int inf = 0x3f3f3f3f3f3f3f3f, N = 1e5 + 5, mod = 1e9 + 7;
int i, j, k, n, m, t, tot, cur, li, xx, yy;
vector<pair<int, int> > d = { {1,0},{-1,0},{0,1},{0,-1} };
string s[66];
int res, f[33][33], op[33][33], vis[33][33];
bool dfs2(int x, int y, int fx, int fy) {//用来检查当前放置方法是否符合if (vis[x][y]) return 0;vis[x][y] = 1; tot++;for (auto w : d) {int i = w.first, j = w.second;i += x, j += y;if (i<1 || i>n || j<1 || j>m || f[i][j]==0) continue;if (i == fx && j == fy) continue;if (dfs2(i, j, x, y)==0) return 0;}return 1;
}
void dfs(int x, int y)
{memset(vis, 0, sizeof vis); tot = 0;if (y > m) { x++; y = 1; }int sb = n * m - (x - 1) * m - (y - 1);if (sb + cur <= res)return;if (x > n) {//终止条件if (cur <= res || dfs2(xx, yy, -1, -1)==0) return;if (tot != cur) return;memcpy(op, f, sizeof f); res = cur;//op当前最优的放置方法return;}f[x][y] = 1; cur++;//f=1表示当前点位'.'  0表示'#'if (dfs2(x, y, -1, -1)==1&&tot==cur)dfs(x, y + 1);f[x][y] = 0; cur--;if (s[x][y] != '+')dfs(x, y + 1);
}
signed main()
{ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 1; i <= n; i++) {s[i] = string(m, '.');s[i] = "$" + s[i];}xx = yy = 1; s[1][1] = '+';//表示以1 1为跟的树dfs(1, 1);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (op[i][j]) cout << ".";else cout << "W";}cout << "\n";}
}

J

异色边2

 就是特殊处理一下环的元素,找到环后其他就都是树,贪心一下就行了,有点像基环树,找环的时候简单用一下tarjan

#define int long long//__int128 2^127-1(GCC)
#define PII pair<int,int>
const int inf = 0x3f3f3f3f3f3f3f3f, N = 3e5 + 5, mod = 1e9 + 7;
vector<int>v[N];
int f[N];
int cnt, top;
int k;
int sk[N];
int h[N];
int col[N];
void dfs(int x,int fa)
{sk[++top]=x;f[x]=1;for(int y:v[x]){if(y==fa) continue;if(f[y]==1){if(cnt!=0){continue;}for(int i=top;sk[i]!=y&&i>=1;i--)//找到唯一的环 h[++cnt]=sk[i];h[++cnt]=y;}else dfs(y,x);}top--;
}
void dfs1(int x,int fa)
{for(int y:v[x]){if(y==fa||!f[y]) continue;if(k>0){k--;col[y]=col[x]^1;}else col[y]=col[x];dfs1(y,x);}
}
signed main()
{ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);int T;cin >> T;while (T--){int n;cin >> n >> k;for (int i = 1; i <= n; i++) v[i].clear(), f[i] = 0;for (int i = 1; i <= n; i++) {int a, b;cin >> a >> b;v[a].push_back(b);v[b].push_back(a);}cnt = top = 0;dfs(1,0);int t=cnt/2*2;//如果时是奇数的话,有一个是没用的 if(t<=k){for(int i=1;i<=cnt;i++){col[h[i]]=i&1;}k-=t;}else{t=k/2*2;for(int i=1;i<=t;i++){col[h[i]]=i&1;}for(int i=t+1;i<=cnt;i++){col[h[i]]=1;}k%=2;}for(int i=1;i<=cnt;i++){f[h[i]]=0;}for(int i=1;i<=cnt;i++){dfs1(h[i],0);}if(k>0){cout<<"-1\n";}else{for(int i=1;i<=n;i++){cout<<col[i];}cout<<"\n";}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年第十五届蓝桥杯省赛C++B组(浙江省第二次,4月21号)【真题解析】

等C语言网或者别的地方更新题目&#xff0c;蓝桥杯真题 - 编程题库 - C语言网 (dotcpp.com)&#xff0c;后序再做更新 题目没带出来有点忘了&#xff0c;下面是不按顺序来的 第一题&#xff1a;一个数被表达成别的数&#xff0c;是否会出现字母。 除进制取余&#xff0c;进制…

stm32中的中断优先级

在工作中使用到多个定时器中断,由于中断的中断优先级不熟悉导致出错,下面来写一下中断的一些注意事项。 一、中断的分类 1、EXTI外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。 2、内部中断:…

Matlab对多个输入信号进行数值排序提取特定值

1、将多个信号转为一个数组信号输出&#xff0c;在这里需要注意&#xff0c;数据类型是否统一&#xff1b; 2、使用Sort模块&#xff0c;进行排序&#xff08;可设置排序方向&#xff09;&#xff0c;得到排序后的新数组以及对应的索引号&#xff1b; 3、设置想要的索引号&…

常见算法(二分,分块查找,插入,快速排序)

常见算法 1. 顺序查找 package com.mohuanan.exercise;import java.util.ArrayList;public class BasicFind01 {public static void main(String[] args) {int[] arr {1, 2, 3, 1, 2, 3, 4, 5, 6};int number 2;ArrayList<Integer> indexList findIndex(arr, number…

12.事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template><button click"addCount">Add</button><p>Count is: {{ count }}</p> </template> <script> export default {data() {return {count:0…

6.SpringBoot 日志文件

文章目录 1.日志概述2.日志作用3.使用和观察日志3.1如何观察日志3.2使用日志3.3日志级别3.4日志持久化3.5日志分割 4.日志框架4.1门面模式(外观模式)4.2 SLF4J框架介绍4.3 日志格式的说明4.3.1日志名称 5.日志颜色设置6.总结 大家好&#xff0c;我是晓星航。今天为大家带来的是…

Mac下 allure的下载与配置

前提 电脑安装了jdk1.8 链接&#xff1a;mac下配置JDK环境 下载Allure 1.Allure下载最新版本&#xff1a;Releases allure-framework/allure2 GitHub 2.下载后直接解压就好啦 配置 1.根据电脑终端类型输入对应命令&#xff1a; # bash终端 vim ~/.bash_profile # zsh终…

SpringMvc的核心组件和执行流程

一、 springmvc的核心组件及作用 1.DispatcherServlet:前置控制器&#xff0c;是整个流程控制的核心&#xff0c;用来控制其他组件的执行&#xff0c;降低了其他组件的耦合性 2.Handler:控制器&#xff0c;完成具体的业务逻辑&#xff0c;当DispatcherServlet接收到请求后&am…

Pages by User Role for WordPress:强化内容访问控制的必备插件

在数字化时代&#xff0c;WordPress已成为众多网站开发者和设计师的首选平台。然而&#xff0c;如何根据用户角色精确控制内容的访问权限&#xff0c;一直是困扰他们的难题。Pages by User Role for WordPress插件应运而生&#xff0c;为这一难题提供了完美的解决方案。 Pages …

力扣HOT100 - 23. 合并K个升序链表

解题思路&#xff1a; 只要会合并两个升序链表&#xff0c;合并K个做法类似。 class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode res null;for (int i 0; i < lists.length; i) {res merge(res, lists[i]);}return res;}public ListNode merg…

使用动画做一个走马灯的案例

走马灯 1.第一步-搭建环境 先搭建父盒子。父盒子里面再放入一个子盒子用来装7张图片&#xff0c;有因为图片在一行上了&#xff0c;所以需要使用flex布局。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

LRU算法介绍,LRU算法是什么

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取编程资料 LRU算法简介 LRU&#xff08;Least Recently Used&#xff09;算法是一种常用的缓存替换策略&#xf…

【人工智能基础】知识表示和专家系统

目录 一、知识 知识 产生式表示法 产生式表示形式 确定的事实性知识的产生式表示 不确定的事实性知识的产生式表示 确定的规则知识的产生式表示 不确定的规则知识的产生式表示 产生式系统构成 优点 缺点 语义网络 优点 缺点 框架 框架的一般结构 框架的继承 优…

golang本地缓存库之bigcache

1. 前言 上周工作之余逛github看到一个本地缓存库bigcache&#xff0c;这个是allegro公司开源的一个项目&#xff0c;主要是用于本地缓存使用&#xff0c;根据他们的博客说明&#xff0c;他们编写这个库最初的目的就是实现一个非常快速的缓存服务。 看了下bigcache这个库的源…

【信号与系统 - 10】拉普拉斯变换

1 定义 周期信号的傅里叶变换那篇提到了&#xff1a; F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 这个定义式需要满足绝对可积&#xff0c;即 ∫ − ∞ ∞ ∣ f ( t ) ∣ d t < ∞ \int…

ant design vue + jeecgboot 实现本地上传视频及播放视频功能

文章目录 上传视频1. 上传按钮事件2. 上传按钮触发3. 声明变量visible_uploadVideov4. 上传视频弹窗5. 保存视频6. 关闭上传视频弹窗 播放视频1. 获取上传后的视频1.1 插槽2. 触发播放视频事件3. 播放视频弹窗4. 暂停视频 上传视频 1. 上传按钮事件 点击上传按钮事件 --这个地…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

IDEA中添加servlet模板

官方代码链接 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java")import javax.servlet.*; import javax.servlet.http.*;

C++奇迹之旅:构造函数和析构函数

文章目录 &#x1f4dd;类的6个默认成员函数&#x1f320; 构造函数&#x1f309; 概念&#x1f309;特性&#x1f309;三种默认构造函数 &#x1f320; 析构函数&#x1f320; 特性&#x1f6a9;总结 &#x1f4dd;类的6个默认成员函数 如果一个类中什么成员都没有&#xff0…

iOS重签名-超详细,附排错

文章目录 重签名步骤步骤 1: 准备必要的材料步骤 2: 解压 .ipa 文件步骤3:将 Provisioning Profile 复制到 Payload 目录步骤 4: 移除原来的签名步骤 5: 使用新的证书和 Provisioning Profile 进行重签名步骤 6: 重新打包 .ipa 文件步骤 7: 安装和测试得到provisioning file和…