CODE FESTIVAL 2016 qual B题解
\(A\)
什么玩意儿……
const char t[]={"0CODEFESTIVAL2016"};
char s[25];int res;
int main(){
scanf("%s",s+1);
fp(i,1,16)res+=s[i]!=t[i];
printf("%d\n",res);
return 0;
}
\(B\)
什么玩意儿……
const int N=1e5+5;
char s[N];int a,b,n,c,cc;
int main(){
scanf("%d%d%d%s",&n,&a,&b,s+1),a+=b;
fp(i,1,n){
switch(s[i]){
case 'c':puts("No");break;
case 'a':puts(c+1<=a?(++c,"Yes"):"No");break;
case 'b':puts(c+1<=a&&cc+1<=b?(++c,++cc,"Yes"):"No");break;
}
}
return 0;
}
\(C\)
显然需要连成一棵树,且贪心选取边来连接,如果当前连的边是左右连接的,且上下连接的边总共连了\(c\)条,那么说明每一列只有\(m+1-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;
typedef long long ll;
const int N=5e5+5;
ll res;int a[N],op[N],id[N],top,n,m,c,d;
inline bool cmp(const int &x,const int &y){return a[x]<a[y];}
int main(){
scanf("%d%d",&n,&m);
fp(i,1,n)++top,scanf("%d",&a[top]),op[top]=0,id[top]=top;
fp(i,1,m)++top,scanf("%d",&a[top]),op[top]=1,id[top]=top;
sort(id+1,id+1+top,cmp);
fp(i,1,top){
// printf("%d %d %d\n",id[i],a[id[i]],op[id[i]]);
if(!op[id[i]])res+=1ll*a[id[i]]*(m+1-d),++c;
else res+=1ll*a[id[i]]*(n+1-c),++d;
}
printf("%lld\n",res);
return 0;
}
\(D\)
还是贪心,一个贪心是先处理完前面再处理完后面,一个贪心是对于每一个点选择可以卖给他的价格最小的物品卖,记前\(i-1\)个人中剩余钱数最多的人钱数为\(mn\),那么卖给第\(i\)个人的商品价格就是\(mn+1\),如果\(a_i=mn+1\)就一个都买不了,并且\(++mn\),否则我们贪心卖到至少还有一元钱剩余就行了
然而有一种情况是第\(i\)个人还剩下恰好\(mn+1\)元,根据贪心期间肯定是不让\(mn\)增加最优,那么我们肯定可以在之前得到某一次卖的商品价格\(+1\),这样就不会令\(mn\)增加了
//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;
typedef long long ll;
const int N=5e5+5,inf=0x3f3f3f3f;
ll res;int a[N],n,mn;
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%d",&a[i]);
res=a[1]-1,mn=1;
fp(i,2,n){
if(a[i]==mn+1)++mn;
else res+=(a[i]-1)/(mn+1);
}
printf("%lld\n",res);
return 0;
}
\(E\)
首先考虑一个暴力的想法,先把所有的串扔到\(trie\)树里,然后对于询问直接在\(trie\)树上匹配这个串,同时把所有字典序小于当前转移的子树里的串的个数加入答案
这样显然要挂掉,而且我们也不可能\(26!\)枚举所有字母的大小
设\(i,j\)为两个不同的转移,考虑到\(i\)这个转移会对\(j\)的子树造成贡献,当且仅当重定义之后的字母中\(i<j\),也就是说会对答案造成影响的总共只有\(26\times 26\)种状态
那么我们对于\(trie\)树上的每一个节点,记录一个\(cnt[p][i]\),表示当处于节点\(p\),且状态为\(i\)(\(i\)表示一种大小关系,假设它表示\(a<b\),也就是说\(a\)这个字母字典序比\(b\)小),此时按照暴力匹配之后的贡献是多少,即从根节点走到\(p\)的过程中如果转移是\(b\)就加上\(a\)那棵子树的\(size\),那么\(cnt[p][i]\)表示那些\(size\)的和
这样对于一个询问,直接枚举所有的大小关系并加上对应的贡献即可
复杂度\(O((n+q)26^2)\)
具体细节可以参考代码
//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=5e5+5,M=676;
char t[N];int sz[N],size[N],pos[N],fa[N],ch[N][26];
int id[N],bg[N],len[N],pi[26],n,q,nd;
vector<int>cnt[N];
void ins(R int ID,R int len){
R int p=0;
for(R int i=1,c;i<=len;++i){
c=t[i]-'a';
if(!ch[p][c])ch[p][c]=++nd;
p=ch[p][c],++sz[p];
}
id[p]=ID,pos[ID]=p;
}
void dfs(int p,int ga,int s){
fa[p]=ga;if(ga==-1)cnt[p].resize(M),fa[p]=p;
if(id[p])++s,size[id[p]]=s;
R int cp=0;fp(i,0,25)cp+=(ch[p][i]!=0);
ga=fa[p];if(cp>1)ga=-1;
fp(i,0,25)if(ch[p][i])dfs(ch[p][i],ga,s);
}
void dd(int p,int ga){
if(p&&fa[p]==p)fp(i,0,M-1)cnt[p][i]+=cnt[ga][i];
fp(i,0,25)if(ch[p][i])fp(j,i+1,25)if(ch[p][j]){
cnt[ch[p][i]][j*26+i]+=sz[ch[p][j]];
cnt[ch[p][j]][i*26+j]+=sz[ch[p][i]];
}
fp(i,0,25)if(ch[p][i])dd(ch[p][i],fa[p]);
}
int solve(int k){
R int res=size[k];
fp(i,0,25)fp(j,i+1,25)res+=cnt[fa[pos[k]]][pi[i]*26+pi[j]];
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
fp(i,1,n)scanf("%s",t+1),len[i]=strlen(t+1),ins(i,len[i]);
dfs(0,-1,0);dd(0,-1);
scanf("%d",&q);
for(R int k;q;--q){
scanf("%d%s",&k,t+1);
fp(i,1,26)pi[i-1]=t[i]-'a';
printf("%d\n",solve(k));
}
return 0;
}
CODE FESTIVAL 2016 qual B题解的更多相关文章
- CODE FESTIVAL 2016 qual C题解
传送门 \(A\) 什么玩意儿-- const int N=105; char s[N];int n,f1,f2; int main(){ scanf("%s",s+1),n=st ...
- 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至今是蓝名=.= 以后还是多更一些博客吧,我可不想清华集训的时候就退 ...
随机推荐
- java mybatis
mybatis简单使用记录一下 mybatis官网:http://www.mybatis.org/mybatis-3/ 参考博客:https://blog.csdn.net/iku5200/artic ...
- JavaScript对象复制
近期项目因为怕数据污染所以用到了js的对象复制 js里的对象都是继承自object,是引用类型,所以无法通过=号复制 所以整理了一些常用的复制方法,如下 一.通过JSON序列化和反序列化创建新的对象 ...
- 实战FFmpeg--iOS平台使用FFmpeg将视频文件转换为YUV文件
做播放器的开发这里面涉及的东西太多,我只能一步步往前走,慢慢深入.播放器播放视频采用的是渲染yuv文件.首先,要知道yuv文件是怎么转换得来的,其次,要知道怎么把视频文件保存为yuv文件.雷神的文章1 ...
- 谈一谈做iOS播放器库开发所涉及的知识点
在自己研究生毕业的时候,想着能找上一份做视频编解码的工作,可惜没有如愿,最后到了一家iOS游戏渠道公司去做游戏支付业务的SDK开发,我的iOS正式开发生涯就这么开始了. 在那家iOS游戏渠道没做上一年 ...
- ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了
之前Jerry已经写了一系列SAP Cloud Platform ABAP编程环境的文章,当时使用的环境,是SAP专门为SAP社区导师们创建的. 当时也有朋友留言,询问大家何时才能使用到免费的SAP云 ...
- Linux记录history命令
对后面的(1)方法的提取文件改写法(强烈推荐) 记录存储位置: mkdir -p /usr/local/records chmod 777 /usr/local/records/chmod +t /u ...
- Spring Boot 笔记 (2) - 使用 log4j2 记日志
日志框架的选用 Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考: Spri ...
- mysql学习之基础篇04
五种基本子句查询 查询是mysql中最重要的一环,我们今天就来说一下select的五种子句中的where条件查询: 首先我们先建立一张商品表:goods 由于商品数目太多,我就不一一列举了. 在这里我 ...
- 使用fail2ban预防被挖洞的笔记
参考:https://blog.csdn.net/dorisnzy/article/details/82926067 1.安装fail2ban: yum -y install epel-release ...
- python协程详解,gevent asyncio
python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...