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的值. 有多少种填法,使得数组每个位置相 ...
随机推荐
- iOS调用系统相册、相机 显示中文标题
解决手机语言已经设置显示中文 在调用系统相册.相机界面 时显示英文问题, 在 info.plist里面添加Localized resources can be mixed YES 表 ...
- linux安装nagios客户端
( 安装到 被监控的机器上)新增用户和组 useradd nagiosgroupadd nagcmd usermod -a -G nagcmd nagios (如果安装中报没有c编译器,就 yum i ...
- Python 转义字符
转义字符 说明 \ 用在一行的末尾,表示续行符 \r 回车 \n 换行符 \\ 打印反斜杠 \' 打印单引号 \" 打 ...
- HttpPost导包遇到的问题
直接在当前项目 build.gradle文件修改如下 android { useLibrary 'org.apache.http.legacy' compileSdkVersion 24 buildT ...
- 如何打开或关闭windows的测试模式
百度经验:jingyan.baidu.com windows的测试模式就如同字面意思一样,是一个测试用的模式.这个模式的标志主要在有非官方驱动或系统关键文件运行时显示.例如安装了大内存补丁(32位系统 ...
- 【PHP】 php实现字符串反转:支持中英文
strrev 函数对英文很好用,直接可以实现字符串翻转 但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的. PHP提供了mb_类的函数实现不同编码. ...
- centos7 ubuntu14 添加sudo 权限 ,禁用每次sudo 需要输入密码
安装完centos7后,默认没有启用sudo,首先应该是对sudo进行设置.sudo的作用就是使当前非root用户在使用没有权限的命令 时,直接在命令前加入sudo,在输入自己当前用户的密码就可以完成 ...
- MyBatis——Mapper XML 文件
Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...
- $.when()方法监控ajax请求获取到的数据与普通ajax请求回调获取到的数据的不同
1.$.when(ajax).done(function(data)}); 2.$.ajax().done(function(data){}); 1中的data被封装进一个对象[data, " ...
- CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记
weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...