2022“杭电杯”中国大学生算法设计超级联赛(8)题解报告
Problem D. Quel’Thalas
题解:
手玩一下就会发现答案是就是2n。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#define pi acos(-1)
#define int long long
#define double long double
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;const int N = 1e6 + 10;int n;void solve()
{cin >> n;cout << 2 * n << '\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int t;cin >> t;while(t--){solve();}
}
Problem A. Theramore
题解:
对于奇偶性相同的位置可以任意交换位置,所以对于奇偶位置单独处理即可。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#define pi acos(-1)
#define int long long
#define double long double
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;const int N = 1e6 + 10;string s;
char a[N], b[N];void solve()
{cin >> s;int len = s.length();int la = 0, lb = 0;for(int i = 0; i < len; i++){if(i % 2) b[++lb] = s[i];else a[++la] = s[i];}sort(a + 1, a + 1 + la);sort(b + 1, b + 1 + lb);for(int i = 1; i <= len / 2; i ++) cout << a[i] << b[i];if(len % 2) cout << b[lb] << '\n';else cout << '\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int t;cin >> t;while(t--){solve();}
}
Problem K. Stormwind
题解:
枚举小长方形的某个边长的最小值,由此可以求出另一个边长允许的最小值,然后求出两个方向分别最多能画几条线。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#define pi acos(-1)
#define int long long
#define double long double
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;const int N = 1e6 + 10;int n, m, k;void solve()
{cin >> n >> m >> k;int ans = -ans;for(int i = 1; i <= n && i <= k; i ++){if((k / i + (k % i > 0)) > m) continue;ans = max(ans, (n / i) + (m / (k / i + (k % i > 0))) - 2);}swap(n, m);for(int i = 1; i <= n && i <= k; i ++){if((k / i + (k % i > 0)) > m) continue;ans = max(ans, (n / i) + (m / (k / i + (k % i > 0))) - 2);}cout << ans << '\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int t;cin >> t;while(t--){solve();}
}
Problem E. Ironforge
题解:
求出从每个点出发能到达的最大的范围,即可O(1)回答所有询问。
先从大到小枚举,预处理每个点只向右走的最大范围,如果能向右走一步就先取 i+1 的范围,然后沿着
之前预处理的范围向后跳。向后跳的次数是均摊O(1)的。
然后从小到大枚举,求每个点能走到的最大范围。
如果i能走到i + 1:
如果i + 1已经预处理的向右的范围无法让它走回i则取预处理的答案;
否则i + 1和 i 范围相同。
如果 i 不能走到 i+1:
先取预处理的范围,然后向左向右扩展,都沿着已知的范围暴力跳即可。向左向右跳的次数都是均摊O(1)的。
判断一个范围内是否存在某个质因子,方法有很多,标程采用的是对每个质因子维护一个 vector 存它出现的所有位置,在 vector 上二分。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#define int long long
#define double long double
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;const int N = 2e5 + 10;int n, m, a[N], b[N], clean[N], tim;
int L[N], R[N];int pr[N], pcnt, vis[N], low[N];
vector<int> pos[N];bool Check(int p, int l, int r) {if (!pos[p].size() || pos[p].back() < l) return 0;int x = *lower_bound(pos[p].begin(), pos[p].end(), l);return (x <= r);
}void init() {n = 200000;for (int i = 2; i <= n; ++i) {if (!vis[i]) {pr[++pcnt] = i;low[i] = i;}for (int j = 1; j <= pcnt && i * pr[j] <= n; ++j) {vis[i * pr[j]] = 1;low[i * pr[j]] = pr[j];if (i % pr[j] == 0) break;}}
}void solve() {cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i < n; ++i) cin >> b[i];for (int i = 1; i <= n; ++i) {int x = a[i];while (x > 1) {int nowp = low[x];while (nowp == low[x]) {x /= nowp;}if (clean[nowp] != tim) {pos[nowp].clear();clean[nowp] = tim;}pos[nowp].push_back(i);}}++tim;for (int i = n; i >= 1; --i) {R[i] = i;while (R[i] < n && Check(b[R[i]], i, R[i])) {R[i] = R[R[i] + 1];}}for (int i = 1; i <= n; ++i) {if (i > 1 && R[i - 1] >= i) {if (Check(b[i - 1], i, R[i])) {L[i] = L[i - 1];R[i] = R[i - 1];} else {L[i] = i;}} else {L[i] = i;while (1) {bool flag = 0;while (R[i] < n && Check(b[R[i]], L[i], R[i])) {flag = 1;R[i] = R[R[i] + 1];}while (L[i] > 1 && Check(b[L[i] - 1], L[i], R[i])) {flag = 1;L[i] = L[L[i] - 1];}if (!flag) break;}}}for (int i = 1, x, y; i <= m; ++i) {cin >> x >> y;if (L[x] <= y && y <= R[x]) cout << "Yes\n";else cout << "No\n";}
}signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);init();int t;cin >> t;while(t--){solve();}
}
Problem G. Darnassus
题解:
依次连接i,i + 1,这样的生成树每条边边权都小于等于n - 1,因此存在一种最小生成树中也
只有边权小于等于n - 1的边(Kruskal 算法的原理)。
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
//#define int long long
#define double long double
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;
}const int N = 5e4 + 5;int n, pos[N], p[N], rt[N];
int tot, head[N];struct edg{int to, fr, next;
}e[N * 460];int fin(int a){return (rt[a] == a) ? a : rt[a] = fin(rt[a]);
}void Insert(int u, int v, int w){e[++tot].to = v;e[tot].fr = u;e[tot].next = head[w];head[w] = tot;
}void solve()
{n = read();for(int i = 1; i <= n; i++){p[i] = read();pos[p[i]] = i;head[i] = 0;rt[i] = i;}int m = sqrt(n), cnt = n - 1;long long ans = 0;tot = 0;for(int i = 1; i <= n; i++){for(int j = i + 1; j <= min(n, i + m); j ++){int tmp = (j - i) * abs(p[i] - p[j]);if(tmp < n) Insert(i, j, tmp);tmp = (j - i) * abs(pos[i] - pos[j]);if(tmp < n) Insert(pos[i], pos[j], tmp);}}for(int i = 1; i < n; i++){for(int j = head[i]; j; j = e[j].next){int u = fin(e[j].fr), v = fin(e[j].to);if(u != v){rt[u] = v;ans += i;cnt --;}}if(cnt == 0) break;}printf("%lld\n", ans);
}signed main(){// ios::sync_with_stdio(0);// cin.tie(0); cout.tie(0);int t;cin >> t;while(t--){solve();}
}
2022“杭电杯”中国大学生算法设计超级联赛(8)题解报告相关推荐
- 2022“杭电杯”中国大学生算法设计超级联赛(8)
2022"杭电杯"中国大学生算法设计超级联赛(8) [题目链接](Search Result (hdu.edu.cn)) D Quel'Thalas 题目大意 在二维平面上,[0, ...
- 2022“杭电杯”中国大学生算法设计超级联赛(4)
2022"杭电杯"中国大学生算法设计超级联赛(4) [题目链接](Search Result (hdu.edu.cn)) D Link with Equilateral Trian ...
- 2022“杭电杯”中国大学生算法设计超级联赛 (1) 杭电多校第一场 2 3 4 5 8 12
题目 1002 Dragon slayer 标程 1003 Backpack AC代码 1004 Ball AC代码 1008 Path AC代码 1009 Laser AC代码 1012 Alice ...
- 2022“杭电杯”中国大学生算法设计超级联赛 (2) 杭电多校第二场
题目 1001 Static Query on Tree AC代码 1002 C++ to Python AC代码 1003 Copy AC代码 1005 Slayers Come AC代码 1007 ...
- 2022“杭电杯”中国大学生算法设计超级联赛(6)题解报告
1006.Maex 题意: 给定一棵由从 1 到 n 编号的 n 个顶点组成的有根树,根为顶点 1.顶点 i 有一个自然数权重 ai,并且没有两个不同的顶点具有相同的权重.bu是以u为根的子树的权重的 ...
- 2022“杭电杯”中国大学生算法设计超级联赛(2)1003.Copy
样例输入: 1 5 3 1 2 3 4 5 2 4 1 2 4 2 5 样例输出: 6 题意: 有q次操作,有以下两种: 1.选择区间[l,r],复制[l,r]追加到r后,总的数组的大小(n)不变 ...
- 2022“杭电杯”中国大学生算法设计超级联赛(8)补题
1004 Quel'Thalas 题意 在二维平面上,点在坐标在[0,n]的区间内,通过添加无限长的直线可以覆盖这些点,在不覆盖(0,0)的情况下要添加多少根直线. 思路 在两个方向上添加直线,所以 ...
- 2022“杭电杯”中国大学生算法设计超级联赛(8)补题 1011 (持续更新中)
目录 1011 Stormwind(贪心--分割矩形) 1011 Stormwind(贪心–分割矩形) /*题解:想要切割的次数最多,让原矩形的一边尽可能被多次切割,另一边紧跟即可*/ #includ ...
- 2022“杭电杯”中国大学生算法设计超级联赛(1)1003 Backpack个人题解
Backpack 题目描述 有n件物品,他们各自都有体积vi和价值wi,给你一个体积为m的背包,求是否能从这n件物品中取出若干件,使得它们的体积之和恰好为m,所有物品的异或和最大,最大值是多少 分析 ...
最新文章
- 转:初探 jQuery 的 Sizzle 选择器
- 安装64位Oracle 10g超详细教程
- 一个简单的动态内表alv案例
- 【Codeforces】 Round #374 (Div. 2)
- Linux Ubuntu使用技巧
- vue - cli 脚手架安装
- phppython混合开发_如何让python嵌入html实现类似php的快速开发,十分有价值
- 探测活动主机的代码linux,Linux入侵痕迹检测方案【华为云技术分享】
- protostuff java_protostuff 及其注意事项
- 我的世界如何开直连服务器,我的世界服务器如何连接 连接服务器教程
- 上证指数ARIMA模型预测(R软件)
- 关于我在黑马程序员培训毕业后的亲身体验
- nanodlp micro USB mini USB接线图
- linux安装weget命令,linux安装wget命令
- msf之制作木马进行远程控制
- dell微型计算机换内存条,内存条的更换,详细教您电脑的内存条怎么更换
- docker 常用命令合集
- 计算机软件维护基本知识,电脑硬件基础维护常识大全
- 学会ipad当作电脑扩展屏方法
- AutoCAD输入netload命令后不弹出菜单而是一直显示程序集文件名解决方案
热门文章
- python实现全盘扫描搜索功能
- 计算机主板上的 r1,dell戴尔台式机电脑0XR1GT主板都支持什么型号的CPU与显卡
- 呕心沥血苦战6个月,熬夜总结的这份Java0基础进阶架构师视频+笔记+课件+源码资料,快快收藏手慢无
- DRM系列(9)之drm_atomic_helper_commit
- ifix5.8 启动过程中 iFX系统未启动!Profice iFIX 启动文件末找到无法执行任务:IOCNTRL.EXE
- 点阵---点亮一个点(内含硬件设计+软件编程+思路)
- TRIZ创新方法——剪裁
- 一个移动开发者的自述
- readxmls r语言_R语言实战(一)介绍、数据集与图形初阶
- SD卡WAV音乐播放器(quartus11.0)(FAT32)(DE2-115)