【AtCoder】Mujin Programming Challenge 2017
Mujin Programming Challenge 2017
A - Robot Racing
如果每个数都是一个一个间隔开的,那么答案是\(n!\)
考虑把一个数挪到1,第二个数挪到3,以此类推,如果不行,证明前面中有个数肯定会被选择,所以任意选一个数到终点,继续这样的操作
最后剩下的乘一个阶乘即可
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int N,ans;
int x[MAXN];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) read(x[i]);
int pre = 0;
int cnt = 0,ans = 1;
for(int i = 1 ; i <= N ; ++i) {
if(x[i] > pre) {++cnt;pre += 2;}
else ans = mul(ans,cnt + 1);
}
for(int i = 1 ; i <= cnt ; ++i) ans = mul(ans,i);
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
B - Row to Column
显然我们必须先恢复出一行来,然后去更新一开始没有全满的列
要么是第j列有黑格子,我们用它去恢复出第j行,要么给第j列创造一个黑格子,恢复出第j行
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N;
char s[505][505];
int sumr[505],sumc[505];
bool vis[505];
void Solve() {
read(N);
bool flag = 0;
for(int i = 1 ; i <= N ; ++i) {
scanf("%s",s[i] + 1);
for(int j = 1 ; j <= N ; ++j) {
if(s[i][j] == '#') flag = 1;
}
}
if(!flag) {
puts("-1");return;
}
for(int i = 1 ; i <= N ; ++i) {
for(int j = 1 ; j <= N ; ++j) {
if(s[i][j] == '#') vis[j] = 1;
}
}
int cnt = 0;
for(int j = 1 ; j <= N ; ++j) {
int c = 0;
for(int i = 1 ; i <= N ; ++i) {
c += (s[i][j] == '#');
}
if(c == N) ++cnt;
}
int ans = 2 * N;
for(int i = 1 ; i <= N ; ++i) {
int c = 0;
for(int j = 1 ; j <= N ; ++j) {
c += (s[i][j] == '.');
}
ans = min(ans,c + N - cnt + (vis[i] ^ 1));
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
C - Robot and String
用处理出\(nxt(l)\)表示l之后到第几个位置能变成空
同时记录\(nxt_{a}(l),nxt_{b}(l)\)一直到z,初始时候先把s[l + 1]的数设成l + 1,然后从这个位置开始循环更新
然后我们一次询问就是不断的\(nxt(l - 1)\)嵌套,我们处理出2的次幂次操作即可
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 500005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N;
char s[MAXN];
int nxt[MAXN][27],ri[MAXN][27];
void Solve() {
scanf("%s",s + 1);
N = strlen(s + 1);
for(int i = 0 ; i <= N + 1; ++i) {
for(int j = 0 ; j <= 26 ; ++j) {
nxt[i][j] = N + 1;
}
}
for(int i = 0 ; i <= N + 1 ; ++i) {
for(int j = 0 ; j <= 19 ; ++j) ri[i][j] = N + 1;
}
for(int i = N - 1 ; i >= 0 ; --i) {
int x = s[i + 1] - 'a';
nxt[i][x] = i + 1;
for(int j = x + 1 ; j <= 26 ; ++j) {
nxt[i][j] = nxt[nxt[i][j - 1]][j - 1];
}
for(int j = 0 ; j < x ; ++j) {
nxt[i][j] = nxt[nxt[i][26]][j];
}
}
for(int j = 0 ; j <= 19 ; ++j) {
for(int i = N - 1 ; i >= 0 ; --i) {
if(j == 0) ri[i][j] = nxt[i][26];
else ri[i][j] = ri[ri[i][j - 1]][j - 1];
}
}
int Q;
read(Q);
int l,r;
for(int i = 1 ; i <= Q ; ++i) {
read(l);read(r);
--l;
for(int j = 19 ; j >= 0 ; --j) {
if(ri[l][j] <= r) l = ri[l][j];
}
if(l == r) puts("Yes");
else puts("No");
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
D - Oriented Tree
显然D是直径上取整
然后我们给每个点做一个标号,任取一个点\(h(v) = 0\)
如果\(u\rightarrow v\)有一条边那么\(h(v) - h(u) = 1\)
最后可以定义\(d(s,t) = (dist(s,t) + h(s) - h(t))/ 2\)
如果直径是偶数,那么可以发现
\(|h(s) - h(t)| \leq 2D - dist(s,t)\)
找到直径的中心\(r\),距离中心距离为\(D\)的点,显然标号应该一样,假设标号都是0,我们可以得到任意一点u都有\(|h(u)| \leq D - dist(r,u)\)
这个是必要的,也是充分的,对于任意两点\(u,v\)
\(|h(u) - h(v)| \leq |h(u)| + |h(v)| \leq 2D - dist(r,u) - dist(r,v) \leq 2D - dist(u,v)\)
所以我们认为\(|h(u)| \leq D - dist(r,u)\),做一个dp,可以得到所有解
如果直径是奇数,就有了两个中心,一个是s,一个是t
我们认为\(dist(u,s) < dist(t,u)\)的是白点,否则是黑点,那么有两种情况
如果u是白点,\(|h(u)| \leq D - 1 - dist(u,s)\)
如果u是黑点,\(|h(u)| \leq D - dist(u,t)\)
或者
u是白点,\(|h(u)| \leq D - dist(u,s)\)
u是黑点,\(|h(u)| \leq D - 1 - dist(u,t)\)
但是这两种情况有交集
就是白点的距离s最远的点全是0,另一边距离最远的全是-1,或者全是+1,这个时候我们如果所有点同时-1或者同时+1,会发现这两种情况等价但是我们重复统计了
这个时候条件是
u是白点,\(|h(u)| \leq D - dist(u,s)\)
u是黑点,\(|h(u) + 1| \leq D - dist(u,t)\)
或者是
u是白点,\(|h(u)| \leq D - dist(u,s)\)
u是黑点,\(|h(u) - 1| \leq D - dist(u,t)\)
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 1005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007,V = 505;
struct node {
int to,next;
}E[MAXN * 2];
int sumE,head[MAXN];
int N;
int dis[MAXN],fa[MAXN],D;
int dp[MAXN][MAXN * 2];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
void dfs(int u) {
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa[u]) {
fa[v] = u;
dis[v] = dis[u] + 1;
dfs(v);
}
}
}
void dfs1(int u,int lim,int on) {
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa[u]) {
dfs1(v,lim,on);
}
}
int l = dis[u] - lim - on,r = lim - dis[u] - on;
for(int i = l + V ; i <= r + V; ++i) {
dp[u][i] = 1;
for(int j = head[u] ; j ; j = E[j].next) {
int v = E[j].to;
if(v != fa[u]) {
int t = inc(dp[v][i - 1],dp[v][i + 1]);
dp[u][i] = mul(dp[u][i],t);
}
}
}
}
int Process_even(int rt) {
fa[rt] = 0;dis[rt] = 0;
dfs(rt);
memset(dp,0,sizeof(dp));
dfs1(rt,D,0);
int ans = 0;
for(int i = 0 ; i <= V * 2 ; ++i) {
update(ans,dp[rt][i]);
}
return ans;
}
int Process_odd(int s,int t,int on) {
fa[s] = t;fa[t] = s;dis[s] = 0;dis[t] = 0;
dfs(s);dfs(t);
memset(dp,0,sizeof(dp));
dfs1(s,D - 1,0);
dfs1(t,D,on);
int ans = 0;
for(int i = 1 ; i <= V * 2 ; ++i) {
update(ans,mul(dp[s][i],inc(dp[t][i - 1],dp[t][i + 1])));
}
return ans;
}
void Solve() {
read(N);
int a,b;
for(int i = 1 ; i < N ; ++i) {read(a);read(b);add(a,b);add(b,a);}
dis[1] = 0;fa[1] = 0;dfs(1);
int u = 1;
for(int i = 2 ; i <= N ; ++i) {
if(dis[i] > dis[u]) u = i;
}
dis[u] = 0;fa[u] = 0;
dfs(u);
u = 1;
for(int i = 2 ; i <= N ; ++i) {
if(dis[i] > dis[u]) u = i;
}
if(dis[u] % 2 == 0) {
int r = u;
for(int i = 1 ; i <= dis[u] / 2 ; ++i) r = fa[r];
D = dis[u] / 2;
int ans = Process_even(r);
out(ans);enter;
}
else {
int s = u;
for(int i = 1 ; i <= dis[u] / 2 ; ++i) s = fa[s];
int t = fa[s];
D = dis[u] / 2 + 1;
int ans = inc(Process_odd(s,t,0),Process_odd(t,s,0));
update(ans,MOD - Process_odd(s,t,-1));
update(ans,MOD - Process_odd(s,t,1));
out(ans);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【AtCoder】Mujin Programming Challenge 2017的更多相关文章
- 【AtCoder】AISing Programming Contest 2019
本来以为是1199rated的..仔细一看发现是1999,所以就做了一下 这场涨分很轻松啊...为啥又没打 等pkuwc考完我一定打一场atcoder(咕咕咕,咕咕咕,咕咕咕咕咕咕咕~) 但是其实我思 ...
- 【AtCoder】M-SOLUTIONS Programming Contest
M-SOLUTIONS Programming Contest A - Sum of Interior Angles #include <bits/stdc++.h> #define fi ...
- 【AtCoder】Yahoo Programming Contest 2019
A - Anti-Adjacency K <= (N + 1) / 2 #include <bits/stdc++.h> #define fi first #define se se ...
- 【AtCoder】KEYENCE Programming Contest 2019
A - Beginning 这个年份恐怕需要+2 #include <bits/stdc++.h> #define fi first #define se second #define p ...
- 【AtCoder】Dwango Programming Contest V题解
A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...
- Mujin Programming Challenge 2017题解
传送门 \(A\) 似乎并不难啊然而还是没想出来-- 首先我们发现对于一个数\(k\),它能第一个走到当且仅当对于每一个\(i<k\)满足\(x_i\geq 2i-1\),这样我们就可以把所有的 ...
- 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring
[题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...
- 【Atcoder】CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
[题意]给定只含小写字母的字符串,要求分割成若干段使段内字母重组顺序后能得到回文串,求最少分割段数.n<=2*10^5 [算法]DP [题解]关键在于快速判断一个字符子串是否合法,容易发现合法仅 ...
- 【AtCoder】ARC092 D - Two Sequences
[题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...
随机推荐
- [Hdoj] Fast Matrix Calculation
题面:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题解:https://www.zybuluo.com/wsndy-xx/note/1153981
- seq2seq聊天模型(一)
原创文章,转载请注明出处 最近完成了sqe2seq聊天模型,磕磕碰碰的遇到不少问题,最终总算是做出来了,并符合自己的预期结果. 本文目的 利用流程图,从理论方面,回顾,总结seq2seq模型, seq ...
- C++常用字符串函数使用整理
strlen(字符数组) 功能:求字符串长度. 说明:该函数的实参可以是字符数组名,也可以是字符串. 使用样例: char s1[80] = "China"; cout<&l ...
- ICEM—非结构化周期网格
原视频下载地址:https://yunpan.cn/cPBnmsNheJ46q 访问密码 3441
- 重读APUE(10)-中断的系统调用
如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就会被中断而不再继续执行:该系统调用返回出错,其errno设置为EINTR: 系统将系统调用分成两类:低速系统调用和其他系统调用:低 ...
- Server2012R2实现活动目录(Active Directory)双域控制器互为冗余
在活动目录中部署两台主控域控制器,两台域控制器互为冗余. Server 2012 R2新建活动目录和DC refer to: https://www.cnblogs.com/jfzhu/p/40061 ...
- Mysql 清空数据后,释放硬盘文件
删除表数据后执行:optimize table [表名]
- 《maven实战》笔记(5)----maven的版本
maven中构件和项目都有自己的版本,其中分为稳定的发布版本和不稳定的快照版本. 1.0.0.1.3-alpha-4和2.0就是稳定版本,而2.1-SNAPSHOT和2.1-20091214.2214 ...
- 21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
21.Merge Two Sorted Lists 初始化一个指针作为开头,然后返回这个指针的next class Solution { public: ListNode* mergeTwoLists ...
- Java NIO学习笔记八 DatagramChannel
Java NIO DatagramChannel Java NIO DatagramChannel是可以发送和接收UDP数据包的通道.由于UDP是一种无连接网络协议,因此您不能默认读取和写入Datag ...