文章目录

  • 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南京区域赛相关推荐

  1. ICPC2019南昌区域赛

    ICPC2019南昌区域赛 题号 题目 知识点 难度 A 9102 B A Funny Bipartite Graph 状压dp+思维 稳银快金 C And and Pair 二项式定理 快铜 D B ...

  2. 2020ICPC南京区域赛 补题 总结

    前言 第一次打线上 ICPC\text{ICPC}ICPC ,记录一下.听说鸭血粉丝汤很好吃,虽然我没吃到,衣服也不赖.比赛环境方面,由于使用自己的设备,还是比较舒服的. 不晓得怎么,一到正式赛,前期 ...

  3. 2018南京区域赛 J-Prime Game

    完全没有头绪 听完队友讲的我还是楞了好半天菜慢慢理解.我好菜啊 首先要弄懂题目的意思,转换一下题意就是求每个素因子出现区间的次数.区间长度最短为1.我们分析,第一个数的因子会影响1* n个区间(暂时不 ...

  4. 19 南京区域赛 F. Paper Grading

    F. Paper Grading 题意: 有 2 e 5 2e5 2e5个字符串和 2 e 5 2e5 2e5个操作: 第一种操作是 交换两个字符串: 第二种是 给你 l , r , k l,r,k ...

  5. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)签到题K Co-prime Permutation,L Let‘s Play Curling

    序 emmm因为没时间补题(虽然签到有四题),所以只能先放两个签到. 这是比赛链接:https://ac.nowcoder.com/acm/contest/10272 这是题解链接:2020年ICPC ...

  6. 2018年 ACM/ICPC亚洲区域赛 青岛赛区现场赛 比赛总结

    首先祝贺自己收获了ACM生涯中的第二枚铜牌. 首先吐槽一下中石油: 周六早上来到中国石油大学,连个志愿者小姐姐都没看到.(但是看到了女装大佬).报完到之后发现教练少了一张午餐券(要不要这么粗心).为了 ...

  7. 2021acm-icpc区域赛(南京)补题笔记

    文章目录 前言 题目一览 A.Oops, It's Yesterday Twice More(签到) 题意 思路 M. Windblume Festival(签到) 题意 思路 C. Klee in ...

  8. Evil Coordinate亚洲区域赛(南京)

    Evil Coordinate 亚洲区域赛(南京) 你好! 我是一个刚刚接触acm的小菜鸡,今天对南京站的E有一点想法,写在这里和大家分享一下. 由于自己的代码能力比较弱,所以写的比较繁琐.欢迎大家优 ...

  9. 第44届ICPC国际大学生程序设计亚洲区域赛(南京站)心得体会

    2019年10月27日在南京航天航空大学举行第44届ICPC国际大学生程序设计亚洲区域赛(南京站).我有幸能与袁应师兄.胡富云一起去参赛.这一次比赛深感愧疚,我们队没能做出一个题,还有自身实力太弱. ...

  10. 2013长春区域赛总结

    今年因为参加了一场日本的区域赛,国内的区域赛只有一次机会.选择了来最后一个赛区长春,一方面准备时间比较充裕,另一方面也想弥补上年在长春留下的遗憾.长春是我的最后一场区域赛了,本来想着拿个金牌退役的,万 ...

最新文章

  1. python装饰器常见问题_关于python装饰器的问题
  2. 裤子换裙子,就问你GAN的这波操作秀不秀
  3. 京东华为 Java开发历年经典题汇总
  4. 【Python3网络爬虫开发实战】 1-开发环境配置
  5. html有4个li怎么选择第二个,如何在html中使用两个具有不同属性的Li?
  6. python基本运算_python中的基本运算
  7. 获取内网、通过外部网站返回得到内网外部IP (C#/VB.NET)
  8. python之web框架(3):WSGI之web应用完善
  9. 谷歌浏览器播放视频只有声音没有画面(或者只有画面没有声音)解决方法
  10. unity 射线检测真机失效_Unity 2019 射线检测失效
  11. 巩固大一,大二知识 练习计划
  12. Java中的深浅拷贝方式
  13. mysql——时间显示格式 dateformat函数
  14. STM32芯片包下载和安装教程
  15. Dart factory 快速理解
  16. 用于Brain Runners电子游戏的改进SmallNet脑电解码分类
  17. [宝塔版] 如何搭建一个微信小程序开源商城?
  18. plsql 连接 虚拟机Linux下的Oracle数据库 失败
  19. MATLAB小技巧(32)FCM聚类
  20. bex5中的常用方法总结

热门文章

  1. onvif python3 推送音频_Python3-onvif协议之相机截图
  2. 极光:2019年个人网盘行业研究报告
  3. 三维扫描用于3D打印技术
  4. 面试总结:给应届生一些找工作的基本建议,毕竟我踩坑多
  5. qpython3l_qpython3例子
  6. 组策略禁止自动锁定计算机,让Win10自动锁屏的设置技巧
  7. 今晚8:00 | 杜克大学计算进化智能中心(CEI Lab)—— 高效鲁棒深度学习专题!...
  8. 网易云音乐API获取分析
  9. 在html中加入中文字体,css设置中文字体
  10. html 长度太长截断,HTML CSS 表格换行禁止 超出指定长度自动截断