hihoCoder太阁最新面经算法竞赛19

比赛链接:http://hihocoder.com/contest/hihointerview28/problems

A. 固定一个方向,两两相邻的点顺时针或逆时针构造三个向量,判断这个点在这个向量的左侧还是右侧,看看是否在同一侧。trick就是点在向量上,对应的情况就是值为0.

 1 def do(p1x, p1y, p2x, p2y, p3x, p3y):
 2     return (p3x - p1x) * (p2y - p1y) - (p2x - p1x) * (p3y - p1y);
 3
 4 T = map(int, raw_input().split(‘ ‘))[0]
 5 while T > 0:
 6     T -= 1
 7     px, py, ax, ay, bx, by, cx, cy = map(int, raw_input().split(‘ ‘))
 8     x, y, z = do(ax, ay, px, py, bx, by), do(bx, by, px, py, cx, cy), do(cx, cy, px, py, ax, ay)
 9     if (x >= 0 and y >= 0 and z >= 0) or (x <= 0 and y <= 0 and z <= 0):
10         print ‘YES‘
11     else:
12         print ‘NO‘

B.打表规律,发现<=16的时候可以暴搜,>16的时候f(n)=4*f(n-5)(?如果没记错的话),矩阵加速一下就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const LL mod = 1000000007LL;
 6 const int maxn = 10;
 7 LL n;
 8 LL ret;
 9
10 typedef struct Matrix {
11     LL m[maxn][maxn];
12     int r;
13     int c;
14     Matrix() {
15         r = c = 0;
16         memset(m, 0, sizeof(m));
17     }
18 } Matrix;
19
20 Matrix mul(Matrix m1, Matrix m2, LL mod) {
21     Matrix ans = Matrix();
22     ans.r = m1.r;
23     ans.c = m2.c;
24     for(int i = 1; i <= m1.r; i++) {
25         for(int j = 1; j <= m2.r; j++) {
26                for(int k = 1; k <= m2.c; k++) {
27                 if(m2.m[j][k] == 0) continue;
28                 ans.m[i][k] = ((ans.m[i][k] + m1.m[i][j] * m2.m[j][k] % mod) % mod) % mod;
29             }
30         }
31     }
32     return ans;
33 }
34
35 Matrix quickmul(Matrix m, LL n, LL mod) {
36     Matrix ans = Matrix();
37     for(int i = 1; i <= m.r; i++) {
38         ans.m[i][i]  = 1;
39     }
40     ans.r = m.r;
41     ans.c = m.c;
42     while(n) {
43         if(n & 1) {
44             ans = mul(m, ans, mod);
45         }
46         m = mul(m, m, mod);
47         n >>= 1;
48     }
49     return ans;
50 }
51
52 void dfs(LL n, LL cur, LL sz) {
53     if(n == 0) {
54         ret = max(ret, cur);
55         return;
56     }
57     if(n >= 3) dfs(n-3,cur*2%mod, cur);
58     if(n >= 1 && sz) dfs(n-1, (cur+sz)%mod, sz);
59         dfs(n-1,(cur+1)%mod, sz);
60 }
61
62 int main() {
63     // freopen("in", "r", stdin);
64     while(cin >> n) {
65         if(n < 16) {
66             ret = 0;
67             dfs(n, 0, 0);
68             cout << ret << endl;
69             continue;
70         }
71         Matrix x; x.r = 5, x.c = 1;
72         x.m[1][1] = 81, x.m[2][1] = 64, x.m[3][1] = 48, x.m[4][1] = 36, x.m[5][1] = 27;
73         Matrix p; p.r = p.c = 5;
74         memset(p.m, 0, sizeof(p.m));
75         p.m[1][5] = 4;
76         for(int i = 2; i <= 5; i++) p.m[i][i-1] = 1;
77         p = quickmul(p, n-15, mod);
78         p = mul(p, x, mod);
79         cout << p.m[1][1] << endl;
80     }
81     return 0;
82 }

C.对于trie上的每个节点u,求最小的整数x满足 节点u对应的字符串(trie上root->u的路径) 是 S[1..x]的子序列。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 10100;
 5 const int maxm = 100100;
 6 const int maxc = 30;
 7
 8 typedef pair<int, int> pii;
 9 typedef struct Trie {
10     int rt, sz;
11     int id[maxm][maxc], val[maxm];
12     int dp[maxm];
13     string s;
14     void build() {
15         rt = sz = 0;
16         memset(dp, 0, sizeof(dp));
17         memset(id, -1, sizeof(id));
18         memset(val, 0, sizeof(val));
19     }
20     void insert(const char* str) {
21         int u = rt;
22         int n = strlen(str);
23         for(int i = 0; i < n; i++) {
24             int v = str[i] - ‘a‘;
25             if(id[u][v] == -1) id[u][v] = ++sz;
26             u = id[u][v];
27         }
28         val[u] = max(val[u], n);
29     }
30     void dfs(int x, int u) {
31         if(x == s.length()) return;
32         for(int i = 0; i < 26; i++) {
33             int &v = id[u][i];
34             if(v == -1) continue;
35             int y = x;
36             while(s[y] != i + ‘a‘ && y < s.length()) y++;
37             if(y == s.length()) break;
38             if(i + ‘a‘ == s[y]) {
39                 dp[v] = dp[u] + 1;
40                 dfs(y+1, v);
41             }
42         }
43     }
44 }Trie;
45
46 int n;
47 char tmp[maxm];
48 Trie trie;
49
50 int main() {
51     // freopen("in", "r", stdin);
52     while(~scanf("%d", &n)) {
53         trie.build();
54         for(int i = 0; i < n; i++) {
55             scanf("%s", tmp);
56             trie.insert(tmp);
57         }
58         scanf("%s", tmp);
59         trie.s = tmp;
60         trie.dfs(0, 0);
61         int ret = 0;
62         for(int i = 0; i <= trie.sz; i++) {
63             // printf("%d %d\n", trie.dp[i], trie.val[i]);
64             if(trie.dp[i] != 0) {
65                 ret = max(ret, trie.val[i]);
66             }
67         }
68         printf("%d\n", ret);
69     }
70     return 0;
71 }
时间: 2024-09-28 21:12:24

hihoCoder太阁最新面经算法竞赛19的相关文章

Hihocoder 太阁最新面经算法竞赛18

Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus 描述 Given an NxN 01 matrix, find the biggest plus (+) consisting of 1s in the matrix. size 1 plus size 2 plus size 3 plus size 4 plus 1 1 1 1 111 1 1

hihoCoder太阁最新面经算法竞赛18

比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 505; 5 int n; 6 char G[maxn][maxn]; 7 8 bool ok(int x, int y) { 9 return x >= 0 && x < n &

[HIHO]hihoCoder太阁最新面经算法竞赛7

题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论版说数据水才敢写的. A Word Construction 解法:正解应该是dfs+剪枝,我的思路是贪心,竟然过了.先把字符串按字典序排序,然后枚举每一个串作为起始,记下串内有什么字符,再从头到尾枚举所有字符串,看看每一个是否符合条件.就那么100个字符串,数据弱得很. 1 #include <a

hihoCoder太阁最新面经算法竞赛15

Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 Long long ago you took a crazy trip around the world. You can not remember which cities did you start and finish the trip.  Luckily you

hihoCoder太阁最新面经算法竞赛2

A  任务分配 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务. 同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行.任务切换不需要时间. 输入 第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目. 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间. 输出 输出一个整数,表示最

zz 圣诞丨太阁所有的免费算法视频资料整理

首发于 太阁实验室 关注专栏 写文章 圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法类视频,均为免费观看,方便大家学习. 先放一个ACM大神讲解的算法题视频(国外传优酷真的是太不容易了……). ACM大神精讲北美最新面试题—在线播放—优酷网,视频高清在线观看http://v.youku.com/v_show/id_XMTg2ODk0MzIwMA==.html 其余视频: [公开课]ACM大神精

算法竞赛专题解析(1):二分法、三分法

目录 1. 二分法的理论背景 2. 整数二分模板 2.1 基本形式 2.2 STL的lower_bound()和upper_bound() 2.3 简单例题 3. 整数二分典型题目 3.1 最大值最小化(最大值尽量小 3.1.1序列划分问题 3.1.2 通往奥格瑞玛的道路 3.2 最小值最大化(最小值尽量大) 4. 实数二分 4.1 基本形式 4.2 实数二分例题 5. 二分法习题 6. 三分法求极值 6.1 原理 6.2 实数三分 6.2.1 实数三分习题 6.3 整数三分 本系列是这本算法教

[算法竞赛入门]第二章_循环结构程序设计

第2章 循环结构程序设计 [学习内容相关章节] 2.1for循环 2.2循环结构程序设计 2.3文件操作 2.4小结与习题 [学习目标] (1)掌握for循环的使用方法: (2)掌握while循环的使用方法: (3)学会使用计算器和累加器: (4)学会用输出中间结果的方法调试: (5)学会用计时函数测试程序效率: (6)学会用重定向的方式读写文件: (7)学会fopen的方式读写文件: (8)了解算法竞赛对文件读写方式和命名的严格性: (9)记住变量在赋值之前的值是不确定的: (10)学会使用条

深度学习攻防对抗(JCAI-19 阿里巴巴人工智能对抗算法竞赛)

最近在参加IJCAI-19阿里巴巴人工智能对抗算法竞赛(点击了解),初赛刚刚结束,防御第23名,目标攻击和无目标攻击出了点小问题,成绩不太好都是50多名,由于找不到队友,只好一个人跟一群大佬PK,双拳难敌四手,差点自闭放弃比赛了.由于知道对抗攻击的人很少,于是抽空写篇博客,简单科普一下人工智能与信息安全的交叉前沿研究领域:深度学习攻防对抗. 然后简单介绍一下IJCAI-19 阿里巴巴人工智能对抗算法竞赛 目前,人脸识别.自动驾驶.刷脸支付.抓捕逃犯.美颜直播……人工智能与实体经济深度结合,彻底改