CODE FESTIVAL 2016 qual C题解
\(A\)
什么玩意儿……
const int N=105;
char s[N];int n,f1,f2;
int main(){
scanf("%s",s+1),n=strlen(s+1);
fp(i,1,n)if(s[i]=='C')f1=1;
else if(f1&&s[i]=='F')f2=1;
puts(f2?"Yes":"No");
return 0;
}
\(B\)
什么玩意儿……
const int N=105;
int a[N],n,k,mx;
int main(){
scanf("%d%d",&k,&n);
fp(i,1,n)scanf("%d",&a[i]),cmax(mx,a[i]);
printf("%d\n",(mx<<1)<=k?0:mx-(k-mx)-1);
return 0;
}
\(C\)
对于所有前缀后缀最大值变化的位置,它们的值是一定的,判断这样的取值是否合法,如果合法的话,对于所有没有确定的位置取合法的就可以了
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=5e5+5;
int a[N],b[N],c[N],n,res=1;
inline int min(R int x,R int y){return x<y?x:y;}
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%d",&b[i]);
fp(i,1,n)scanf("%d",&c[i]);
fp(i,1,n)if(b[i]!=b[i-1])a[i]=b[i];
fd(i,n,1)if(c[i]!=c[i+1])a[i]=c[i];
for(R int i=1,mx=0;i<=n;++i){
cmax(mx,a[i]);
if(mx!=b[i])return puts("0"),0;
}
for(R int i=n,mx=0;i;--i){
cmax(mx,a[i]);
if(mx!=c[i])return puts("0"),0;
}
fp(i,1,n)if(!a[i])res=mul(res,min(b[i],c[i]));
printf("%d\n",res);
return 0;
}
\(D\)
首先发现每两列之间是互相独立的,也就是说如果我们算出每相邻两列的答案,最后加起来就是最终的答案了,证明就不写了
然后问题转化为计算两列之间的答案,方便起见沿对角线翻转一下,记\(f[i][j]\)表示前一行还剩下\(i\)的前缀,后一行还剩下\(j\)的前缀,最小代价为多少,最后\(f[m][m]\)就是答案
\(f\)的转移显然,唯一的问题在于计算\(g[i][j]\)表示前一行\(i\)的前缀和后一行\(j\)的前缀,这种状态下有多少是重合的,暴力计算\(O(n^3)\),前缀和优化一下就可以\(O(n^2)\)了
最后总复杂度\(O(n^3)\),具体细节可以看代码
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=305;
char mp[N][N],s[N][N];int f[N][N],n,m,res;
int calc(R int id){
fp(i,1,m)fp(j,1,m)f[i][j]=(s[id][i]==s[id+1][j]);
fp(i,1,m)fp(j,1,m)f[i][j]+=f[i-1][j-1];
fp(i,1,m)fp(j,1,m)f[i][j]+=min(f[i-1][j],f[i][j-1]);
return f[m][m];
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
fp(i,1,n)scanf("%s",mp[i]+1);
fp(i,1,n)fp(j,1,m)s[j][i]=mp[i][j];
swap(n,m);
fp(i,1,n-1)res+=calc(i);
printf("%d\n",res);
return 0;
}
\(E\)
根据康托展开,一个排列\(p_i\)在所有排列中的排名为\(\sum\limits_{i=1}^na_i(n-i)!\),其中\(a_i\)表示满足\(j>i\)且\(p_j<p_i\)的\(j\)的个数,即对于一个逆序对\((i,j)\),对答案的贡献是\((n-i)!\)
那么我们对于\(i,j\)为已知数和未知数的情况分别考虑就好了,具体细节看代码
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=5e5+5;
int c[N],s[N],suf[N],a[N],vis[N],fac[N],cnt,m,n,res,sum;
inline void chg(R int x){for(;x<=n;x+=x&-x)++c[x];}
inline int query(R int x){R int res=0;for(;x;x-=x&-x)res+=c[x];return res;}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n),m=n;
fp(i,1,n){
scanf("%d",&a[i]);
if(a[i])++s[a[i]],--m;
}
fp(i,1,n)suf[i]=s[i]=1-s[i],s[i]+=s[i-1];
fd(i,n,1)suf[i]+=suf[i+1];
fac[0]=1;fp(i,1,n)fac[i]=mul(fac[i-1],i);
fd(i,n,1)if(!a[i])++cnt;
else{
sum=mul(query(a[i]-1),fac[m]);
if(cnt)upd(sum,1ll*cnt*s[a[i]]%P*fac[m-1]%P);
upd(res,mul(sum,fac[n-i]));
chg(a[i]);
}
cnt=sum=0;
fp(i,1,n)if(!a[i])upd(sum,fac[n-i]),++cnt;
else if(cnt)upd(res,1ll*sum*suf[a[i]]%P*fac[m-1]%P);
sum=(1ll*m*(m-1)>>1)%P,cnt=0;
if(m>=2)fp(i,1,n)if(!a[i])++cnt,upd(res,1ll*sum*(m-cnt)%P*fac[m-2]%P*fac[n-i]%P);
upd(res,fac[m]);
printf("%d\n",res);
return 0;
}
CODE FESTIVAL 2016 qual C题解的更多相关文章
- CODE FESTIVAL 2016 qual B题解
传送门 \(A\) 什么玩意儿-- const char t[]={"0CODEFESTIVAL2016"}; char s[25];int res; int main(){ sc ...
- CODE FESTIVAL 2016 qual A题解
传送门 不知道为什么\(AGC\)系列的题里突然多了这些--那就做吧-- \(A\) 什么玩意儿-- upd:因为没看到最后要加换行居然没有\(1A\)好气哦-- const int N=15; ch ...
- 【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 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- 【AtCoder】CODE FESTIVAL 2016 qual C
CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...
- CODE FESTIVAL 2017 qual A 题解
补一发A的题解. A - Snuke's favorite YAKINIKU 题意: 输入字符串S,如果以YAKI开头输出Yes,否则输出No. #include<bits/stdc++.h&g ...
- CODE FESTIVAL 2016 Grand Final 题解
传送门 越学觉得自己越蠢--这场除了\(A\)之外一道都不会-- \(A\) 贪心从左往右扫,能匹配就匹配就好了 //quming #include<bits/stdc++.h> #def ...
- CODE FESTIVAL 2017 qual B 题解
失踪人口回归.撒花\^o^/ 说来真是惭愧,NOI之后就没怎么刷过题,就写了几道集训队作业题,打了几场比赛还烂的不行,atcoder至今是蓝名=.= 以后还是多更一些博客吧,我可不想清华集训的时候就退 ...
随机推荐
- Python2与Python3兼容
Python2与Python3兼容 python3写的代码如何也能在pyhon2上跑?请无论如何加上这一句,python3没有啥影响 from __future__ import absolute_i ...
- power shell命令添加SharePoint用户组与用户(用户为域用户)
查看SharePoint用户组 Get-PnPGroup 查看某一用户组 Get-PnPGroup -Identity "用户组名" 查看某一用户组下的所有成员 Get-PnPGr ...
- java容易混淆的概念
容易混淆的内容 1.JVM内存模型 2.Java内存模型 3.Java对象模型 JVM内存模型 1.堆 2.虚拟机栈 3.本地方法栈 4.程序计数器 5.方法区 Java内存模型 Java堆和方法区的 ...
- 【转载】C#中List集合使用Last方法获取最后一个元素
在C#的List集合操作过程中,如果要获取List集合中的最后一个元素对象,则一般会先通过获取到list集合的个数Count属性,然后再使用索引的方式获取到该集合的最后一个位置的元素信息.其实在Lis ...
- datagridview控件 索引-1没有值
很多WINFORM的开发人员在DataGridView的开发当中,都会出现“索引-1没有值”这个烦人的问题,其实较早之前,我已经大概知道问题的所在,也找到了解决方法,不过一直没有时间去深入研究一下,今 ...
- H5调起IOS原生商店支付
参考文档:http://www.html5plus.org/doc/zh_cn/payment.html 申请内购项目摘自 https://www.jianshu.com/p/1e79bfbe46e2 ...
- Spring Boot 笔记 (1) - Maven、基本配置、Profile的使用
一. Spring Boot 简介 开箱即用的一站式 Java EE 解决方案 Spring 技术栈的大整合 核心问题 暂时无法回答 Spring Boot 和 SOA 有什么区别? Spring B ...
- 将Maven项目部署云服务器流程
1.数据库分离,存入项目: 2.将分离出的数据库导入云端服务器 将sql文件上传到服务器中 进去云端数据库输入命令:source 云服务器中sql文件地址 3.设置两种配置,修改匹配: 4.mave ...
- 基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
1. 综述 由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用. 本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具 ...
- sklearn 翻译笔记:KNeighborsClassifier
今天做机器学习knn的实现想使用sklearn这个模块,但是里面的函数不懂,无奈只能查文档,但是一大片英文看见我就烦,也不是说不能看 但是以我低下的英语水平实在是太费劲了.幸好找到一篇前人翻译的比较 ...