【AtCoder】CODE FESTIVAL 2016 qual C
CODE FESTIVAL 2016 qual C
A - CF
……
#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);
}
string s;
void Solve() {
cin >> s;
bool f = 0;
for(int i = s.length() - 1 ; i >= 0 ; --i) {
if(s[i] == 'F') f = 1;
if(s[i] == 'C' && f) {
puts("Yes");return;
}
}
puts("No");
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
B - K個のケーキ / K Cakes
找到最多的一天个数是m,如果m > K - m答案就是2m - K - 1
#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 K,T,a[105];
void Solve() {
read(K);read(T);
int m = 0;
for(int i = 1 ; i <= T ; ++i) {
read(a[i]);
m = max(a[i],m);
}
if(K - m >= m) {puts("0");return;}
else {out(m - (K - m) - 1);enter;}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
C - 二人のアルピニスト / Two Alpinists
如果是最大值变化的地方,那么必然是个固定值,我们判断如果两个都固定了某值,这两个值相不相等,如果只有一个地方固定了,那么看看满不满足另一边的条件
如果都没固定就是这个位置两边最大值较小的那个及以下都可以实现
#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 T[MAXN],A[MAXN];
int N;
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) read(T[i]);
for(int i = 1 ; i <= N ; ++i) read(A[i]);
int ans = 1;
for(int i = 1 ; i <= N ; ++i) {
if(T[i] != T[i - 1] || A[i] != A[i + 1]) {
int a = -1,b = -1;
if(T[i] != T[i - 1]) a = T[i];
if(A[i] != A[i + 1]) b = A[i];
if(a != -1 && b != -1) {
if(a != b) {puts("0");return;}
}
if(b > T[i]) {puts("0");return;}
if(a > A[i]) {puts("0");return;}
}
else {
ans = mul(ans,min(A[i],T[i]));
}
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
D - Friction
如果只有两列,设\(dp[i][j]\)为第一列下移了i第二列下移了j
转移是\(dp[i][j] = min(dp[i - 1][j] + cost[i - 1][j],dp[i][j - 1] + cost[i][j - 1])\)
\(cost[i][j]\)可以用\(H^2\)求出,先暴力求出所有某一维为0的大小,然后从\(cost[i - 1][j - 1]\)转移过来,看看消掉的那一位是否相同
而很多列的话,我们可以对相邻两列都做一遍,这样是合法的,因为我们先把第一列和第二列的最优方案确定了,我们第二列和第三列就可以忽视掉第一列,把第三列的最优答案放在第二列的相对位置,以此类推
#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);
}
int64 dp[305][305],ans,cost[305][305];
int H,W;
char s[305][305];
void Solve() {
read(H);read(W);
for(int i = 1 ; i <= H ; ++i) scanf("%s",s[i] + 1);
for(int i = 1 ; i < W ; ++i) {
for(int j = 0 ; j <= H ; ++j) {
for(int h = 0 ; h <= H ; ++h) {
dp[j][h] = 1e18;
}
}
dp[0][0] = 0;
memset(cost,0,sizeof(cost));
for(int j = 0 ; j <= H ; ++j) {
int p1 = H - j,p2 = H;
while(p1 >= 1 && p2 >= 1) {
if(s[p1][i] == s[p2][i + 1]) ++cost[j][0];
--p1;--p2;
}
}
for(int j = 1 ; j <= H ; ++j) {
int p1 = H,p2 = H - j;
while(p1 >= 1 && p2 >= 1) {
if(s[p1][i] == s[p2][i + 1]) ++cost[0][j];
--p1;--p2;
}
}
for(int j = 1 ; j <= H ; ++j) {
for(int h = 1 ; h <= H ; ++h) {
cost[j][h] = cost[j - 1][h - 1] - (s[H - j + 1][i] == s[H - h + 1][i + 1]);
}
}
for(int j = 0 ; j <= H * 2 ; ++j) {
for(int h = 0 ; h <= min(j,H) ; ++h) {
int a = h,b = j - h;
if(a > H || b > H) continue;
int c = cost[a][b];
if(a + 1 <= H) {
dp[a + 1][b] = min(dp[a + 1][b],dp[a][b] + c);
}
if(b + 1 <= H) {
dp[a][b + 1] = min(dp[a][b + 1],dp[a][b] + c);
}
}
}
ans += dp[H][H];
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
E - 順列辞書 / Encyclopedia of Permutations
如果对于一个位置\(s_{i}\)我们这个排列能乘上的数就是
\((s_i - 1 - \sum_{j = 1}^{i - 1}(s_j < s_{i}))(N - i)!\)
忽略掉\((N - i)!\),我们对每个\(i\)统计括号里面的总和是多少
我们分开,统计对于位置i,有多少种排列,\(s_j\)小于\(s_i\)的个数和
然后加上所有排列的\(s_{i} - 1\)
前一项很好统计,设空的位置个数为\(K\),那么如果这一位有了一个数
答案就是\((p[i] - 1)K!\)
如果没有数,就是所有未填的数 - 1的总和\(sum\)
答案是\(sum(K - 1)!\)
第二项分开考虑
如果这一位是空位,那么j可以是一个有数的地方,这个时候是空位大于j的方案数,可以用一个前缀变量记一下
如果j没有数,就是在K个数里选2个,剩下任填的方案
如果这一位不是空位,\(j\)有数,那么只要用树状数组维护比\(p_i\)小且在i以前的\(p_j\)有多少个
如果\(j\)没数,就是在未填的数中选一个\(p_i\)小的数,然后填在\(j\)那里,剩下\(K - 1\)个任填
#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);
}
const int MOD = 1000000007;
int N;
int fac[MAXN],invfac[MAXN],p[MAXN],s[MAXN],k;
int tr[MAXN],ans[MAXN];
bool vis[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;
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = mul(res,t);
t = mul(t,t);
c >>= 1;
}
return res;
}
int C(int n,int m) {
if(n < m) return 0;
return mul(fac[n],mul(invfac[m],invfac[n - m]));
}
int lowbit(int x) {return x & (-x);}
void insert(int x,int c) {
while(x <= N) {
tr[x] = inc(tr[x],c);
x += lowbit(x);
}
}
int query(int x) {
int r = 0;
while(x > 0) {
r = inc(r,tr[x]);
x -= lowbit(x);
}
return r;
}
void update(int &x,int y) {
x = inc(x,y);
}
void Solve() {
read(N);
fac[0] = 1;
for(int i = 1 ; i <= N ; ++i) {
fac[i] = mul(fac[i - 1],i);
}
invfac[N] = fpow(fac[N],MOD - 2);
for(int i = N - 1 ; i >= 0 ; --i) {
invfac[i] = mul(invfac[i + 1],i + 1);
}
for(int i = 1 ; i <= N ; ++i) {
read(p[i]);
if(p[i]) vis[p[i]] = 1;
else ++k;
}
int sum = 0;
for(int i = N ; i >= 1 ; --i) {
s[i] += s[i + 1];
if(!vis[i]) {
s[i]++;
update(sum,i - 1);
}
}
int pre = 0;
int rem = 0;
for(int i = 1 ; i <= N ; ++i) {
if(!p[i]) {
update(ans[i],MOD - pre);
if(k >= 2) update(ans[i],MOD - mul(rem,mul(C(k,2),fac[k - 2])));
update(ans[i],mul(sum,fac[k - 1]));
++rem;
}
else {
update(ans[i],mul(p[i] - 1,fac[k]));
update(ans[i],MOD - mul(query(p[i] - 1),fac[k]));
if(k) update(ans[i],MOD - mul(rem,mul(s[1] - s[p[i]],fac[k - 1])));
if(k) update(pre,mul(s[p[i] + 1],fac[k - 1]));
insert(p[i],1);
}
}
int res = fac[k];
for(int i = 1 ; i <= N ; ++i) {
update(res,mul(fac[N - i],ans[i]));
}
out(res);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【AtCoder】CODE FESTIVAL 2016 qual C的更多相关文章
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- 【AtCoder】CODE FESTIVAL 2016 qual B
CODE FESTIVAL 2016 qual B A - Signboard -- #include <bits/stdc++.h> #define fi first #define s ...
- 【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】CODE FESTIVAL 2017 qual A
A - Snuke's favorite YAKINIKU -- #include <bits/stdc++.h> #define fi first #define se second # ...
- 【AtCoder】CODE FESTIVAL 2017 qual B
最近不知道为啥被安利了饥荒,但是不能再玩物丧志了,不能颓了 饥荒真好玩 A - XXFESTIVAL CCFESTIVAL #include <bits/stdc++.h> #define ...
- 【AtCoder】CODE FESTIVAL 2017 qual C
A - Can you get AC? No #include <bits/stdc++.h> #define fi first #define se second #define pii ...
- 【AtCoder】CODE FESTIVAL 2017 Final
A - AKIBA 模拟即可 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pair ...
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...
随机推荐
- Simple Problem with Integers(POJ 3486)
A Simple Problem with Integers Time Li ...
- Windows 消息以及消息处理算法--线程和消息队列详解
Windows以消息驱动的方式,使得线程能够通过处理消息来响应外界. Windows 为每个需要接受消息和处理消息的线程建立消息队列(包括发送消息队列,登记消息队列,输入消息队列,响应消息队列),其中 ...
- openpyxl -用于读/写Excel 2010 XLSX/XLSM文件的python库
openpyxl -用于读/写Excel 2010 XLSX/XLSM文件的python库¶ https://www.osgeo.cn/openpyxl/index.html
- C# 窗体 类似framest 左侧点击右侧显示 左侧菜单右侧显示
首先托一个splitContainer调节大小位置 然后进行再新创建一个窗体名为add 在左侧拖入button按钮 进入代码阶段 更改属性 public Main() { InitializeComp ...
- Spring入门IOC和AOP学习笔记
Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...
- mvc partialView断点调试问题
mvc中的partialview 在前端f12调试时,默认看不到代码的. 在Js中加上debugger; 调试时会走到断点,多出个VM打头的局部视图页面.
- Qt编写安防视频监控系统11-动态换肤
一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...
- Python之操作RabbitMQ
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...
- protobuf / Consul / 边缘计算 / MEC / CDN / Serverless / GraphQL / 微服务 / 网关 / 云原生 / Serverless (真能造概念啊!!!)
技术概念层出不穷,学吧!记录下自己多这些概念的理解 protobuf: 数据结构而已,类比XML, JSON consul 解决的只是微服务里的服务注册与发现,健康检查等. 边缘计算:可以理解为是指利 ...
- golang的下载与安装
golang的官网可能由于政策原因登陆不上. 所以可以到Go语言中文网下载:https://studygolang.com/dl 我下载的是go1.10.3.windows-amd64.msi安装包, ...