传送门

A. Cards

记录一下出现的个数就行。

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5 + 5; char s[N];
int cnt[26]; void run() {
cin >> s + 1;
int n = strlen(s + 1);
memset(cnt, 0, sizeof(cnt));
for(int i = 1; i <= n; i++) {
cnt[s[i] - 'a']++;
}
int Min = min(cnt['o' - 'a'], cnt['e' - 'a']);
Min = min(Min, cnt['n' - 'a']);
for(int i = 1; i <= Min; i++) cout << 1 << ' ';
for(int i = 1; i <= cnt['z' - 'a']; i++) cout << 0 << ' ';
cout << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
int n; while(cin >> n) run();
return 0;
}

B. Multiplication Table

题意:

存在一个序列\(a\),现在给出一个矩阵\(M\),\(M_{ij}=a_i\cdot a_j\)。但现在序列和矩阵主对角线上面的元素遗失了。

现在要求\(a\)序列,数据保证有解。

思路:

  • 容易发现,\(a_1\)确定后,后面的也就能依次确定了。
  • 考虑怎么确定\(a_1\),枚举显然不行,如果只是去猜测一个值检验,时间复杂度也不能承受。
  • 容易发现\(a_1\cdot a_2,a_1\cdot a_3,a_2\cdot a_3\)的值我们都知道,那么就可以求出\(a_1^2\),那么就可以直接得到序列了。

代码如下:

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e3 + 5; int n;
int a[N][N]; void run() {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
int ab = a[1][2], ac = a[1][3], bc = a[2][3];
ll a2 = 1ll * ab * ac / bc;
int a1 = sqrt(a2 + 0.5);
cout << a1 << ' ';
for(int i = 2; i <= n; i++) cout << a[1][i] / a1 << ' ';
cout << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n) run();
return 0;
}

C. Substring Game in the Lesson

挺水的一个题,记录一下前面最小的就行。

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 5e5 + 5;
char s[N];
void First() {
cout << "Ann" << '\n';
}
void Second() {
cout << "Mike" << '\n';
} void run() {
int n = strlen(s + 1);
int Min = 30;
for(int i = 1; i <= n; i++) {
if(Min >= s[i] - 'a') Second();
else {
First();
}
Min = min(Min, s[i] - 'a');
}
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> s + 1) run();
return 0;
}

D. Alex and Julian

题意:

给出一个集合\(B\),对于集合中的每个\(b_i\),将对所有的\(i,j\)满足\(|i-j|=b_i\)连边。

现在问最少去掉哪些数使得最终得到的为二分图。

思路:

感觉挺巧妙的,现在假设\(a,b,a<b\)这两个数发生了碰撞。

那么有\(xa=yb=t\cdot lcm(a,b)=t\cdot \frac{ab}{gcd(a,b)}\)。

那么就有:\(x=\frac{bt}{gcd(a,b)},y=\frac{at}{gcd(a,b)}\)。

因为\(t\)为固定的,所以分析下即可得到,要满足\(x+y\)不为奇数,\(\frac{a}{gcd(a,b)},\frac{b}{gcd(a,b)}\)要同奇偶。

因为这里有个\(gcd(a,b)\)有点烦,我们现在考虑将\(a,b\)表示为乘积的形式:考虑\(a=2^ip,b=2^jq\),这里\(p,q\)为奇数。

那么\(gcd(a,b)=2^{min(i,j)}gcd(p,q)\),这里易知\(gcd(p,q)\)也为奇数,假设\(i<j\),那么现在\(\frac{a}{gcd(a,b)}=\frac{p}{gcd(p,q)},\frac{b}{gcd(a,b)}=\frac{2^{j-i}q}{gcd(p,q)}\)。

那么答案马上就出来啦,可以发现当\(i=j\)时,奇数除以一个奇数一定也为一个奇数;否则,第一个式子为奇数,第二个式子分子为偶数,分母为奇数,整个式子一定为偶数,就不同奇偶了。

所以我们按照\(2\)的次幂进行划分,最后贪心就行了。

感觉还是挺巧妙的,将\(a,b\)换成\(2^i\)与另外一个数的乘积怎么想得到啊QAQ难道因为\(2\)比较特殊?

详见代码:

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 2e5 + 5; int n;
ll a[N], b[N]; void run() {
vector <ll> v[66];
for(int i = 1; i <= n; i++) {
cin >> a[i]; b[i] = a[i];
int cnt = 0;
while(a[i] % 2 == 0) {
++cnt; a[i] /= 2;
}
v[cnt].push_back(b[i]);
}
int Max = -1, p;
for(int i = 0; i <= 60; i++) {
if(sz(v[i]) > Max) {
Max = sz(v[i]);
p = i;
}
}
int ans = n - Max;
cout << ans << '\n';
for(int i = 0; i <= 60; i++) {
if(i == p) continue;
for(auto it : v[i]) cout << it << ' ';
}
if(ans) cout << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n) run() ;
return 0;
}

E. Tourism

题意:

给出一个无向图,每个点都有相应权值。现在从起点\(s\)出发,不同连续经过一条边两次,问最多可以获得多少权值。

思路:

  • 容易发现,如果走到了类似于一条链上的东西,那就永远无法回头了QAQ。
  • 所以考虑从度为\(1\)的点往里类似于拓扑排序那样来标记点,同时记录一下路径,用来处理特殊情况。
  • 显然最后那些没有标记的点都要走,之后贪心考虑一条路径权值最大的走就行。
  • 注意一下为一棵树的特殊情况,上述算法不能处理。

有一点细节,代码中我用了一个\(nxt\)数组来记录下一个位置,但是有一个问题,一个点的出度有多个点怎么办?

稍微思考一下就可以发现,这种情况不会发生,如果发生了,就成功到达目的地了~否则,就是在一条符合要求的链上面走。

另外注意走过的点权值记为0。

详见代码:

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 2e5 + 5; int n, m;
int w[N];
struct Edge{
int v, next;
}e[N << 1];
int head[N], tot;
void adde(int u, int v) {
e[tot].v = v; e[tot].next= head[u]; head[u] = tot++;
}
int d[N], nxt[N];
ll dis[N];
bool vis[N];
void dfs(int u) {
vis[u] = 1;
for(int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].v;
if(!vis[v]) {
dis[v] = dis[u] + w[v];
dfs(v);
}
}
}
void run() {
for(int i = 0; i <= n; i++) head[i] = -1; tot = 0;
for(int i = 1; i <= n; i++) cin >> w[i], d[i] = 0;
for(int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
adde(u, v); adde(v, u);
++d[u], ++d[v];
}
int s; cin >> s;
for(int i = 1; i <= n; i++) vis[i] = false, dis[i] = 0;
if(m == n - 1) {
dis[s] = w[s];
dfs(s);
cout << *max_element(dis + 1, dis + n + 1) << '\n';
return;
}
queue <int> q;
for(int i = 1; i <= n; i++) if(d[i] == 1) q.push(i);
while(!q.empty()) {
int u = q.front(); q.pop();
vis[u] = 1;
for(int i = head[u]; i != -1; i = e[i].next) {
int v = e[i].v;
if(vis[v]) continue;
nxt[u] = v;
if(--d[v] == 1) {
q.push(v);
}
}
}
ll ans = 0;
while(vis[s]) {
ans += w[s]; w[s] = 0;
s = nxt[s];
}
for(int i = 1; i <= n; i++) {
if(!vis[i]) {
ans += w[i]; w[i] = 0;
}
}
for(int i = 0; i <= n; i++) vis[i] = 0;
dfs(s);
ans += *max_element(dis + 1, dis + n + 1);
cout << ans << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n >> m) run();
return 0;
}

Codeforces Round #586 (Div. 1 + Div. 2)的更多相关文章

  1. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  2. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  3. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  4. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  5. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  6. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  8. Educational Codeforces Round 39 (Rated for Div. 2) G

    Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...

  9. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

  10. Educational Codeforces Round 60 (Rated for Div. 2) 题解

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

随机推荐

  1. 头条小视频和西瓜视频signature签名算法

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 "分析今日头条内小视频和西瓜视频分享后浏览器打开所用的signature签名算法." 上月写的一篇关于使用微信的wxid加好友的文章, ...

  2. Abusing SUDO Advance for Linux Privilege Escalation

    Index What is SUDO? Scenario. Sudoer FIle Syntax. Exploiting SUDO zip tar strace tcpdump nmap scp ex ...

  3. JS PopupAlert

    JS PopupAlert 可以在 JavaScript 中创建三种消息框:警告框.确认框.提示框. 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行 ...

  4. c++ 拷贝构造函数(重点在内含指针的浅拷贝和深拷贝)

    今天同事问了一个关于拷贝构造函数的问题,类中包含指针的情况,今天就来说说c++的拷贝构造函数. c++的拷贝构造函数是构造函数的一种,是对类对象的初始化,拷贝构造函数只有一个参数就是本类的引用. 注意 ...

  5. mysql与oracle的语法对比

    数据类型 编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型:MYSQL ...

  6. ElasticSearch: SearchContextMissingException[No search context found for id [173690]]

    这个原因是scroll的时间设置不够久,设久一些就可以了. ----------------------------------- 原文:https://www.cnblogs.com/chenmz1 ...

  7. (办公)记事本_Linux目录和文件都能操作的命令

    参考谷粒学院Linux:http://www.gulixueyuan.com/course/300/task/7082/show .cp 1.1.作用主要是拷贝,可以拷贝文件或者目录. 1.2.语法: ...

  8. 004.Windows Server 故障转移群集 (WSFC)简介

    一 WSFC 简介 1.1 WSFC 概述 “Windows Server 故障转移群集”(WSFC) 群集是一组独立的服务器,它们共同协作以提高应用程序和服务的可用性.SQL Server 2012 ...

  9. 12. java ArrayList类

    一.ArrayList定义 ​ java.util.ArrayList是大小可变的数组的实现,存储在内的数据成为元素.此类提供一些方法来操作内部存储的元素.ArrayList中可不断添加元素,其大小也 ...

  10. pytorch 中改变tensor维度的几种操作

    具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...