我又变菜了。。

1001 - AND Minimum Spanning Tree

分析:每个数接在二进制下第一个0的权值下,如果大于n就接在1上面。

#include <bits/stdc++.h>using namespace std;
const int maxN = 2e5 + 7;
int N, ans[maxN];int main() {int Cas;scanf("%d", &Cas);while (Cas--) {scanf("%d", &N);int Ans = 0;int tmp = log2(1. * N);tmp = 1 << tmp;for (int i = 2; i <= N; i++) {if (i % 2 == 0) ans[i] = 1;else {int cnt = 0;int x = i;while(x){if(x&1){x>>=1;cnt++;}else break;}if((1<<cnt)<=N)ans[i] = 1<<cnt;else {Ans++;ans[i]=1;}}}printf("%d\n", Ans);for (int j = 2; j <= N; ++j) {printf("%d%c", ans[j], (j == N ? '\n' : ' '));}}
}

1003 - Divide the Stones

分析:判断n*(n+1)/2是否可以整除K。然后可以把n分成n/k个块,每组从每个块里面拿一个。

如果块是偶数的话,那么直接从两边取就可以了。

如果块是奇数的话,那么k一定是奇数。

n/k是奇数,那么n+1一定是偶数,n为奇数,要n能整除k,那么k一定不是偶数,所以k是奇数。

所以对于块为奇数的,先将前面的块当作偶数块处理,最后剩下3个块,按照如下方式进行分配:

第一个块的起始位置为第一个元素,第二块的起始位置为中间的元素,第三个块的起始位置为最后一个元素

然后第一个块从1到mid,第二个块从mid到最后一个,第三个块每次减2。

然后第一个块从mid+1到最后,第二个块从1到mid,第三个块从倒数第二个,每次减2。

然后最后特判一下n==k和n==1的情况就可以了,没判WA掉了GG。

#include "bits/stdc++.h"using namespace std;
vector<int> v[100004];int main() {int t;cin >> t;while (t--) {long long n, k;scanf("%lld%lld", &n, &k);long long sum = (n + 1) * n / 2;if (n == k && n == 1) {puts("yes");puts("1");} else if (n == k)puts("no");else if (sum % k != 0)puts("no");else {for (int i = 0; i <= k; ++i) {v[i].clear();}bool ok = 1;long long num = n / k;if ((num & 1) && (k % 2 == 0))ok = 0;else if (num & 1) {for (int i = 1; i + 3 <= num; i += 2) {for (int j = 1; j <= k; ++j) {v[j].push_back(k * (i - 1) + j);v[j].push_back((i + 1) * k - j + 1);}}for (int j = 1; j <= (k + 1) / 2; ++j) {int id = num - 2;v[j].push_back((id - 1) * k + j);id++;v[j].push_back((id - 1) * k + j + k / 2);id++;v[j].push_back(id * k - (j - 1) * 2);}for (int i = (k + 1) / 2 + 1; i <= k; ++i) {int id = num - 2;v[i].push_back((id - 1) * k + i);id++;v[i].push_back((id - 1) * k + i - (k + 1) / 2);id++;v[i].push_back((id) * k - (i - (k + 1) / 2) * 2 + 1);}} else {for (int i = 1; i <= num; i += 2) {for (int j = 1; j <= k; ++j) {v[j].push_back(k * (i - 1) + j);v[j].push_back((i + 1) * k - j + 1);}}}if (ok) {puts("yes");for (int i = 1; i <= k; ++i) {for (int j = 0; j < v[k].size(); ++j) {printf("%d%c", v[i][j], (j == v[k].size() - 1 ? '\n' : ' '));}}} else puts("no");}}
}

1007 - Just an Old Puzzle

分析:判断逆序对(判断的时候忽略0)和0的纵向移动距离 的奇偶性是否相同,因为0水平移动是不会改变逆序对的数量,只有纵向移动才会。

#include <bits/stdc++.h>using namespace std;
const int maxN = 2e5 + 7;
int a[20][20];int main() {int t;cin >> t;while (t--) {int ans = 0;int x, y;for (int i = 1; i <= 4; ++i) {for (int j = 1; j <= 4; ++j) {scanf("%d", &a[i][j]);if (a[i][j] != 0)for (int ii = 1; ii <= i; ++ii) {int maxn = 5;if (ii == i)maxn = j;for (int jj = 1; jj < maxn; ++jj) {if (a[ii][jj] > a[i][j])ans++;}}else {x = i, y = j;}}}int temp = 4 - x;ans %= 2;temp %= 2;if (ans == temp)puts("Yes");else puts("No");}
}

1008 - K-th Closest Distance

分析:考虑二分答案,即找[p-x,p+x]这个区间内的数是否大于等于K,然后就没了。主席树维护一下就可以了。

#include "bits/stdc++.h"using namespace std;
struct node {int ls, rs, sum;
} t[20000004];
int root[1000004], cnt;void init() {root[0] = cnt = t[0].ls = t[0].rs = t[0].sum = 0;
}int upd(int pre, int l, int r, int w) {int pos = ++cnt;t[pos] = t[pre];t[pos].sum++;if (l == r)return pos;int mid = l + r >> 1;if (w <= mid)t[pos].ls = upd(t[pos].ls, l, mid, w);else t[pos].rs = upd(t[pos].rs, mid + 1, r, w);return pos;
}int qu(int l, int r, int L, int R, int ql, int qr) {if (l >= ql && r <= qr)return t[R].sum - t[L].sum;int mid = l + r >> 1;int res = 0;if (ql <= mid)res += qu(l, mid, t[L].ls, t[R].ls, ql, qr);if (qr > mid)res += qu(mid + 1, r, t[L].rs, t[R].rs, ql, qr);return res;
}int main() {int T;cin >> T;while (T--) {int n, m;cin >> n >> m;init();int x;for (int i = 1; i <= n; ++i) {scanf("%d", &x);root[i] = upd(root[i - 1], 1, 1000000, x);}int l, r, p, k, las = 0;for (int i = 1; i <= m; ++i) {scanf("%d%d%d%d", &l, &r, &p, &k);l ^= las, r ^= las, p ^= las, k ^= las;int L = 0, R = 1000000, ans = -1;while (L <= R) {int mid = L + R >> 1;int num = qu(1, 1000000, root[l - 1], root[r], p - mid, p + mid);if (num >= k) {R = mid - 1;ans = mid;} else L = mid + 1;}printf("%d\n", ans);las = ans;}}
}

1010 - Minimal Power of Prime

分析:因为只需要求指数的最小值,所以我们先把1000以内的质数都除掉,可以得到一个答案。

考虑最坏的情况,在不计算存在幂为1的质数的时候,剩下的数可能是

(1)由某个数的2次幂和另外一个数的3次幂构成,即1e15左右,可能存在

(2)由某个数的2次幂组成,1e6以上,可能存在

(3)由某个数的3次幂组成,1e9以上,可能存在

(4)由某个数的4次幂组成,1e12以上,可能存在

(5)由某个数的5次幂组成,1e15以上,可能存在

(6)由某个数的2次幂和另外一个数的2次幂构成

其余情况都不存在,于是我们预处理出情况,处理完1000以内的质数后直接查询就可以了。

两个不同数的二次幂直接开根判断一下就可以了。

如果以上都不存在的话就说明剩下的数是一个质数,或者存在一个质数的1次幂,更新答案就可以了。

#include "bits/stdc++.h"using namespace std;
bool vis[1000004];
long long prim[1000004];
int cnt;
unordered_map<long long, bool> mp23, mp2, mp3, mp4, mp5;void init() {memset(vis, 0, sizeof(vis));cnt = 0;for (int i = 2; i < 1000004; ++i) {if (!vis[i])prim[cnt++] = i;for (int j = 0; j < cnt && i * prim[j] < 1000004; ++j) {vis[i * prim[j]] = 1;if (i % prim[j] == 0)break;}}//这里简单算了下,大概跑1e7这个数量级的次数for (int i = 0; i < cnt; i++) {if (prim[i] < 1000)continue;if (prim[i] * prim[i] > 1e9)break;for (int j = 0; j < i; j++) {if (prim[j] < 1000)continue;if (prim[i] * prim[i] * prim[j] * prim[j] * prim[j] > 1e18)break;mp23[prim[i] * prim[i] * prim[j] * prim[j] * prim[j]] = 1;}}for (int i = 0; i < cnt; ++i) {long long t = prim[i];t = t * t;if (t > 1e18)break;mp2[t] = 1;}for (int i = 0; i < cnt; ++i) {long long t = prim[i];t = t * t * t;if (t > 1e18)break;mp3[t] = 1;}for (int i = 0; i < cnt; ++i) {long long t = prim[i];t = t * t * t * t;if (t > 1e18)break;mp4[t] = 1;}for (int i = 0; i < cnt; ++i) {long long t = prim[i];t = t * t * t * t * t;if (t > 1e18)break;mp5[t] = 1;}
}int main() {int t;cin >> t;init();while (t--) {long long n;scanf("%lld", &n);int ans = 10000;for (int i = 0; i < cnt; ++i) {if (prim[i] > 1000)break;int sum = 0;while (n % prim[i] == 0) {sum++;n /= prim[i];}if (sum)ans = min(ans, sum);}if (mp2.count(n))ans = min(ans, 2);else if (mp3.count(n))ans = min(ans, 3);else if (mp4.count(n))ans = min(ans, 4);else if (mp5.count(n))ans = min(ans, 5);else if (mp23.count(n))ans = min(ans, 2);else if (n > 1) {long long t = sqrt(n);if (t * t == n)ans = min(2, ans);else ans = min(1, ans);}printf("%d\n", ans);}
}

2019 Multi-University Training Contest 4相关推荐

  1. HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)

    HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578) Problem Description T ...

  2. 2019 Multi-University Training Contest 7 部分补题

    2019 Multi-University Training Contest 7 部分补题 这场比赛三个人一起组队,比赛期间自己感觉并没有奉献多少东西,所以补题.而且总感觉比赛到后期很乏力(没力气那种 ...

  3. HDU 6638 [2019 Multi-University Training Contest 6]

    Snowy Smile Problem Description There are n pirate chests buried in Byteland, labeled by 1,2,-,n. Th ...

  4. Sichuan University Programming Contest 2018 Preliminary

    嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...

  5. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  6. HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2

    /* HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2 题意: ...

  7. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...

  8. 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...

  9. 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...

  10. hdu 4925 Apple Tree--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...

最新文章

  1. HDU 1241 Oil Deposits
  2. window7共享xp或者2003的文件设置
  3. Windows 自动登陆的简单方法
  4. 远程连接SQL Server2008的设置方式
  5. 细节决定成败—关于.net的.dll.refresh文件
  6. Filter使用详解
  7. LightGBM源码如何计算增益
  8. 不同网段的直连怎么互通_什么样的网络能互通,什么样的网络不能互通?
  9. thinkphp实现文件上传
  10. c语言必背数据结构_c语言必背代码有哪些?
  11. ZendStudio 安装
  12. 剑桥: 一个完美的读书地方
  13. 06 Halcon 点云平面度测量
  14. iwork8旗舰版 android,性能彪悍 双面神兽——酷比魔方iwork8旗舰版体验
  15. 图形学初步--裁剪算法之Liang-Barsky算法
  16. 网络中的“大禹”—防水墙是怎么工作的?
  17. GLM(广义线性模型) 与 LR(逻辑回归) 详解
  18. BeanUtils.copyProperties不支持复制集合的解决方案
  19. 《快速掌握PyQt5》第二十三章 主窗口QMainWindow
  20. 掌纹与掌静脉融合matlab代码,手形、掌纹和掌静脉多特征融合识别

热门文章

  1. Java 9 缩小字符串( Compact String)
  2. 进项发票数据采集,进项发票明细数据采集导出
  3. mmo架构_如何使用MMO或MOBA鼠标提高生产力
  4. TOMCAT9-嵌入式启动
  5. 单位OV代码签名证书与EV代码签名证书有什么区别
  6. 苹果成立45周年:亮眼成绩的背后,产品和营销有哪些启示
  7. 【图解Http 学习摘要】五、HTTPS 中的加密、证书介绍,不一直使用 HTTPS 的原因...
  8. Mac的远程控制在哪里取消
  9. 敏捷开晨会不是汇报工作
  10. 【数据分析思维】逻辑树分析(费米估算)