icpc2019南京区域赛
文章目录
- 2019 ICPC Asia Nanjing Regional
- A. A Hard Problem
- B.Chessboard
- C.Digital Path
- F.Paper Grading
- H.Prince and Princess
- J.Spy
- K.Triangle
2019 ICPC Asia Nanjing Regional
A. A Hard Problem
题意: 签到
题解: 签到
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
int const N = 2e5 + 10;
int n, m, T;int main() {cin >> T;while(T--) {cin >> n;cout << n / 2 + 1 + (n & 1) << endl;}return 0;
}
B.Chessboard
题意: 题目看不懂,不补了
题解:
代码:
C.Digital Path
**题意:**一个n*m的矩阵,每一个格子上都有一个数字,我们可以从任意的点出发,每次向上下左右四个方向走,只能到有公共边的格子上去,求一共有多少条完整路径。完整的路径规定:路径长度大于等于4、路径上的点权值按1递增。1<=n,m<=1000,−107<=ai,j<=1071 <= n, m <= 1000, -10^7 <= a_{i, j} <= 10^71<=n,m<=1000,−107<=ai,j<=107
题解: 由于规定了数字大小按1递增,因此所走的路径是一个dag。那么我们可以维护f[i][1]、f[i][2]、f[i][3]、f[i][4]f[i][1]、f[i][2]、f[i][3]、f[i][4]f[i][1]、f[i][2]、f[i][3]、f[i][4] 分别表示从i开始往前的长度为1、2、3和大于等于4的路径条数,每次使用队头元素去更新相邻的点即可。
代码:
/*
3 5
1 2 3 8 7
-1 -1 4 5 6
1 2 3 8 7
*/#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
int const MAXN = 1e3 + 10, MAXM = 4e6 + 10, mod = 1e9 + 7;
int n, m, T;
int g[MAXN][MAXN];
int e[MAXM], ne[MAXM], h[MAXN * MAXN], idx, f[MAXN * MAXN][4];
int d[MAXN * MAXN];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int mapping(int x, int y) {return x * m + y;
}void add(int a, int b ) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int top_sort() {queue<int> q;for (int i = 0; i < n * m; ++i) {if (d[i] == 0 ) q.push(i), f[i][1] = 1;}int res = 0;while(q.size()) {auto t = q.front();q.pop();int flg = 0;for (int i = h[t]; ~i; i = ne[i]) {int j = e[i];f[j][2] = (f[j][2] + f[t][1]) % mod;f[j][3] = (f[j][3] + f[t][2]) % mod;f[j][4] = (f[j][4] + 0ll + f[t][3] + f[t][4]) % mod;d[j]--;if (!d[j]) q.push(j);flg = 1;}if (!flg) res = (res + f[t][4]) % mod;}return res;
}int main() {cin >> n >> m; memset(h, -1, sizeof h);for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j)scanf("%d", &g[i][j]);for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) {for (int k = 0; k < 4; ++k) {int nx = i + dx[k], ny = j + dy[k];if (nx < 0 || nx > n - 1 || ny < 0 || ny > m - 1) continue;if (g[nx][ny] != g[i][j] + 1) continue;add(mapping(i, j), mapping(nx, ny));d[mapping(nx, ny)]++;}}cout << top_sort();return 0;
}
F.Paper Grading
题意: 字典树+cdq分治,留坑,待补
题解:
代码:
H.Prince and Princess
题意: 王子解救公主,xxxx
题解: xxxxx判断一下就好了
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
int const N = 2e5 + 10;
int n, m, T;int main() {int a, b, c;cin >> a >> b >> c;if (a == 1 && b == 0 && c == 0) {cout << "YES\n";cout << 0 << endl;return 0;}if (a > b + c) {cout << "YES\n";cout << 2 * (b + c) + 1;}else cout << "NO\n";return 0;
}
J.Spy
题意: a[i]表示对手的每个队伍战斗力, p[i]表示打败对手后获得的分数, b[i]表示我方第一种人的战斗力, c[i]表示我方第二种人的战斗力。定义我方一组选手的战斗力为b[i]+c[j],第一种选手与第二种选手某种顺序两两组队后,与对方进行pk,共有n!种pk顺序,求最大期望×n
题解: 本题问b和c如何匹配,同时保证是完美匹配,然后要求获得分数的最大期望,那就是最优匹配问题,km算法跑即可。bi和cj的边权为bi+cj比所有a[k]大的p[k]累加。
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;
LL const INF = 0x3f3f3f3f3f3f3f3f;
int const MAXN = 500;inline LL read() {LL x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0';ch = getchar();}return x * f;
}int n;
LL g[MAXN][MAXN], hl[MAXN], hr[MAXN], slk[MAXN];
int fl[MAXN], fr[MAXN], pre[MAXN], vl[MAXN], vr[MAXN], q[MAXN], ql, qr;
LL a[MAXN], b[MAXN], p[MAXN], c[MAXN];inline int check(int i) {vl[i] = 1;if (fl[i] != -1) {q[qr++] = fl[i];vr[fl[i]] = 1;return 1;}while (i != -1) {fl[i] = pre[i];swap(i, fr[fl[i]]);}return 0;
}void bfs(int s) {for (int i = 1; i <= n; i++) vl[i] = vr[i] = 0, slk[i] = INF;for (vr[q[ql = 0] = s] = qr = 1;;) {for (LL d; ql < qr;) {for (int i = 1, j = q[ql++]; i <= n; i++) {if (!vl[i] && slk[i] >= (d = hl[i] + hr[j] - g[i][j])) {pre[i] = j;if (d)slk[i] = d;else if (!check(i))return;}}}LL d = INF;for (int i = 1; i <= n; i++) {if (!vl[i] && d > slk[i]) d = slk[i];}for (int i = 1; i <= n; i++) {if (vl[i])hl[i] += d;elseslk[i] -= d;if (vr[i]) hr[i] -= d;}for (int i = 1; i <= n; i++)if (!vl[i] && !slk[i] && !check(i)) return;}
}LL solve() {for (int i = 1; i <= n; i++) fl[i] = fr[i] = -1, hr[i] = 0;for (int i = 1; i <= n; i++) hl[i] = *max_element(g[i] + 1, g[i] + n + 1);for (int j = 1; j <= n; j++) bfs(j);LL re = 0;for (int i = 1; i <= n; i++)if (g[i][fl[i]])re += g[i][fl[i]];elsefl[i] = 0;return re;
}int main() {n = read();for (int i = 1; i <= n; i++) a[i] = read();for (int i = 1; i <= n; i++) p[i] = read();for (int i = 1; i <= n; i++) b[i] = read();for (int i = 1; i <= n; i++) c[i] = read();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {LL v = b[i] + c[j];for (int k = 1; k <= n; k++)if (a[k] < v) g[i][j] += p[k];}}LL ans = solve();printf("%lld\n", ans);return 0;
}
K.Triangle
题意: 给定一个三角形的三个点,给定一个点A(xe, ye),让你再找出三角形上的一个点B(xs, ys),使得直线AB能够把三角形切分为2个相等的部分。如果找不到输出-1
题解: 如果A点不在三角形的三边,那么就是-1;如果在的话,可以知道必有解。然后如果点A在边ac上,如果aA>Ac,那么点B可以确定在某一条边上,因此面积的变化具有单调性,所有可以二分处理。
代码:
#include <bits/stdc++.h>using namespace std;int n, m, T;// 计算几何模板
const double eps = 1e-8;
// 和0做比较
int sgn(double x) {if (fabs(x) < eps) return 0; // =0if (x < 0)return -1; // < 0elsereturn 1; // > 0
}struct Point {double x, y;Point() {}Point(double _x, double _y) {x = _x;y = _y;}void input() { scanf("%lf%lf", &x, &y); }void output() { printf("%.10f %.10f\n", x, y); }bool operator<(Point b) const {return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x;}Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }//叉积double operator^(const Point &b) const { return x * b.y - y * b.x; }//点积double operator*(const Point &b) const { return x * b.x + y * b.y; }//返回向量长度double len() {// hypot(x, y), 即sqrt(x * x + y * y)return hypot(x, y); //库函数}//返回两点的距离double distance(Point p) { return hypot(x - p.x, y - p.y); }Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }Point operator*(const double &k) const { return Point(x * k, y * k); }Point operator/(const double &k) const { return Point(x / k, y / k); }//计算pa和pb的夹角, 就是求这个点看a,b 所成的夹角的弧度
};struct Line {Point s, e;Line() {}// 两点确定一条线段Line(Point _s, Point _e) {s = _s;e = _e;}// 点在线段上的判断bool pointonseg(Point p) {return sgn((p - s) ^ (e - s)) == 0 && sgn((p - s) * (p - e)) <= 0;}
};double getarea(Point a, Point b, Point c) {double sum = 0;sum += a.operator^(b) + b.operator^(c) + c.operator^(a);return fabs(sum) / 2;
}Point get_mid(Point l, Point r) {return (l + r) * 0.5;
}int main() {Point a, b, c, e, s;Line ab, bc, ac;cin >> T;while (T--) {a.input(), b.input(), c.input(), e.input();double tran_area = getarea(a, b, c) / 2;ab = Line(a, b), bc = Line(b, c), ac = Line(a, c);if (!ab.pointonseg(e) && !ac.pointonseg(e) && !bc.pointonseg(e)) {puts("-1");continue;}if (ab.pointonseg(e)) {double ae = a.distance(e), eb = b.distance(e);if (ae > eb) {Point l = a, r = c;Point mid = get_mid(l, r);int time = 1000;while (time--) {mid = get_mid(l, r);int flg = sgn(getarea(a, e, mid) - tran_area);if (flg == 0) break;else if (flg > 0) r = mid;else l = mid; }mid.output();} else {Point l = b, r = c;Point mid = get_mid(l, r);int time = 1000;while (time--) {mid = get_mid(l, r);int flg = sgn(getarea(b, e, mid) - tran_area);if (flg == 0) break;else if (flg > 0) r = mid;else l = mid; }mid.output();}} else if (bc.pointonseg(e)) {double be = b.distance(e), ce = c.distance(e);if (be > ce) {Point l = b, r = a;int time = 1000;Point mid = get_mid(l, r);while (time--) {mid = get_mid(l, r);int flg = sgn(getarea(b, e, mid) - tran_area);if (flg == 0) break;else if (flg > 0) r = mid;else l = mid;}mid.output();} else {Point l = c, r = a;int time = 1000;Point mid = get_mid(l, r);while (time--) {mid = get_mid(l, r);int flg = sgn(getarea(e, c, mid) - tran_area);if (flg == 0) break;else if (flg > 0) r = mid;else l = mid;}mid.output();}} else if (ac.pointonseg(e)) {double ae = e.distance(e), ec = c.distance(e);if (ae < ec) {Point l = c, r = b;Point mid = get_mid(l, r);int time = 1000;while (time--) {mid = get_mid(l, r);int flg = sgn(getarea(e, c, mid) - tran_area);if (flg == 0) break;else if (flg > 0) r = mid;else l = mid;}mid.output();} else {Point l = a, r = b;Point mid = get_mid(l, r);int time = 1000;while (time--) {mid = get_mid(l, r);int flg = sgn(getarea(e, a, mid) - tran_area);if (flg == 0) break;else if (flg > 0) r = mid;else l = mid;}mid.output();}}}return 0;
};
icpc2019南京区域赛相关推荐
- ICPC2019南昌区域赛
ICPC2019南昌区域赛 题号 题目 知识点 难度 A 9102 B A Funny Bipartite Graph 状压dp+思维 稳银快金 C And and Pair 二项式定理 快铜 D B ...
- 2020ICPC南京区域赛 补题 总结
前言 第一次打线上 ICPC\text{ICPC}ICPC ,记录一下.听说鸭血粉丝汤很好吃,虽然我没吃到,衣服也不赖.比赛环境方面,由于使用自己的设备,还是比较舒服的. 不晓得怎么,一到正式赛,前期 ...
- 2018南京区域赛 J-Prime Game
完全没有头绪 听完队友讲的我还是楞了好半天菜慢慢理解.我好菜啊 首先要弄懂题目的意思,转换一下题意就是求每个素因子出现区间的次数.区间长度最短为1.我们分析,第一个数的因子会影响1* n个区间(暂时不 ...
- 19 南京区域赛 F. Paper Grading
F. Paper Grading 题意: 有 2 e 5 2e5 2e5个字符串和 2 e 5 2e5 2e5个操作: 第一种操作是 交换两个字符串: 第二种是 给你 l , r , k l,r,k ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)签到题K Co-prime Permutation,L Let‘s Play Curling
序 emmm因为没时间补题(虽然签到有四题),所以只能先放两个签到. 这是比赛链接:https://ac.nowcoder.com/acm/contest/10272 这是题解链接:2020年ICPC ...
- 2018年 ACM/ICPC亚洲区域赛 青岛赛区现场赛 比赛总结
首先祝贺自己收获了ACM生涯中的第二枚铜牌. 首先吐槽一下中石油: 周六早上来到中国石油大学,连个志愿者小姐姐都没看到.(但是看到了女装大佬).报完到之后发现教练少了一张午餐券(要不要这么粗心).为了 ...
- 2021acm-icpc区域赛(南京)补题笔记
文章目录 前言 题目一览 A.Oops, It's Yesterday Twice More(签到) 题意 思路 M. Windblume Festival(签到) 题意 思路 C. Klee in ...
- Evil Coordinate亚洲区域赛(南京)
Evil Coordinate 亚洲区域赛(南京) 你好! 我是一个刚刚接触acm的小菜鸡,今天对南京站的E有一点想法,写在这里和大家分享一下. 由于自己的代码能力比较弱,所以写的比较繁琐.欢迎大家优 ...
- 第44届ICPC国际大学生程序设计亚洲区域赛(南京站)心得体会
2019年10月27日在南京航天航空大学举行第44届ICPC国际大学生程序设计亚洲区域赛(南京站).我有幸能与袁应师兄.胡富云一起去参赛.这一次比赛深感愧疚,我们队没能做出一个题,还有自身实力太弱. ...
- 2013长春区域赛总结
今年因为参加了一场日本的区域赛,国内的区域赛只有一次机会.选择了来最后一个赛区长春,一方面准备时间比较充裕,另一方面也想弥补上年在长春留下的遗憾.长春是我的最后一场区域赛了,本来想着拿个金牌退役的,万 ...
最新文章
- python装饰器常见问题_关于python装饰器的问题
- 裤子换裙子,就问你GAN的这波操作秀不秀
- 京东华为 Java开发历年经典题汇总
- 【Python3网络爬虫开发实战】 1-开发环境配置
- html有4个li怎么选择第二个,如何在html中使用两个具有不同属性的Li?
- python基本运算_python中的基本运算
- 获取内网、通过外部网站返回得到内网外部IP (C#/VB.NET)
- python之web框架(3):WSGI之web应用完善
- 谷歌浏览器播放视频只有声音没有画面(或者只有画面没有声音)解决方法
- unity 射线检测真机失效_Unity 2019 射线检测失效
- 巩固大一,大二知识 练习计划
- Java中的深浅拷贝方式
- mysql——时间显示格式 dateformat函数
- STM32芯片包下载和安装教程
- Dart factory 快速理解
- 用于Brain Runners电子游戏的改进SmallNet脑电解码分类
- [宝塔版] 如何搭建一个微信小程序开源商城?
- plsql 连接 虚拟机Linux下的Oracle数据库 失败
- MATLAB小技巧(32)FCM聚类
- bex5中的常用方法总结
热门文章
- onvif python3 推送音频_Python3-onvif协议之相机截图
- 极光:2019年个人网盘行业研究报告
- 三维扫描用于3D打印技术
- 面试总结:给应届生一些找工作的基本建议,毕竟我踩坑多
- qpython3l_qpython3例子
- 组策略禁止自动锁定计算机,让Win10自动锁屏的设置技巧
- 今晚8:00 | 杜克大学计算进化智能中心(CEI Lab)—— 高效鲁棒深度学习专题!...
- 网易云音乐API获取分析
- 在html中加入中文字体,css设置中文字体
- html 长度太长截断,HTML CSS 表格换行禁止 超出指定长度自动截断