秦皇岛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. Docker_构建_运行总结

    样例: 构建镜像 build-image-fim-backend.sh echo "开始构建 fim-backend 镜像..." cp -rp ../target/fim-bac ...

  2. Exchange 2019中的Unified Messaging(UM)

    前天,刚刚安装了测试用的Exchange 2019.安装过程和之前的2016一样,非常顺利.但是在用ECP管理服务器的时候遇到了一个报错.The term 'Get-UMService' is not ...

  3. js之页面列表加载常用方法总结

    导语:最近由于一些事情需要处理,所以没来得及写技术总结了.今天终于可以坐下来好好的梳理一下脉络,说一下那个在日常前端开发过程中,常用到的页面列表加载的方法总结.这里介绍三种方法,分别是分页加载.按钮加 ...

  4. Dapr 集成 Open Policy Agent

    大型项目中基本都包含有复杂的访问控制策略,特别是在一些多租户场景中,例如Kubernetes中就支持RBAC,ABAC等多种授权类型.Dapr 的 中间件 Open Policy Agent 将Reg ...

  5. 使用 Shell 命令 分析服务器日志

    文章转载自:https://mp.weixin.qq.com/s/z2qF571m4JSSVi59D7V71g 1.查看有多少个IP访问: awk '{print $1}' log_file|sort ...

  6. Elasticsearch:inverted index,doc_values及source

    以后会用到的相关知识:索引中某些字段禁止搜索,排序等操作 当我们学习Elasticsearch时,经常会遇到如下的几个概念: Reverted index doc_values source? 这个几 ...

  7. ConfigMap使用说明

    ConfigMap概述 ConfigMap供容器使用的典型用法如下. (1)生成为容器内的环境变量. (2)设置容器启动命令的启动参数(需设置为环境变量). (3)以Volume的形式挂载为容器内部的 ...

  8. 通过使用nginx来实现logstash的负载均衡

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106813223 总结: nginx配置,192.168.0.5 user nginx ...

  9. Fluent插件管理

    官方文档地址:https://docs.fluentd.org/deployment/plugin-management 命令fluent-gem是Fluentd用来安装插件的,它是gem命令的包装器 ...

  10. NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)

    实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中节点有两个权 ...