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)题解报告相关推荐

  1. 2022“杭电杯”中国大学生算法设计超级联赛(8)

    2022"杭电杯"中国大学生算法设计超级联赛(8) [题目链接](Search Result (hdu.edu.cn)) D Quel'Thalas 题目大意 在二维平面上,[0, ...

  2. 2022“杭电杯”中国大学生算法设计超级联赛(4)

    2022"杭电杯"中国大学生算法设计超级联赛(4) [题目链接](Search Result (hdu.edu.cn)) D Link with Equilateral Trian ...

  3. 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 ...

  4. 2022“杭电杯”中国大学生算法设计超级联赛 (2) 杭电多校第二场

    题目 1001 Static Query on Tree AC代码 1002 C++ to Python AC代码 1003 Copy AC代码 1005 Slayers Come AC代码 1007 ...

  5. 2022“杭电杯”中国大学生算法设计超级联赛(6)题解报告

    1006.Maex 题意: 给定一棵由从 1 到 n 编号的 n 个顶点组成的有根树,根为顶点 1.顶点 i 有一个自然数权重 ai,并且没有两个不同的顶点具有相同的权重.bu是以u为根的子树的权重的 ...

  6. 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)不变 ...

  7. 2022“杭电杯”中国大学生算法设计超级联赛(8)补题

    1004  Quel'Thalas 题意 在二维平面上,点在坐标在[0,n]的区间内,通过添加无限长的直线可以覆盖这些点,在不覆盖(0,0)的情况下要添加多少根直线. 思路 在两个方向上添加直线,所以 ...

  8. 2022“杭电杯”中国大学生算法设计超级联赛(8)补题 1011 (持续更新中)

    目录 1011 Stormwind(贪心--分割矩形) 1011 Stormwind(贪心–分割矩形) /*题解:想要切割的次数最多,让原矩形的一边尽可能被多次切割,另一边紧跟即可*/ #includ ...

  9. 2022“杭电杯”中国大学生算法设计超级联赛(1)1003 Backpack个人题解

    Backpack 题目描述 有n件物品,他们各自都有体积vi和价值wi,给你一个体积为m的背包,求是否能从这n件物品中取出若干件,使得它们的体积之和恰好为m,所有物品的异或和最大,最大值是多少 分析 ...

最新文章

  1. 转:初探 jQuery 的 Sizzle 选择器
  2. 安装64位Oracle 10g超详细教程
  3. 一个简单的动态内表alv案例
  4. 【Codeforces】 Round #374 (Div. 2)
  5. Linux Ubuntu使用技巧
  6. vue - cli 脚手架安装
  7. phppython混合开发_如何让python嵌入html实现类似php的快速开发,十分有价值
  8. 探测活动主机的代码linux,Linux入侵痕迹检测方案【华为云技术分享】
  9. protostuff java_protostuff 及其注意事项
  10. 我的世界如何开直连服务器,我的世界服务器如何连接 连接服务器教程
  11. 上证指数ARIMA模型预测(R软件)
  12. 关于我在黑马程序员培训毕业后的亲身体验
  13. nanodlp micro USB mini USB接线图
  14. linux安装weget命令,linux安装wget命令
  15. msf之制作木马进行远程控制
  16. dell微型计算机换内存条,内存条的更换,详细教您电脑的内存条怎么更换
  17. docker 常用命令合集
  18. 计算机软件维护基本知识,电脑硬件基础维护常识大全
  19. 学会ipad当作电脑扩展屏方法
  20. AutoCAD输入netload命令后不弹出菜单而是一直显示程序集文件名解决方案

热门文章

  1. python实现全盘扫描搜索功能
  2. 计算机主板上的 r1,dell戴尔台式机电脑0XR1GT主板都支持什么型号的CPU与显卡
  3. 呕心沥血苦战6个月,熬夜总结的这份Java0基础进阶架构师视频+笔记+课件+源码资料,快快收藏手慢无
  4. DRM系列(9)之drm_atomic_helper_commit
  5. ifix5.8 启动过程中 iFX系统未启动!Profice iFIX 启动文件末找到无法执行任务:IOCNTRL.EXE
  6. 点阵---点亮一个点(内含硬件设计+软件编程+思路)
  7. TRIZ创新方法——剪裁
  8. 一个移动开发者的自述
  9. readxmls r语言_R语言实战(一)介绍、数据集与图形初阶
  10. SD卡WAV音乐播放器(quartus11.0)(FAT32)(DE2-115)