Codeforces Round #533 (Div. 2) Solution
A. Salem and Sticks
签.
- #include <bits/stdc++.h>
- using namespace std;
- #define N 1010
- int n, a[N];
- int work(int x)
- {
- int res = ;
- for (int i = ; i <= n; ++i)
- res += max(, abs(x - a[i]) - );
- return res;
- }
- int main()
- {
- while (scanf("%d", &n) != EOF)
- {
- for (int i = ; i <= n; ++i) scanf("%d", a + i);
- int Min = (int)1e9, pos = -;
- for (int i = ; i <= ; ++i)
- {
- int tmp = work(i);
- if (tmp < Min)
- {
- Min = tmp;
- pos = i;
- }
- }
- printf("%d %d\n", pos, Min);
- }
- return ;
- }
B. Zuhair and Strings
签.
- #include <bits/stdc++.h>
- using namespace std;
- #define N 200010
- int n, k;
- char s[N];
- int work(char c)
- {
- int res = ;
- int tmp = ;
- for (int i = ; i <= n; ++i)
- {
- if (s[i] != c) tmp = ;
- else
- {
- ++tmp;
- if (tmp == k)
- {
- ++res;
- tmp = ;
- }
- }
- }
- return res;
- }
- int main()
- {
- while (scanf("%d%d", &n, &k) != EOF)
- {
- scanf("%s", s + );
- int res = ;
- for (int i = 'a'; i <= 'z'; ++i)
- res = max(res, work(i));
- printf("%d\n", res);
- }
- return ;
- }
C. Ayoub and Lost Array
签.
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define N 200010
- const ll MOD = (ll)1e9 + ;
- int n, l, r;
- ll a[], f[N][];
- int main()
- {
- while (scanf("%d%d%d", &n, &l, &r) != EOF)
- {
- memset(a, , sizeof a);
- while (l % && l <= r)
- {
- a[l % ]++;
- ++l;
- }
- while (r % && l <= r)
- {
- a[r % ]++;
- --r;
- }
- if (l <= r)
- {
- ++a[];
- int tmp = (r - l) / ;
- a[] += tmp;
- a[] += tmp;
- a[] += tmp;
- }
- memset(f, , sizeof f);
- f[][] = ;
- for (int i = ; i <= n; ++i)
- {
- f[i][] = (f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD) % MOD;
- f[i][] = (f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD) % MOD;
- f[i][] = (f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD) % MOD;
- }
- printf("%lld\n", f[n][]);
- }
- return ;
- }
D. Kilani and the Game
签.
- #include <bits/stdc++.h>
- using namespace std;
- #define N 1010
- int n, m, p;
- char G[N][N];
- int s[];
- struct node
- {
- int x, y, step;
- node () {}
- node (int x, int y, int step) : x(x), y(y), step(step) {}
- };
- queue <node> q[];
- bool stop()
- {
- for (int i = ; i <= p; ++i) if (!q[i].empty())
- return false;
- return true;
- }
- int Move[][] =
- {
- -, ,
- , ,
- ,-,
- , ,
- };
- bool ok(int x, int y)
- {
- if (x < || x > n || y < || y > m || G[x][y] != '.') return false;
- return true;
- }
- void BFS(int id, int cnt)
- {
- while (!q[id].empty())
- {
- int x = q[id].front().x;
- int y = q[id].front().y;
- int step = q[id].front().step;
- //printf("%d %d %d %d\n", x, y, id, step);
- if (step / s[id] >= cnt) return;
- q[id].pop();
- for (int i = ; i < ; ++i)
- {
- int nx = x + Move[i][];
- int ny = y + Move[i][];
- if (ok(nx, ny))
- {
- G[nx][ny] = id + '';
- q[id].push(node(nx, ny, step + ));
- }
- }
- }
- }
- int main()
- {
- while (scanf("%d%d%d", &n, &m, &p) != EOF)
- {
- for (int i = ; i <= p; ++i) scanf("%d", s + i);
- for (int i = ; i <= n; ++i) scanf("%s", G[i] + );
- for (int i = ; i <= p; ++i) while (!q[i].empty()) q[i].pop();
- for (int i = ; i <= n; ++i) for (int j = ; j <= m; ++j) if (isdigit(G[i][j]))
- q[G[i][j] - ''].push(node(i, j, ));
- int cnt = ;
- while ()
- {
- for (int i = ; i <= p; ++i) BFS(i, cnt);
- ++cnt;
- if (stop()) break;
- }
- int ans[];
- memset(ans, , sizeof ans);
- for (int i = ; i <= n; ++i) for (int j = ; j <= m; ++j) if (isdigit(G[i][j]))
- ++ans[G[i][j] - ''];
- //for (int i = 1; i <= n; ++i) printf("%s\n", G[i] + 1);
- for (int i = ; i <= p; ++i) printf("%d%c", ans[i], " \n"[i == p]);
- }
- return ;
- }
E. Helping Hiasat
Upsolved.
题意:
两种操作
- 更改自己的handle
- 伙伴查询handle
如果一个伙伴在每次查询时显示的都是自己名字,那么他就会开心
问 最多可以让多少人开心
思路:
法一:
一张图的最大独立集是选出一个点集,使得任意两点不相邻
一张图的最大团是选出一个点集,使得任意两点之间有边相连
一张无向图的补图的最大图就是原图的最大独立集
我们发现这道题两个1之间的所有点都是不能一起happy的,那我们给他们两两之间连上边
然后求补图的最大团即可
- #include <bits/stdc++.h>
- using namespace std;
- #define N 110
- int n, m, t;
- int g[N][N];
- int dp[N];
- int stk[N][N];
- int mx;
- map <string, int> mp;
- int get(string s)
- {
- if (mp.find(s) != mp.end()) return mp[s];
- else mp[s] = t++;
- return mp[s];
- }
- int DFS(int n, int ns, int dep)
- {
- if (ns == )
- {
- mx = max(mx, dep);
- return ;
- }
- int i, j, k, p, cnt;
- for (i = ; i < ns; ++i)
- {
- k = stk[dep][i];
- cnt = ;
- if (dep + n - k <= mx)
- return ;
- if (dep + dp[k] <= mx)
- return ;
- for (j = i + ; j < ns; ++j)
- {
- p = stk[dep][j];
- if (g[k][p])
- stk[dep + ][cnt++] = p;
- }
- DFS(n, cnt, dep + );
- }
- return ;
- }
- int clique(int n)
- {
- int i, j, ns;
- for (mx = , i = n - ; i >= ; --i)
- {
- for (ns = , j = i + ; j < n; ++j)
- {
- if (g[i][j])
- stk[][ns++] = j;
- }
- DFS(n, ns, );
- dp[i] = mx;
- }
- return mx;
- }
- vector <int> vec;
- void add()
- {
- vec.erase(unique(vec.begin(), vec.end()), vec.end());
- for (auto u : vec) for (auto v : vec)
- g[u][v] = g[v][u] = ;
- vec.clear();
- }
- int main()
- {
- while (scanf("%d%d", &n, &m) != EOF)
- {
- t = ;
- mp.clear();
- for (int i = ; i < m; ++i) for (int j = ; j < m; ++j) g[i][j] = ;
- []()
- {
- int op; char s[];
- for (int nn = ; nn <= n; ++nn)
- {
- scanf("%d", &op);
- if (op == )
- add();
- else
- {
- scanf("%s", s + );
- vec.push_back(get(s + ));
- }
- }
- }();
- add();
- for (int i = ; i < m; ++i) g[i][i] = ;
- //for (int i = 1; i <= m; ++i) for (int j = 1; j <= m; ++j) printf("%d %d %d\n", i, j, g[i][j]);
- printf("%d\n", clique(m));
- }
- return ;
- }
法二:
$m = 40, 可以折半状压,再合起来$
考虑妆压的时候要从子集转移到超集,可以通过$dp上去$
$vp的时候想到折半状压,但是当时是枚举子集来转移,复杂度大大增加..$
- #include <bits/stdc++.h>
- using namespace std;
- #define N 50
- #define M 1100010
- int n, m, t;
- int G[N][N];
- map <string, int> mp;
- int get(string s)
- {
- if (mp.find(s) != mp.end()) return mp[s];
- else mp[s] = ++t;
- return mp[s];
- }
- vector <int> vec;
- void add()
- {
- vec.erase(unique(vec.begin(), vec.end()), vec.end());
- for (auto u : vec) for (auto v : vec)
- G[u][v] = ;
- vec.clear();
- }
- int f[M], g[M];
- int main()
- {
- while (scanf("%d%d", &n, &m) != EOF)
- {
- t = ; mp.clear();
- memset(G, , sizeof G);
- int op; char s[N];
- for (int nn = ; nn <= n; ++nn)
- {
- scanf("%d", &op);
- if (op == ) add();
- else
- {
- scanf("%s", s + );
- vec.push_back(get(s + ));
- }
- }
- add();
- for (int i = ; i <= m; ++i)
- G[i][i] = ;
- int s1 = m / , s2 = m - s1;
- for (int i = ; i < ( << s1); i <<= ) f[i] = ;
- for (int i = ; i < ( << s2); i <<= ) g[i] = ;
- f[] = g[] = ;
- for (int i = ; i < ( << s1); ++i)
- {
- for (int j = ; j < s1; ++j) if (!((i >> j) & ))
- {
- int flag = ;
- for (int k = ; k < s1; ++k) if (((i >> k) & ) && G[k + ][j + ])
- {
- flag = ;
- break;
- }
- f[i | ( << j)] = max(f[i | ( << j)], f[i] + flag);
- }
- }
- for (int i = ; i < ( << s2); ++i)
- {
- for (int j = ; j < s2; ++j) if (!((i >> j) & ))
- {
- int flag = ;
- for (int k = ; k < s2; ++k) if (((i >> k) & ) && G[s1 + k + ][s1 + j + ])
- {
- flag = ;
- break;
- }
- g[i | ( << j)] = max(g[i | ( << j)], g[i] + flag);
- }
- }
- int res = ;
- for (int i = ; i < ( << s1); ++i)
- {
- int s3 = ( << s2) - ;
- for (int j = ; j < s1; ++j) if ((i >> j) & )
- {
- for (int k = ; k < s2; ++k) if (G[j + ][s1 + k + ] && ((s3 >> k) & ))
- s3 ^= ( << k);
- }
- res = max(res, f[i] + g[s3]);
- }
- printf("%d\n", res);
- }
- return ;
- }
法三:
为什么随机也行啊,能不能证明啊,喵喵喵..
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define N 50
- int n, m, t;
- int G[N][N], a[N];
- ll f[N];
- map <string, int> mp;
- int get(string s)
- {
- if (mp.find(s) != mp.end()) return mp[s];
- else mp[s] = ++t;
- return mp[s];
- }
- vector <int> vec;
- void add()
- {
- vec.erase(unique(vec.begin(), vec.end()), vec.end());
- for (auto u : vec) for (auto v : vec)
- G[u][v] = ;
- vec.clear();
- }
- int main()
- {
- while (scanf("%d%d", &n, &m) != EOF)
- {
- t = ; mp.clear();
- memset(G, , sizeof G);
- int op; char s[N];
- for (int nn = ; nn <= n; ++nn)
- {
- scanf("%d", &op);
- if (op == ) add();
- else
- {
- scanf("%s", s + );
- vec.push_back(get(s + ));
- }
- }
- add();
- for (int i = ; i <= m; ++i)
- G[i][i] = ;
- int res = ;
- for (int i = ; i <= m; ++i) a[i] = i;
- for (int i = ; i <= m; ++i)
- {
- f[i] = ;
- for (int j = ; j <= m; ++j) if (G[i][j])
- f[i] |= (1ll << (j - ));
- }
- for (int t = ; t <= ; ++t)
- {
- random_shuffle(a + , a + + m);
- ll g = ; int tmp = ;
- for (int i = ; i <= m; ++i) if (((g >> (a[i] - )) & 1ll) == )
- {
- g |= f[a[i]];
- ++tmp;
- }
- res = max(res, tmp);
- }
- printf("%d\n", res);
- }
- return ;
- }
Codeforces Round #533 (Div. 2) Solution的更多相关文章
- Codeforces Round #533 (Div. 2)题解
link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...
- Codeforces Round #466 (Div. 2) Solution
从这里开始 题目列表 小结 Problem A Points on the line Problem B Our Tanya is Crying Out Loud Problem C Phone Nu ...
- 老年OIer的Python实践记—— Codeforces Round #555 (Div. 3) solution
对没错下面的代码全部是python 3(除了E的那个multiset) 题目链接:https://codeforces.com/contest/1157 A. Reachable Numbers 按位 ...
- Codeforces Round #545 (Div. 1) Solution
人生第一场Div. 1 结果因为想D想太久不晓得Floyd判环法.C不会拆点.E想了个奇奇怪怪的set+堆+一堆乱七八糟的标记的贼难写的做法滚粗了qwq靠手速上分qwqqq A. Skyscraper ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- Codeforces Round 500 (Div 2) Solution
从这里开始 题目地址 瞎扯 Problem A Piles With Stones Problem B And Problem C Photo of The Sky Problem D Chemica ...
- Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】
传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...
- Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】
传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...
- Codeforces Round #533(Div. 2) C.Ayoub and Lost Array
链接:https://codeforces.com/contest/1105/problem/C 题意: 给n,l,r. 一个n长的数组每个位置可以填区间l-r的值. 有多少种填法,使得数组每个位置相 ...
随机推荐
- /etc/docker/key.json
/etc/docker/key.json 描述信息: This is the dockerd key for TLS connections.in web format, that docker us ...
- Python 使用正则表达式匹配电子邮箱
如下: In [1]: import re In [2]: email = "1210640219@qq.com" In [3]: regular = re.compile(r'[ ...
- 关于MCU的烧录,下载与其他接口的比较(一)
今天呢,犯了一个很严重的错误,我不知道这会产生什么样的影响,但我知道,如果我以后再没有具体的了解,仔细认真地观察,认证,只会滑到无底的深渊.做技术来不得半点虚假,切记一知半解,凡事都要弄得清楚明白,认 ...
- ubuntu的安装方法
Ubuntu 是一个启动速度超快.界面友好.安全性好的开源操作系统,它由全球顶尖开源软件专家开发,适用于桌面电脑.笔记本电脑.服务器以及上网本等,并且它可以永久免费使用.如果你厌倦了Windows,如 ...
- Day04_数据类型占位符使用及进制转换
2013年10月09日 星期三 10时03分51秒 回顾: 1.变量 2.scanf标准函数 字符类型是一种数据类型 在C语言程序中字符类型用char表示 字符类型中包含了256个不同的字符,例如 ...
- web基础----->模板引擎Velocity的使用(二)
这里面是关于velocity的一些用法,比较基础的使用.愿你生命中有够多的云翳,来造成一个美丽的黄昏. velocity生成javaBean 一.定义一个简单的bean类 public class C ...
- Fragments (官方文档中文版)
转 http://blog.sina.com.cn/s/blog_69a4fbd70100r5j4.html 概述 Fragment表现Activity中UI的一个行为或者一部分.可以将多个f ...
- CCNP
CCNP全称是:Cisco Certified Network Professional——思科认证网络高级工程师.CCNP专业人员表示通过认证的人员具有丰富的网络知识.获得CCNP认证的专业人员可以 ...
- Eclipse打包Egret App (Egret4.1.0)
Egret官方提供eclipse和androidstudio打包. 这里使用eclipse. 1 下载配置android环境 2 Egret打包App 3 Eclipse设置 4 Eclipse调试 ...
- Android自动读取短信验证码
Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...