Codeforces Round #404 (Div. 2)——ABCDE

2023-11-06 10:11
文章标签 codeforces round div 404 abcde

本文主要是介绍Codeforces Round #404 (Div. 2)——ABCDE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目这里

 

A.map裸题

#include <bits/stdc++.h>using namespace std;map <string, int> p;string s[] = {"Tetrahedron","Cube","Octahedron" ,"Dodecahedron","Icosahedron"
};int ss[] = {4, 6, 8, 12, 20};int main() {ios::sync_with_stdio(false);for(int i = 0;i < 5;i ++) p[s[i]] = ss[i];int n, m = 0;string str;cin >> n;while(n --) cin >> str, m += p[str];cout << m; return 0;
}
View Code

 

B.贪心,先上的课尽早下课,后上的课尽量晚点上课

#include <bits/stdc++.h>using namespace std;int n, l, r, l1, l2, r1, r2, ans;int main() {ios::sync_with_stdio(false);r1 = r2 = 1e9;cin >> n;while(n --) {cin >> l >> r;l1 = max(l1, l);r1 = min(r1, r);}cin >> n;while(n --) {cin >> l >> r;l2 = max(l2, l);r2 = min(r2, r);}ans = max(max(0, l2 - r1), max(0, l1 - r2));cout << ans;return 0;
}
View Code

 

C.先讨论一下

如果n <= m ,那么前 n - 1 天都是当天补满,然后第 n 天被吃光

当 n > m , 前 m 天肯定吃不完的

然后第 m + 1 天鸟走之后(没吃完)下一天再补上,就只有 n - 1 了

第 m + 2 天鸟走之后(没吃完)再补上,就只有 n - 1 - 2 了

......

第 ans 天鸟走之后仓库已经被吃光了

那么就有 n - (ans - m) * (ans - m - 1) / 2 - ans <= 0

令 t = ans - m , 化简以后就有 t * t + t >= 2 * (n - m)

这时候可以选择二分,右边界肯定是sqrt(2 * 1e18)啦,再大会爆long long

当然可以直接开根,然后左右小小调整一下就能出来结果

#include <bits/stdc++.h>using namespace std;int main() {unsigned long long n, m, ans;cin >> n >> m;if(n <= m) cout << n;else {n = (n - m) * 2, ans = sqrt(n);while(ans * ans + ans >= n) ans --;ans ++;while(ans * ans + ans <  n) ans ++;cout << ans + m;}return 0;
}
View Code

 

D.为了避免重复,我们选择这样一个策略:

每当遇到一个左括号,我们计算包含这个左括号的合法序列数量加入ans

显然如果当前左括号左边有 L 个左括号(不含这个)

右边有 R 个右括号,那么对ans贡献为

 sigma(C(L,i ) * C(R,i + 1) ),0 <= i < R

然后我们用一个范德蒙恒等式就变成了求 C(L + R ,R - 1) 

剩下求组合数就O(nlogn)预处理,O(1)计算即可

#include <cstdio>
#include <iostream>const int Mod = 1e9 + 7;char s[200010];long long ans, fac[200010], v[200010];int calc(long long x, int k = Mod - 2) {long long ret = 1;for(;k;k >>= 1, x = x * x % Mod)if(k & 1) ret = ret * x % Mod;return ret;
}long long C(int n, int m) {return fac[n] * v[m] % Mod * v[n - m] % Mod;
}int main() {fac[0] = v[0] = 1;for(int i = 1;i <= 200000;i ++)fac[i] = fac[i - 1] * i % Mod, v[i] = calc(fac[i]);int l = 0, r = 0;scanf("%s", s);for(int i = 0;s[i];i ++) r += (s[i] == ')');for(int i = 0;s[i];i ++) {if(s[i] == ')') r --;else ans += C(l + r, r - 1), ans %= Mod, l ++;}printf("%lld", ans);return 0;
}
View Code

 

E.原序列为 1 - n 的排列,每次操作交换两数位置,并操作后求出逆序对个数

转化为二维模型就能很熟悉的联系到cdq上,于是 cdq + 树状数组 解决即可

当然树套树也可做,不再分析思路

 

用cdq来做呢,我们每次计算这次操作对逆序对数的改变量即为

 ( l, a[r] )左上和右下矩阵中点的个数 + ( r, a[l] ) 左上和右下矩阵中点的个数

 - ( l, a[l] ) 左上和右下矩阵中点的个数 - ( r, a[r] ) 左上和右下矩阵中点的个数

当然我们需要注意避免逆序对的重复计算

另外需要注意我们计算的是改变量,所以答案是需要累加的

#include <bits/stdc++.h>#define lb(x) (x & (-x))
#define rep(i, j, k) for(int i = j;i <= k;i ++)using namespace std;const int maxn = 200010, maxm = maxn * 5;struct node {int x, y, op, bel, id;bool operator < (const node &a) const {if(x != a.x) return x < a.x;if(y != a.y) return y < a.y;return id < a.id;} 
}q[maxm], q0[maxm];int n, m, k, a[maxn], c[maxn];
long long ans[maxn];void add(int i, int x) {while(i <= n) c[i] += x, i += lb(i);
}int ask(int i) {int ret = 0;while(i > 0) ret += c[i], i -= lb(i);return ret;
}void solve(int l, int r) {if(l == r) return;int mid = (l + r) >> 1, cnt = 0;solve(l, mid), solve(mid + 1, r);rep(i, l, mid) if(q[i].op == 3 || q[i].op == -3) q0[++ cnt] = q[i];rep(i, 1 + mid, r) if(q[i].op != 3 && q[i].op != -3) q0[++ cnt] = q[i];sort(q0 + 1, q0 + cnt + 1);rep(i, 1, cnt) {if(q0[i].op == 3 || q0[i].op == -3) add(q0[i].y, q0[i].op / 3);else ans[q0[i].bel] += ask(q0[i].y) * q0[i].op;}rep(i, 1, cnt) if(q0[i].op == 3 || q0[i].op == -3) add(q0[i].y, q0[i].op / -3);
}int main() {ios::sync_with_stdio(false);int l, r;cin >> n >> m;rep(i, 1, n) a[i] = i, q[++ k] = (node){i, i, 3, 0, k};rep(i, 1, m) {cin >> l >> r;if(l != r) {q[++ k] = (node){l - 1, n, -1, i, k};q[++ k] = (node){n, a[l] - 1, -1, i, k};q[++ k] = (node){l - 1, a[l] - 1, 2, i, k};q[++ k] = (node){l, a[l], -3, 0, k};q[++ k] = (node){r - 1, n, -1, i, k};q[++ k] = (node){n, a[r] - 1, -1, i, k};q[++ k] = (node){r - 1, a[r] - 1, 2, i, k};q[++ k] = (node){r, a[r], -3, 0, k};q[++ k] = (node){l - 1, n, 1, i, k};q[++ k] = (node){n, a[r] - 1, 1, i, k};q[++ k] = (node){l - 1, a[r] - 1, -2, i, k};q[++ k] = (node){l, a[r], 3, 0, k};q[++ k] = (node){r - 1, n, 1, i, k};q[++ k] = (node){n, a[l] - 1, 1, i, k};q[++ k] = (node){r - 1, a[l] - 1, -2, i, k};q[++ k] = (node){r, a[l], 3, 0, k};swap(a[l], a[r]);}}solve(1, k);rep(i, 1, m) {ans[i] += ans[i - 1];cout << ans[i] << endl;}return 0;
}
View Code

代码写的很丑很暴力,仅供参考

转载于:https://www.cnblogs.com/ytytzzz/p/6813958.html

这篇关于Codeforces Round #404 (Div. 2)——ABCDE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355992

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>