C - K Swap

题意:给定一个整数序列,长度为n。每个数aia_iai​能与ai+ka_{i + k}ai+k​交换位置,是否能将该序列变换为升序。

思路:该序列可分为k个子序列:

  • a0,a0+k,a0+2k,...,a_0,a_{0+k}, a_{0+2k}, ... ,a0​,a0+k​,a0+2k​,...,
  • a1,a1+k,a1+2k,...,a_1,a_{1+k}, a_{1+2k}, ... ,a1​,a1+k​,a1+2k​,...,
  • ak−1,ak−1+k,al−1+2k,...,a_k-1,a_{k-1+k}, a_{l-1+2k}, ... ,ak​−1,ak−1+k​,al−1+2k​,...,

将这k个序列内部排序,放回原序列,判断原序列是否为升序。

Code

// Problem: C - K Swap
// Contest: AtCoder - AtCoder Beginner Contest 254
// URL: https://atcoder.jp/contests/abc254/tasks/abc254_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)/*
author: A Fei
*/
#include <bits/stdc++.h>#define x first
#define y second
#define pi acos(-1)
#define endl '\n'
#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define mem(x, a) memset(x, a, sizeof x)
#define pb(x) push_back(x)
#define rep(i, l, r) for(int i = l; i <= (r); ++ i)
#define per(i, r, l) for(int i = r; i >= (l); -- i)using namespace std;
typedef long long LL;
typedef double DB;
typedef pair<int, int> PII;
typedef pair<int, double> PID;
typedef pair<double, double> PDD;
template <typename T> void inline read(T &x) {int f = 1; x = 0; char s = getchar();while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();x *= f;
}int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
const int INF = 0x3f3f3f3f;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const int N = 2e5 + 10;
int n, k;int main()
{ios;cin >> n >> k;vector<int> a(n);rep(i, 0, n - 1) cin >> a[i];vector<int> c(n);rep(i, 0, k - 1){vector<int> b;for(int j = i; j < n; j += k)    b.pb(a[j]);sort(b.begin(), b.end());for(int j = 0; j < b.size(); j ++)    c[i + j * k] = b[j];}// for(auto x : c) cout << x << ' ';// cout << endl;if(is_sorted(c.begin(), c.end())) cout << "Yes\n";else cout << "No\n"; return 0;
}

D - Together Square

题意:找出有多少对儿:i,ji, ji,j,使得i∗ji * ji∗j为平方数。(1<=i,j<=n1 <= i, j <= n1<=i,j<=n)

思路:
可以考虑每个数都可分解质因子变为:
设N分解质因子为:N=p1a1∗p2a2∗⋯∗pnan其中p1,p2,⋯,pn为N的质因子则N的约数个数为:f(N)=(a1+1)∗(a2+1)∗⋯∗(an+1)设N分解质因子为: \\N = p_1^{a_1} * p_2^{a_2} *\cdots*p_n^{a_n}\\其中p_1,p_2,\cdots,p_n为N的质因子\\ 则N的约数个数为:f(N) = (a_1 + 1) * (a_2 + 1) * \cdots* (a_n + 1) 设N分解质因子为:N=p1a1​​∗p2a2​​∗⋯∗pnan​​其中p1​,p2​,⋯,pn​为N的质因子则N的约数个数为:f(N)=(a1​+1)∗(a2​+1)∗⋯∗(an​+1)
将该数中奇数个的质因子(记为XiX_iXi​)拿出来计数(记为CiC_iCi​)。


6:21∗312^1 * 3^121∗31 --> 2∗3=62 * 3 = 62∗3=6
24:23∗312^3 * 3^123∗31 --> 2∗3=62 * 3 = 62∗3=6
6∗24=144=1226 * 24 = 144 = 12 ^ 26∗24=144=122
所以当i,ji, ji,j的XXX相同时,说明i∗ji * ji∗j的质因子个数都是偶数,即i∗ji * ji∗j 为平方数。

答案为:C12+C22+...+Ci2C_1^2 + C_2^2 + ... + C_i^2C12​+C22​+...+Ci2​。

Code:

// Problem: D - Together Square
// Contest: AtCoder - AtCoder Beginner Contest 254
// URL: https://atcoder.jp/contests/abc254/tasks/abc254_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)/*
author: A Fei
*/
#include <bits/stdc++.h>#define x first
#define y second
#define pi acos(-1)
#define endl '\n'
#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define mem(x, a) memset(x, a, sizeof x)
#define pb(x) push_back(x)
#define rep(i, l, r) for(int i = l; i <= (r); ++ i)
#define per(i, r, l) for(int i = r; i >= (l); -- i)using namespace std;
typedef long long LL;
typedef double DB;
typedef pair<int, int> PII;
typedef pair<int, double> PID;
typedef pair<double, double> PDD;
template <typename T> void inline read(T &x) {int f = 1; x = 0; char s = getchar();while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();x *= f;
}int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
const int INF = 0x3f3f3f3f;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~int fun(int n)
{int res = 1;// i <= n / i -- why?:// 最多只会存在一个质因子 > sqrt(n), 两个的话 相乘 > n.// 当我们一直除最后n!=1,此时n就是那个大于sqrt(n)的质因子for(int i = 2; i <= n / i; i ++)if(n % i == 0){int cnt = 0;while(n % i == 0) n /= i, cnt ++;if(cnt % 2) res *= i; }if(n != 1) res *= n;return res;
}int main()
{ios;int n;cin >> n;map<int, int> mp;rep(i, 1, n){int res = fun(i);mp[res] ++;}LL ans = 0;for(auto x : mp) ans += x.y * x.y;cout << ans << endl;return 0;
}

E - Small d and k

题意:给定一个无向图,QQQ次询问。
每次询问:一个点走KKK次,能到达所有边的权值和

思路: 简单BFS or DFS
错因: 数组开小了…
至少开:2(双向边)∗M=3∗N2(双向边) * M = 3*N2(双向边)∗M=3∗N。

Code

// Problem: E - Small d and k
// Contest: AtCoder - AtCoder Beginner Contest 254
// URL: https://atcoder.jp/contests/abc254/tasks/abc254_e
// Memory Limit: 1024 MB
// Time Limit: 3500 ms
//
// Powered by CP Editor (https://cpeditor.org)/*
author: A Fei
*/
#include <bits/stdc++.h>#define x first
#define y second
#define pi acos(-1)
#define endl '\n'
#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define mem(x, a) memset(x, a, sizeof x)
#define pb(x) push_back(x)
#define rep(i, l, r) for(int i = l; i <= (r); ++ i)
#define per(i, r, l) for(int i = r; i >= (l); -- i)using namespace std;
typedef long long LL;
typedef double DB;
typedef pair<int, int> PII;
typedef pair<int, double> PID;
typedef pair<double, double> PDD;
template <typename T> void inline read(T &x) {int f = 1; x = 0; char s = getchar();while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();x *= f;
}int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
const int INF = 0x3f3f3f3f;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const int N = 6e5 + 10, M = 2 * N;
int h[N], ne[M], e[M], idx;
bool st[N];
int n, m;void add(int a, int b)
{ne[idx] = h[a], e[idx] = b, h[a] = idx ++;
}LL bfs(int x, int k)
{mem(st, false);queue<PII> q;q.push({x, 0});LL sum = 0;st[x] = true;while(q.size()){PII t = q.front();q.pop();int x = t.x, y = t.y;// depth ++;if(y <= k) sum += x;for(int i = h[x]; ~i; i = ne[i]){int j = e[i];if(!st[j] && y + 1 <= k) q.push({j, y + 1}), st[j] = true;}}return sum;
}int main()
{ios;mem(h, -1);cin >> n >> m;while(m --){int a, b;cin >> a >> b;add(a, b), add(b, a);}int q, x, k;cin >> q;while(q --){cin >> x >> k;// cout << x << k << endl;cout << bfs(x, k) << endl;}return 0;
}

F - Rectangle GCD

题意:给定两个序列:
A1,A2,A3,...,AnA_1,A_2,A_3, ... , A_nA1​,A2​,A3​,...,An​
B1,B2,B3,...,BnB_1,B_2,B_3, ... , B_nB1​,B2​,B3​,...,Bn​
给两个坐标:(a,b),(c,d)(a, b),(c, d)(a,b),(c,d),分别为矩阵左上角和右下角(矩阵:Ci,j=Ai+Bj矩阵:C_{i,j} = A_i + B_j矩阵:Ci,j​=Ai​+Bj​),询问该范围内矩阵的GCDGCDGCD。

思路:
首先一个序列:GCD(a1,a2,...,an)GCD(a_1, a_2,...,a_n)GCD(a1​,a2​,...,an​) = GCD(a1,a2−a1,...,an−an−1)GCD(a_1, a_2 - a_1,...,a_n - a_{n-1})GCD(a1​,a2​−a1​,...,an​−an−1​)
即:原序列的最大公约数 = 差分序列的最大公约数。

考虑矩阵任一行的数值:
Ai+Bj,Ai+Bj+1,Ai+Bj+2,Ai+Bj+3A_i+B_j,A_i+B_{j+1},A_i+B_{j+2},A_i+B_{j+3}Ai​+Bj​,Ai​+Bj+1​,Ai​+Bj+2​,Ai​+Bj+3​
做差分变为:
Ai+Bj,Bj+1−Bj,Bj+2−Bj+1,Bj+3−Bj+2A_i+B_j,B_{j+1} - B_{j},B_{j+2} - B_{j+1},B_{j+3} - B_{j + 2}Ai​+Bj​,Bj+1​−Bj​,Bj+2​−Bj+1​,Bj+3​−Bj+2​
可以发现我们消去了:AiA_iAi​
对于查询的矩阵:
黄色部分的GCDGCDGCD为:B的差分序列[b+1,d]B的差分序列[b+1,d]B的差分序列[b+1,d]的gcd1gcd_1gcd1​.

左边蓝色的GCDGCDGCD同理为:A的差分序列[a+1,c]A的差分序列[a+1,c]A的差分序列[a+1,c]的gcd2gcd_2gcd2​.
综上矩阵的gcdgcdgcd为:GCD(gcd1,gcd2,Aa+Bb−空白快)GCD(gcd_1,gcd_2,A_a+B_b-空白快)GCD(gcd1​,gcd2​,Aa​+Bb​−空白快)

故可以用两个线段树维护两个序列的差分序列的gcdgcdgcd。

Code:

// Problem: F - Rectangle GCD
// Contest: AtCoder - AtCoder Beginner Contest 254
// URL: https://atcoder.jp/contests/abc254/tasks/abc254_f
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)/*
author: A Fei
*/
#include <bits/stdc++.h>#define x first
#define y second
#define pi acos(-1)
#define endl '\n'
#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define mem(x, a) memset(x, a, sizeof x)
#define pb(x) push_back(x)
#define rep(i, l, r) for(int i = l; i <= (r); ++ i)
#define per(i, r, l) for(int i = r; i >= (l); -- i)using namespace std;
typedef long long LL;
typedef double DB;
typedef pair<int, int> PII;
typedef pair<int, double> PID;
typedef pair<double, double> PDD;
template <typename T> void inline read(T &x) {int f = 1; x = 0; char s = getchar();while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();x *= f;
}int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
const int INF = 0x3f3f3f3f;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const int N = 2e5 + 10;struct Node
{int l, r;int gcdd;
}tr_a[4 * N], tr_b[4 * N];int n, Q;
int a[N], b[N], da[N], db[N];int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}void pushup(Node tr[], int u)
{int l = u << 1, r = u << 1 | 1;tr[u].gcdd = gcd(tr[l].gcdd, tr[r].gcdd);
}void build(Node tr[], int t[], int u, int l, int r)
{tr[u] = {l, r};if(l == r){tr[u] = {l, l, t[l]};// cout << l << ' ' << r << ' ' << t[l] << endl;return ;}int mid = l + r >> 1;build(tr, t, u << 1, l, mid), build(tr, t, u << 1 | 1, mid + 1, r);pushup(tr, u);
}Node query(Node tr[], int u, int l, int r)
{if(l > r) return {0, 0, 0};if(l <= tr[u].l && tr[u].r <= r) return tr[u];int mid = tr[u].l + tr[u].r >> 1;if(r <= mid) return query(tr, u << 1, l, r);else if(l > mid) return query(tr, u << 1 | 1, l, r);else {Node left, right, res;left = query(tr, u << 1, l, r);right = query(tr, u << 1 | 1, l, r);res.gcdd = gcd(left.gcdd, right.gcdd);return res;}
}int main()
{ios;cin >> n >> Q;rep(i, 1, n) cin >> a[i];rep(i, 1, n) cin >> b[i];rep(i, 1, n) da[i] = a[i] - a[i - 1];rep(i, 1, n) db[i] = b[i] - b[i - 1];// rep(i, 1, n) cout << da[i] << ' ';// cout << endl;// rep(i, 1, n) cout << db[i] << ' ';// cout << endl;build(tr_a, da, 1, 1, n);build(tr_b, db, 1, 1, n);while(Q --){int r1, r2, c1, c2;cin >> r1 >> r2 >> c1 >> c2;int g1 = query(tr_b, 1, c1 + 1, c2).gcdd;int g2 = gcd(a[r1] + b[c1], query(tr_a, 1, r1 + 1, r2).gcdd);cout << abs(gcd(g1, g2)) << endl;// cout << a[r1] + b[c1] << ' ' << g1 << ' ' << g2 << endl;}return 0;
}

AtCoder Beginner Contest 254相关推荐

  1. AtCoder Beginner Contest 254 A~E 题解

    ABC254 A~E [A - Last Two Digits](https://atcoder.jp/contests/abc254/tasks/abc254_a) 题目大意 输入格式 输出格式 样 ...

  2. AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...

  3. AtCoder Beginner Contest 197 题解(A ~ F)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...

  4. AtCoder Beginner Contest 198 (A ~ F)题解

    目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...

  5. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

  6. AtCoder Beginner Contest 215 F - Dist Max 2

    AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi​,yi​),定义两点(xi,yi),(xj,yj)(x ...

  7. AtCoder Beginner Contest 215 E - Chain Contestant

    AtCoder Beginner Contest 215 E - Chain Contestant 给出一个只包括A~J的字符串,定义一种子序列为:在这个子序列中,相同的字符必定连续出现,求出这样的子 ...

  8. AtCoder Beginner Contest 204 F Hanjo 2

    AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...

  9. Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

    Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举 ...

最新文章

  1. requests从api中获取数据并存放到mysql中
  2. 合同的不含税与税额怎么算
  3. 在windows上搭建redis集群(Redis-Cluster)
  4. 初识GDI、GDI+
  5. vue2.0和better-scroll实现左右联动效果
  6. 【3dmax千千问】初学3dmax插件神器第18课|VRAY渲染教程|疯狂模渲大师用3dmax插件神器的扫描线渲染器该怎么表现效果图的写实效果?
  7. Windows开机出现Scaning and repairing错误
  8. 小公司个人技术成长路线思考
  9. Android - MTK系统源码结构
  10. 相见恨晚,真的很喜欢Udacity
  11. 经典黑白搭配 现代简约风格设计美学精神
  12. 网站判断是否是苹果系统和使用微信浏览器
  13. ArcGIS中如何计算多个点到特定线的最短距离
  14. 2014年360校园招聘笔试题,干货分享
  15. 【机器学习】Decision Tree 决策树算法详解 + Python代码实战
  16. 时钟服务器工作原理,Windows 时间服务的工作原理
  17. 【洛谷P2947】向右看齐
  18. WIFI驱动移植--udhcpc获取IP
  19. AMS1117 sot-223 稳压芯片的dxp库
  20. 常用9011-9018三极管参数

热门文章

  1. Linux虚拟网络编辑
  2. 个体值0和31差多少攻击_口袋妖怪努力值、个体值、觉醒力量讲解
  3. C语言经典习题之编写一个程序,找出1000以内所有的完数。
  4. 细数云课堂为那些用户带来的便捷体验
  5. 第二十三章 MySQL数据库 手册2 SQL语句
  6. python删除excel已存在的sheet
  7. Android沉浸式状态栏(透明系统状态栏)
  8. adams驱动旋转速度,轮子爬台阶Adams中驱动与扭矩的区别
  9. 视频直播app源码直播弹幕系统如何实现
  10. 白帽子漏洞提交众测平台(网站链接)