秦皇岛2020CCPC A,E,F,G,I,K

A. A Greeting from Qinhuangdao

知识点:简单题

复杂度:\(O(logn)\)

#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
template<class T> using vc = vector<T>; void solve()
{
ll n, m;
cin >> n >> m;
ll f = n * (n - 1);
ll g = (m + n) * (m + n - 1);
ll gc = __gcd(f, g);
f /= gc;
g /= gc;
cout << f << '/' << g << endl;
} signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T)
{
cout << "Case #" << i << ": ";
solve();
}
}

E. Exam Results

知识点:贪心

复杂度:\(O(nlogn+n)\)

这题我很快就有了思路,但是只是在脑海中过了一遍,其实少考虑了一些情况,所以直接WA了一发

然后debug时看到一个变量爆 \(int\) 了,以为是这里错了,又WA一发,

最后还是在队友的帮助下考虑到了错误的情况,属实不应该交的那么快

我们将所有的分数和对应的人放在一起,按分数为权值排序,然后枚举最大值,

此时我们能得到及格线 \(p\%*max\) 用双指针就能快速得到有多少个人及格,

需要注意的是及格线 \(p\%*max\) 要上取整,并且枚举的最大值要合法[1]


#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define int ll
#define pii pair<int,int>
#define pll pair<ll,ll>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>; const int N = 2e5 + 5; pll s[N * 2]; void solve()
{
int n, p;
cin >> n >> p;
vc<int> st(n + 1), st2(n + 1);
rep(i, 1, n)
{
ll a, b; cin >> a >> b;
s[i * 2 - 1] = { a,i };
s[i * 2] = { b,i };
}
sort(s + 1, s + n + n + 1);
int cnt = 0, ans = 0, tmp = 0;
ll L = 1, fx;
rep(i, 1, n * 2)
{
fx = s[i].fi * p;
if (st2[s[i].se]++ == 0) tmp++;
if (st[s[i].se]++ == 0) cnt++;
while (s[L].fi * 100 < fx)
{
if (--st[s[L].se] == 0) cnt--;
L++;
}
if(tmp == n) ans = max(ans, cnt);
}
cout << ans << endl;
} signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T)
{
cout << "Case #" << i << ": ";
solve();
}
}

F. Friendly Group

知识点:并查集

复杂度:\(O(n)\)

这题是队友A的,但是由于我少清空了w数组WA了一发

我真该死啊.jpg

我们观察,当一个朋友关系连接两个连通块时,不看该边时,这两个连通块至少是两颗树,所以当我让这两个连通块连接时,重新选择连通块时,不会让这两个连通块的答案更少[2],所以每一条边都必连,然后枚举连通块判读是否选取即可


#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<ll,ll>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>; const int N = 3e5 + 5; int f[N], w[N], sz[N];
void init(int n)
{
rep(i, 0, n) f[i] = i, sz[i] = 1, w[i] = 0;
} int find(int u)
{
if (u == f[u]) return u;
return f[u] = find(f[u]);
} void unite(int u, int v)
{
int fu = find(u), fv = find(v);
if (fu == fv) w[fu]++;
else
{
w[fv] += w[fu] + 1;
sz[fv] += sz[fu];
f[fu] = fv;
}
} void solve()
{
int n, m;
cin >> n >> m;
init(n);
rep(i, 1, m)
{
int u, v;
cin >> u >> v;
unite(u, v);
}
ll ans = 0;
rep(i, 1, n) if (find(i) == i)
{
if (w[i] > sz[i]) ans += w[i] - sz[i];
}
cout << ans << endl;
} signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T)
{
cout << "Case #" << i << ": ";
solve();
}
}

G. Good Number

知识点:简单题

复杂度:\(O(log^2n)\)

这题有点小恶心,注意判断边界即可


#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define int ll
#define pii pair<int,int>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>; const int N = 2e5 + 5;
const int mod = 1e9 + 7; ll ksm(ll x, int n)
{
ll ret = 1;
while (n)
{
if (n & 1) ret = ret * x;
n >>= 1;
x = x * x % mod;
}
return ret;
} void solve()
{
int n, k;
cin >> n >> k;
if (k == 1) cout << n << endl;
else
{
ll x = (ll)pow(2, log2(n) / k), ans = 0;
rep(i, 1, x)
{
if (i == x) ans += (n - ksm(i, k)) / i + 1;
else ans += (ksm(i + 1, k) - ksm(i, k) - 1) / i + 1;
}
cout << ans << endl;
}
} signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T)
{
cout << "Case #" << i << ": ";
solve();
}
}

I. Interstellar Hunter

知识点:线性代数

复杂度:\(O(Qlog(x+y))\)

只要能想到题解中的 任意时刻,能到达的点集可使用两个基向量表示,该题就很简单了

简单模拟下,乱搞就过了,可以让其中一个基向量平行与x轴或者y轴,可以减少很多情况


#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<ll,ll>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>; void solve()
{
int n; cin >> n;
pll a = { 0,0 }, b = { 0,0 };
ll ans(0);
rep(i, 1, n)
{
ll op, x, y, w;
cin >> op >> x >> y;
if (op == 1) // 操作1
{
while (x)
{
ll d = a.fi / x;
a.fi -= d * x; a.se -= d * y;
swap(x, a.fi); swap(y, a.se);
}
if (y) b.se = __gcd(b.se, abs(y));
if (b.se) a.se %= b.se;
}
else // 操作2
{
cin >> w;
if (a.fi)
{
ll d = x / a.fi;
x -= d * a.fi; y -= d * a.se;
}
if (b.se) y %= b.se;
if (!x && !y) ans += w;
}
}
cout << ans << endl;
} signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T)
{
cout << "Case #" << i << ": ";
solve();
}
}

K. Kingdom's Power

知识点:树形dp

复杂度:\(O(nlogn)\)

头一次被卡常,2s时限,1800ms过的,一开始使用vector开空间有个小常数T了

对于每一个点来说,我们按照子树的最大深度进行排序,

除了去第一颗子树的士兵一定是从根节点来的,

否则我们需要考虑去当前子树的士兵是从根节点来的还是上一颗子树的最大深度来的

简单的都不像树形dp,有点像套着树形dp的贪心


#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define int ll
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>; const int N = 1e6 + 5; vc<int> h[N];
int len[N], d[N]; void dfs(int u)
{
for (auto v : h[u])
{
d[v] = d[u] + 1;
dfs(v);
len[u] = max(len[u], len[v] + 1);
}
} bool cmp(int a, int b) { return len[a] < len[b]; } ll ans = 0;
void dfs2(int u)
{
sort(h[u].begin(), h[u].end(), cmp);
int lim = h[u].size();
if (lim) dfs2(h[u][0]);
rep(i, 1, lim - 1)
{
ans += min(d[u], len[h[u][i - 1]] + 1);
dfs2(h[u][i]);
}
} void solve()
{
int n; cin >> n;
rep(i, 1, n)
{
h[i].clear();
len[i] = d[i] = 0;
}
ans = n - 1;
rep(i, 2, n)
{
int f; cin >> f;
h[f].push_back(i);
}
dfs(1);
dfs2(1);
cout << ans << endl;
} signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T)
{
cout << "Case #" << i << ": ";
solve();
}
}

  1. 当一个人的两个分数都大于此时的最大值时,该最大值不合法

  2. 如果另一个连通块是树(树有n个点,n-1条边),则该连通块的权值会+1+(n-1)-n,如果有更多的边时,答案会更优

秦皇岛2020CCPC补题的更多相关文章

  1. hdu5017:补题系列之西安网络赛1011

    补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...

  2. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  3. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  4. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  5. [数]补题ver.

    上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...

  6. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  7. ICPC南京补题

    由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...

  8. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  9. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  10. 【cf补题记录】Codeforces Round #607 (Div. 2)

    比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...

随机推荐

  1. KingbaseES TOAST存储方式

    KingbaseES为"大字段"的物理存储提供了TOAST功能,通过合适的配置策略能够减少IO次数和扫描块数,进而提升查询速度. TOAST:The Oversized-Attri ...

  2. 使用Kali的wifite和aircrack-ng联合破解wifi密码

    准备材料 有kali的虚拟机,这里推荐VM 一个超级便宜的USB无线网卡,很便宜三十几块钱 一个靠谱的WPA密码字典(关于字典文件,我这里整理了好多,可联系我.QQ:1213456261) 1.运行k ...

  3. jmeter性能测试之正则提取响应头或者响应体

    准备工作做好,先发送请求 然后察看结果树中的响应消息 比如我们要提取这个cookie,先调试一下,看能不能提取到 看蓝色的线条,我们提取到了,然后我们把这句话写入到后置处理器中的正则表达式提取里 再次 ...

  4. 优化过的containerd配置文件:config.toml

    disabled_plugins = [] imports = [] oom_score = 0 plugin_dir = "" required_plugins = [] roo ...

  5. MySQL读写分离之——ProxySQL

    文章转载自:https://blog.csdn.net/u012280685/article/details/113520692?spm=1001.2014.3001.5501 实现一个简单的读写分离 ...

  6. Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (二)

  7. 原生Redis跨数据中心双向同步优化实践

    一.背景 公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度.需要保证多数据中心容灾或者实现用户就近访问的话,需要各个数据中心拥 ...

  8. 关于pwd命令小技巧-确认当前工作目录的绝对路径中是否包含软链接目录名

    Linux中任何一个命令,当你用心研究到深处时,也许总能有着新的发现或者有趣的用途,如下方的pwd命令 对于pwd命令,大家都知道是用于打印当前的工作目录路径,而且是绝对路径 pwd命令两个选项的,默 ...

  9. C#实现登录某web进而获取其token数据

    实习在学C#,记录一下学习过程! 首先是需求描述(基于C#的.net core MVC实现): User: Resource Owner Agent:Brower auth.brightspace.c ...

  10. golang开发:go并发的建议(完)

    上次说了一下Go语言布道师 Dave Cheney对Go并发的建议,个人觉得最重要的一条,这次主要想说一下这个. 8.3. Never start a goroutine without knowni ...