whu-contest-2019(online)
比赛网址:http://whu2019.contest.codeforces.com/group/YyBKO8xFiH/contest/102167
赛后总结:
T:今天参加了武汉大学校赛网络赛,在cf上做的。界面还是挺熟悉的。开始三个人分头看题,我从最后往前面看,最后一题是kuangbin的主席树模板题,觉得打板子时间有点长,先看有没有别的简单题。然后就看到了E,E题就是一道简单模拟题。map存一下,模拟即可,然后就A了。然后是金姐看了B题,开始打了,也A了。这次我们第一题A花了16分钟,第二题是在第一题后6分钟A的,时间有在进步吧。别的题因为一下子想不出来,我就开始搞F题了。然后板子上的是求第m小的,所以改了很久(丢人。。。),金姐后来帮我一起改,金姐发挥了她的智慧,我们终于搞样例出来了。。呜呜。然后TLE了,因为链式前向星head赋值的问题,for改了就过了。做出来的时候已经只剩下一个小时了,我们开始研究D题。金姐和彭彭和我说觉得是规律算式题,我们整了很久,都没整出来。有点像组合数学,但是没搞出来。今天就结束了。
最后比赛结束看到群里很多大佬在讲解题目。发现有很多未触及的知识盲区。想着自己如果主席树模板搞快点就可以和队友一起想更久了。dbq。
P:看的第一题是C题,后来才知道是线段树上二分。然后看了B题,谭总敲完E,金姐就去打B了,我跟谭总说了一遍B题题意。谭总跟我说了一下F题,我大概感觉确实是主席树(然而菜的我wqbh)。然后看了D题,因为发现榜上A的人相对较多,题目意思容易理解,跟金姐讲了一遍,一致觉得是规律题(确实算吧,但不知道卡特兰,规律完全找不出)所以我们想的还是有一点偏差,嗯。。杠D题杠到结束--。确实,知识盲区太大,自己太菜。
J:这次只打了一道签到题,太菜了。进了D题找规律的坑就爬不出来了,呜呜呜呜。下次要是一个小时还做不出来,就要放弃!知识盲区还是太多。。。。
最后本队做出来B、E、F,罚时比较少。没做出来的先不提供题解(官方已给出)。
题解:
B
简单模拟
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int maxn = ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); }
ll x, y;
int n;
int main()
{
int t;
ll a;
scanf("%d", &t);
for (int k = ; k <= t; k++)
{
scanf("%d", &n);
x = y = ;
for (int i = ; i < n; ++i)
{
scanf("%lld", &a);
if (i % == )
x += a;
else if (i % == )
y += a;
else if (i % == )
x -= a;
else
y -= a;
}
ll ans = x * x + y * y;
printf("Case #%d:%lld\n", k, ans);
}
}
D
一个蒲公英从(0,0)出发,向(x+1,y)或(x,y+1)出发,要求x<y。给你N个询问,最后达到(n,m)的方法有多少种。
用费马小定理求逆元,然后直接套公式。
ans = C(n+m-1,m) - C(n+m-1,m-1)
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
const int maxn = 5e5+;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); } int mi[maxn];
inline int quick(int a, int b) {
int res = a, ans = ;
for (int i = ; i < ; i++) {
if ( << i & b) ans = (long long)ans * res % mod;
res = (long long)res * res % mod;
}
return ans;
}
int C(int n, int m) {
int tmp = (long long)mi[n - m] * mi[m] % mod;
int ans = (long long)mi[n] * quick(tmp, mod - ) % mod;
return ans;
}
int main() {
int n, m;
mi[] = ;
for (int i = ; i <= ; i++) mi[i] = (long long)mi[i - ] * i % mod;
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &m, &n);
printf("%d\n", (C(n + m - , m) - C(n + m - , m - ) + mod) % mod);
}
return ;
}
E
简单模拟
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
#include<stack>
using namespace std;
const int maxn = ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); }
map<char, char>letter;
void init()
{
letter['a'] = '';
letter['b'] = '';
letter['c'] = ''; letter['d'] = '';
letter['e'] = '';
letter['f'] = ''; letter['g'] = '';
letter['h'] = '';
letter['i'] = ''; letter['j'] = '';
letter['k'] = '';
letter['l'] = ''; letter['m'] = '';
letter['n'] = '';
letter['o'] = ''; letter['p'] = '';
letter['q'] = '';
letter['r'] = '';
letter['s'] = ''; letter['t'] = '';
letter['u'] = '';
letter['v'] = ''; letter['w'] = '';
letter['x'] = '';
letter['y'] = '';
letter['z'] = '';
}
int main()
{
init();
int T;
cin >> T;
int ccase = ;
while (T--)
{
string num;
cin >> num;
int m;
cin >> m;
printf("Case #%d:\n", ccase);
ccase++;
while (m--)
{
string s;
cin >> s;
string ans="";
for (int i = ; i < s.length(); i++)
{
ans += letter[s[i]];
}
if (ans == num)
cout << "Maybe.." << endl;
else
cout << "How could that be possible?" << endl;
}
}
return ;
}
F
树上区间第k大。裸的板题 ,判断数据是否合法即计算路径上的点是否有k个即可。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
const int maxn = ;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1)
#define NO_DISTANCE 1000000
const int INF = 0x3f3f3f3f;
#define LL long long int
#define mod 1000000007
int gcd(int a, int b) { return a == ? b : gcd(b % a, a); } //主席树部分 *****************8
const int MAXN = ;
const int M = MAXN * ;
int n, q, m, TOT;
int a[MAXN], t[MAXN];
int T[M], lson[M], rson[M], c[M]; void Init_hhash()
{
for (int i = ; i <= n; i++)
t[i] = a[i];
sort(t + , t + + n);
m = unique(t + , t + n + ) - t - ;
}
int build(int l, int r)
{
int root = TOT++;
c[root] = ;
if (l != r)
{
int mid = (l + r) >> ;
lson[root] = build(l, mid);
rson[root] = build(mid + , r);
}
return root;
}
int hhash(int x)
{
return lower_bound(t + , t + + m, x) - t;
}
int update(int root, int pos, int val)
{
int newroot = TOT++, tmp = newroot;
c[newroot] = c[root] + val;
int l = , r = m;
while (l < r)
{
int mid = (l + r) >> ;
if (pos <= mid)
{
lson[newroot] = TOT++; rson[newroot] = rson[root];
newroot = lson[newroot]; root = lson[root];
r = mid;
}
else
{
rson[newroot] = TOT++; lson[newroot] = lson[root];
newroot = rson[newroot]; root = rson[root];
l = mid + ;
}
c[newroot] = c[root] + val;
}
return tmp;
}
int query(int left_root, int right_root, int LCA, int k)
{
int lca_root = T[LCA];
int pos = hhash(a[LCA]);
int l = , r = m;
while (l < r)
{
int mid = (l + r) >> ;
int tmp = c[lson[left_root]] + c[lson[right_root]] - * c[lson[lca_root]] + (pos >= l && pos <= mid);
if (tmp >= k)
{
left_root = lson[left_root];
right_root = lson[right_root];
lca_root = lson[lca_root];
r = mid;
}
else
{
k -= tmp;
left_root = rson[left_root];
right_root = rson[right_root];
lca_root = rson[lca_root];
l = mid + ;
}
}
return l;
} //LCA部分
int rmq[ * MAXN];//rmq数组,就是欧拉序列对应的深度序列
struct ST
{
int mm[ * MAXN];
int dp[ * MAXN][];//最小值对应的下标
void init(int n)
{
mm[] = -;
for (int i = ; i <= n; i++)
{
mm[i] = ((i&(i - )) == ) ? mm[i - ] + : mm[i - ];
dp[i][] = i;
}
for (int j = ; j <= mm[n]; j++)
for (int i = ; i + ( << j) - <= n; i++)
dp[i][j] = rmq[dp[i][j - ]] < rmq[dp[i + ( << (j - ))][j - ]] ? dp[i][j - ] : dp[i + ( << (j - ))][j - ];
}
int query(int a, int b)//查询[a,b]之间最小值的下标
{
if (a > b)swap(a, b);
int k = mm[b - a + ];
return rmq[dp[a][k]] <= rmq[dp[b - ( << k) + ][k]] ? dp[a][k] : dp[b - ( << k) + ][k];
}
};
//边的结构体定义
struct Edge
{
int to, next;
};
Edge edge[MAXN * ];
int tot, head[MAXN]; int F[MAXN * ];//欧拉序列,就是dfs遍历的顺序,长度为2*n-1,下标从1开始
int P[MAXN];//P[i]表示点i在F中第一次出现的位置
int cnt; ST st;
void init()
{
tot = ;
for (int i = ; i <= n; i++)
head[i] = -;
}
void addedge(int u, int v)//加边,无向边需要加两次
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void dfs(int u, int pre, int dep)
{
F[++cnt] = u;
rmq[cnt] = dep;
P[u] = cnt;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (v == pre)continue;
dfs(v, u, dep + );
F[++cnt] = u;
rmq[cnt] = dep;
}
}
void LCA_init(int root, int node_num)//查询LCA前的初始化
{
cnt = ;
dfs(root, root, );
st.init( * node_num - );
}
int query_lca(int u, int v)//查询u,v的lca编号
{
return F[st.query(P[u], P[v])];
} void dfs_build(int u, int pre)
{
int pos = hhash(a[u]);
T[u] = update(T[pre], pos, );
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (v == pre)continue;
dfs_build(v, u);
}
} int main()
{
int ccase;
cin >> ccase;
while (ccase--)
{
scanf("%d %d", &n, &q);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
Init_hhash();
init();
TOT = ;
int u, v;
for (int i = ; i < n; i++)
{
scanf("%d%d", &u, &v);
addedge(u, v);
addedge(v, u);
}
LCA_init(, n);
T[n + ] = build(, m);
dfs_build(, n + );
int k;
while (q--)
{
scanf("%d %d %d", &u, &v, &k);
int K = rmq[P[u]] + rmq[P[v]] - * rmq[P[query_lca(u, v)]] + ;
if (k > K)
printf("-1\n");
else
{
K = K - k + ;
printf("%d\n", t[query(T[u], T[v], query_lca(u, v), K)]);
}
}
}
return ;
}
whu-contest-2019(online)的更多相关文章
- 分享 KubeCon 2019 (上海)关于 Serverless 及 Knative 相关演讲会议
有幸参加了 KubeCon 2019 上海大会,并参加了 Knative 及 Serverless 相关的几场分享会,收获满满.这里简单介绍一下各个演讲主题的主要内容.详细的演讲主题文档可以在Kube ...
- Level Up - ICPC Southeastern Europe Contest 2019(简单DP)
题意:Steve玩魔兽世界要做任务升两级,任务在你不同的等级给的经验不同,输入任务数量和升第一级和升第二级需要的经验,接着输入每个任务第一级完成给的经验和花费的时间.第二级级完成给的经验和花费的时间. ...
- 2018-2019 ACM-ICPC Pacific Northwest Regional Contest C Contest Setting(DP)
比赛链接:Contest Setting C题 题意:$n$道题目,每道题目难度为$ai$,选择$k$道难度不同的题目,有多少种选择方案.$1<=k<=n<=1000,1<=a ...
- AtCoder Beginner Contest 086 (ABCD)
A - Product 题目链接:https://abc086.contest.atcoder.jp/tasks/abc086_a Time limit : 2sec / Memory limit : ...
- Programming Contest Ranking(题解)
Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...
- Gym - 101982C Contest Setting (动态规划)
A group of contest writers have written n problems and want to use k of them in an upcoming contest. ...
- Visual Studio 2019 (VS2019)正式版安装 Ankh SVN和VisualSVN插件
VS2019 正式版最近刚刚推出来,目前 Ankhsvn 还不支持,它最高只支持 VS2017,全网搜索了一下,也没有找到.在 Stackoverflow 上看了一下,找到这篇问答: 自己按照这种方法 ...
- AtCoder Beginner Contest 085(ABCD)
A - Already 2018 题目链接:https://abc085.contest.atcoder.jp/tasks/abc085_a Time limit : 2sec / Memory li ...
- AtCoder Beginner Contest 084(AB)
A - New Year 题目链接:https://abc084.contest.atcoder.jp/tasks/abc084_a Time limit : 2sec / Memory limit ...
- AtCoder Beginner Contest 083 (AB)
A - Libra 题目链接:https://abc083.contest.atcoder.jp/tasks/abc083_a Time limit : 2sec / Memory limit : 2 ...
随机推荐
- Android Studio 制作简单的App欢迎页面——基于Android 6.0
在许多的Android App中,我们点击进入时,都可以看到一个欢迎页面,大概持续了几秒,然后跳转至主页面.以下是我开发过程中总结出的一些方法和例子. 一.创建一个新的Activity 首先,新建了一 ...
- 关于STM32F103+ESP8266+阿里云过程之修改SDK支持UART和SmartConfig(四)
设备上报状态到阿里云成功之后,还要接受来至云端下发的命令,如APP.在ESP8266接受到数据之后可将数据先进行解析,再通过自定义协议与STM32进行串口通讯,也可以将接收到的数据中的信息直接传输到U ...
- docker挂载volume的用户权限问题,理解docker容器的uid
docker挂载volume的用户权限问题,理解docker容器的uid 在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题. 这里通过遇到的问题来理解docker容器用户 ...
- java volatile关键字作用及使用场景
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...
- Appium+python自动化(二十七)-让你在手机找到溜冰一样的感觉666,溜得飞起来 - 低级滑动(超详解)
简介 随着现在智能手机的普及和应用,小到五六岁或者更小的娃娃,老至七八十岁老头老太太都是智能手机的用户,基本上达到每个人都在用,每次在地铁或者公交上,就看看到这样的场面,手指不停地在手机屏幕上来来回回 ...
- 详解 git 忽略文件 删除远端仓库的文件
要解决的问题 忽略指定类型的文件 或 某个指定文件(夹) 将已经push到github的文件删除, 但本地的文件不删除 (写忽略规则之前就把这个文件夹push了 T_T ) 将想要忽略掉的文件的相关记 ...
- snort规则中byte_test参数详解
例子: byte_test:4,>,1000,20 这里是从本规则内前面匹配的位置结尾开始,向后偏移20个字节,再获取后面的4个字节的数据,与十进制数据1000进行比较,如果大于1000,就命中 ...
- [Inno Setup]写入注册表时32位系统和64位系统的路由
昨天下午组内一位同事跟说,他想在Inno Setup的安装包中写入一个注册表.目标位置是HKLM:\Software\下面创建自己的注册表项.然后说尝试了好几次都不行, 但是往HKCU下面写入却是OK ...
- A solution to the never shortened to-do list
I once told my younger sister my learning system, and the basic five doctrines of my methodology. Bu ...
- pythonday06数据类型(四)
今日内容 1.集合 2内存相关 1.集合set 无序 无重复 v = {1,2,3,4,5,6,99,100} # 疑问:v = {} """ None int v1 = ...