阿里云天池超级码力在线编程大赛初赛 第2场 ABCD(A.计算几何 判断点在三角形内 D.大施罗德数/超级卡特兰数)
心得
打了一下被群友吐槽的比赛,阅读体验极差
阴间题面,读题1小时,AC5min,原题警告
思路来源
https://blog.csdn.net/PleasantlY1/article/details/84074637
题目
A.三角魔法
给定三个点ABC,再给一个点P,
问P是否在ABC构成的三角形上,在某一条边上也算
抄了个计算几何的板子,
判断一个点P是否在三角形ABC内,大致思路,
考虑P向ABC三点连线,形成三个向量PA,PB,PC
那么P如果在ABC内部,下述两种情况必成立之一,
①PA在PB顺时针,PB在PC顺时针,PC在PA顺时针
②PA在PB逆时针,PB在PC逆时针,PC在PA逆时针
叉积判断一下向量的顺逆关系,等于0是出现在某一条边上的情形
注意判断ABC三点共线的情况
class Solution {
public:/*** @param triangle: Coordinates of three points* @param point: Xiaoqi's coordinates* @return: Judge whether you can cast magic*/typedef long long ll;struct Point{ll x,y;Point(){}Point(ll xx,ll yy):x(xx),y(yy){}Point operator-(Point &a){return Point(x-a.x,y-a.y);}};ll det(Point a,Point b){return a.x*b.y-a.y*b.x;}ll dot(Point a,Point b){return a.x*b.x+a.y*b.y;}bool on(Point pi,Point pj,Point Q){if(det(Q-pi,pj-pi)==0&&min(pi.x,pj.x)<=Q.x&&Q.x<=max(pi.x,pj.x)&&min(pi.y,pj.y)<=Q.y&&Q.y<=max(pi.y,pj.y)){return true;}return false;} bool in(Point a,Point b,Point c,Point p){Point pa(a-p),pb(b-p),pc(c-p);ll t1=det(pa,pb),t2=det(pb,pc),t3=det(pc,pa);__int128 x=t1,y=t2,z=t3;return x*y>=0 && x*z>=0;}string castMagic(vector<vector<int>> &triangle, vector<int> &point) {// write your code herePoint a(triangle[0][0],triangle[0][1]);Point b(triangle[1][0],triangle[1][1]);Point c(triangle[2][0],triangle[2][1]);Point d(point[0],point[1]);Point e(b-a),f(c-a);if(det(e,f)==0){if(on(a,b,d) || on(a,c,d) || on(b,c,d))return "Yes";return "No";}else{if(in(a,b,c,d))return "Yes";return "No";}}
};
B.区间异或
给一个5e4长的数组a[],
若干个询问,由一个vector给出,每个询问包括四个数[l1,r1,l2,r2],
这次询问对答案的贡献,是[l1,r1]区间的最大值+[l2,r2]区间的最小值
最终的答案,是每次询问的贡献的异或和,输出最终答案
区间RMQ,ST表裸题,线段树也能做
class Solution {
public:/*** @param num: array of num* @param ask: Interval pairs* @return: return the sum of xor*/int mn[50005][16],mx[50005][16],lg[50005];int amx(int l,int r){int x=lg[r-l+1];return max(mx[l][x],mx[r-(1<<x)+1][x]);}int amn(int l,int r){int x=lg[r-l+1];return min(mn[l][x],mn[r-(1<<x)+1][x]);}int Intervalxor(vector<int> &num, vector<vector<int>> &ask) {// write your code hereint n=num.size();for(int i=1;i<=n;++i)mn[i][0]=mx[i][0]=num[i-1];lg[1]=0;for(int i=2;i<=n;++i)lg[i]=lg[i/2]+1;for(int len=1;(1<<len)<=n;++len){for(int l=1;l+(1<<len)-1<=n;++l){int r=l+(1<<len)-1;mx[l][len]=max(mx[l][len-1],mx[l+(1<<(len-1))][len-1]);mn[l][len]=min(mn[l][len-1],mn[l+(1<<(len-1))][len-1]);}}int ans=0,sz=ask.size();for(int i=0;i<sz;++i){int l1=ask[i][0],r1=ask[i][1],l2=ask[i][2],r2=ask[i][3];ans^=(amx(l1,r1)+amn(l2,r2));}return ans;}
};
C.五字回文
签到题,注意abc是三种不同的字母
class Solution {
public:/*** @param s: The given string* @return: return the number of Five-character palindrome*/int Fivecharacterpalindrome(string &s) {// write your code hereint ans=0;for(int i=2;i+2<s.size();++i){if(s[i-2]==s[i+2] && s[i-1]==s[i+1] && s[i]!=s[i-1] && s[i]!=s[i-2] && s[i-1]!=s[i-2]){ans++;}}return ans;}
};
D.小栖的金字塔
求从(k,k)只能向右或向上走,不能越过y=x这条对角线,走到(n,n)的方案数
比如,(k,k)只能走到(k+1,k),而(k+1,k)可以走到(k+1,k+1)或(k+2,k)
数据保证1<=k<=n<=1e7,
k由一个vector给出,需要对vector里的每个k都求方案数,
最后对所有方案数求总和,答案模1e9+7
如果听说过大施罗德数或超级卡特兰数,那么这就是个原题
如果手推出前几项然后OEIS一下找到数列,那么这就是个原题
大施罗德数(OEIS A006318),即本题所求,前几项为1, 2, 6, 22, 90, 394, 1806, 8558, 41586, 206098,...
超级卡特兰数前几项为1, 1, 3, 11, 45, 197, 903, 4279, 20793, 103049,...
可以发现除了第一项外,其余项大施罗德数=超级卡特兰数*2
而超级卡特兰数递推公式:
class Solution {
public:/*** @param n: The number of pyramid levels n* @param k: Possible coordinates k* @return: Find the sum of the number of plans*/typedef long long ll;static const int mod=1e9+7;static const int N=1e7+10;int inv[N],ans[N];void init(int n){inv[0]=inv[1]=1;for(int i=2;i<=n;++i)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;ans[0]=ans[1]=1;for(int i=2;i<=n-1;++i)ans[i]=1ll*(1ll*(6*i-3)*ans[i-1]%mod-1ll*(i-2)*ans[i-2]%mod+mod)%mod*inv[i+1]%mod;}int cal(int k,int n){if(n==k)return 1;return 1ll*ans[n-k]*2%mod;}int pyramid(int n, vector<int> &k) {// write your code hereinit(N-5);int sz=k.size(),ans=0;for(int i=0;i<sz;++i){int x=k[i];ans=(ans+cal(x,n))%mod;}return ans;}
};
阿里云天池超级码力在线编程大赛初赛 第2场 ABCD(A.计算几何 判断点在三角形内 D.大施罗德数/超级卡特兰数)相关推荐
- 超级码力在线编程大赛初赛第1场-1-树木规划题解
目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...
- 超级码力在线编程大赛初赛 第2场 1.三角魔法
超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...
- 超级码力在线编程大赛初赛 第3场 1.最大公倍数
超级码力在线编程大赛初赛 第3场 1.最大公倍数 题目链接 描述 小栖有一个区间,他准备从中取三个数,他想知道如何取才能使得它们的最小公倍数最大 请直接告诉小栖最小公倍数是多少. 示例 输入: a = ...
- 超级码力在线编程大赛初赛 第2场 题解
超级码力在线编程大赛初赛 第2场 题解 题目出的对退役老年选手很友好,拿个T恤跑路- 下面的题解仅代表个人观点,出了问题,概不负责. 比赛链接:https://tianchi.aliyun.com/o ...
- 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)
文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683739284070 2. 解题 按道 ...
- (天池)超级码力在线编程大赛初赛 第2场
题目:click 1.三角魔法 叉乘判断.注意三点构不成三角形的坐标情况,应该是要非退化三角形.(粘个板子) typedef long long ll; #define inf 0x3f3f3f3f ...
- 超级码力在线编程大赛初赛 第2场 【题解】
三角魔法 思路 1.利用叉乘判断点是否在直线的逆时针方向 2.如果点是在三条边的逆时针方向,则点在三角形内. 3.坑点:判断三点是否形成三角形,也是利用叉乘判断. AC代码 class Solutio ...
- 超级码力在线编程大赛初赛 第2场 T1-T4题解
文章目录 T3.五字回文 T2.区间异或 T1.三角魔法 T4.小栖的金字塔 T3.五字回文 class Solution {public:/*** @param s: The given strin ...
- 阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end
文章目录 1. 题目 2. 解题 1. 题目 样例1: 输入: "abcd" "bcda" 输出: true样例2: 输入: "abcd" ...
最新文章
- git 拉去merged 仓库的代码步骤
- 传递数组_Fortran:派生数组与数组传递进子程序耗费时间比较
- char和varchar的区别以及尾部空格问题 - sqlserver演示
- Android Studio 中文显示方块□□问题解决
- Ansible的Inventory管理
- 安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】
- java生成sm4算法的对称密钥_技术分享丨这是一篇简单的小科普——什么是对称加密算法?(下)...
- db2 teradata mysql_DB2 DPF VS Teradata选型对比?
- rx560d linux 图形设计,RX560D与560区别对比:RX 560D和RX 560哪个好
- 按键精灵post请求_手把手教你使用按键精灵post登陆网页
- 牛客网 - 编程初学者入门训练 - 分支控制(BC50~BC77)
- Ansys 2022 安装教程(附赠免费的安装包)
- C#指定图片添加文字——修改版
- C++实现单例模式 —— 打印机
- Bat_PNG转PDF,读取系统剪切板
- 淘宝直播窄带高清技术
- fifa18怎么改服务器位置,fifa18 球员职业生涯怎么改位置 | 手游网游页游攻略大全...
- mysql报1142错误
- Gauss quadrature approximation by Lanczos algorithm
- 浏览器清理缓存快捷键
热门文章
- html5与ccs网页制作,HTML5CCS3(1) 网页的构造块
- 活动目录是什么?有什么用?
- com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `x`
- 开发者分享在PC上制作iOS游戏的经验(下)
- 亲测!Ubuntu18.04与WIN10双系统(USB EFI方式安装—Grub2.0引导修复)完整教程
- 君子博学而日参省乎己,则知明而行无过矣
- 制作 win10 u 盘安装盘
- python爬取股票图_python 股票数据爬取(两种方法)
- 手工删除Windows桌面搜索的方法
- 专攻心脑疾病AI市场,数坤科技完成创世伙伴领投2亿元B轮融资