运气好,分到的房里我最先开始Hack C题,Hack了12个,听说F题沙雕莫队但我不会,最后剩不到15分钟想出E题做法打了一波结果挂了,最后虽然上分了但总有点不甘心。

最后A掉ABCD Hack+12 Rank:176 Rating:2109+47->2156

上次被黄学长D:“怎么说你也有2200了吧”,2100蒟蒻真是抱歉QAQ

A.Neverending competitions

题目大意:某人从家里飞出去再飞回来再飞出去再飞回来……,现在给你N张他用过的机票(N<=100),保证合法但顺序打乱了,问他现在家还是在外面。

思路:n%2问题……没看清题目保证在外地必然飞回家,写了判断出入度。

#include<cstdio>
inline int read()
{
int x=;char c;
while((c=getchar())<''||c>'');
for(;c>=''&&c<='';c=getchar())x=(x<<)+(x<<)+c-'';
return x;
}
int main()
{
int n=read(),x,a=;char s[];
scanf("%s",s);x=(s[]*+s[])*+s[];
while(n--)
{
scanf("%s",s);
if((s[]*+s[])*+s[]==x)++a;
if((s[]*+s[])*+s[]==x)--a;
}
puts(a?"contest":"home");
}

B.Code obfuscation

题目大意:一篇文章,碰见第一个没碰过的单词就把所有这个单词替换成a,第二个就替换成b,给一个长度不超过500的小写字母串,问是否可能是某篇文章加密得到的。

思路:拿个变量存用到哪个字母了呗……手速题

#include<cstdio>
inline int read()
{
int x=;char c;
while((c=getchar())<''||c>'');
for(;c>=''&&c<='';c=getchar())x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 500
char s[MN+];
int main()
{
int i,x='a';
scanf("%s",s);
for(i=;s[i];++i)
{
if(s[i]>x)return *puts("NO");
if(s[i]==x)++x;
}
puts("YES");
}

C.Table Tennis Game 2

题目大意:给出a,b,k,问(a,b)最多被分解为几个(k,x)或(x,k)(x<k)的和,若无解输出-1。

思路:判断是否有解然后输出a/k+b/k就行了,怎么判断有解就变成了本场比赛最大的hack点,正确做法是(a<k&&b%k!=0)||(b<k&&a%k!=0)就无解,错误做法有a/k+b/k>0就有解,a<k且b<k时无解等。

#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{
int x=;char c;
while((c=getchar())<''||c>'');
for(;c>=''&&c<='';c=getchar())x=(x<<)+(x<<)+c-'';
return x;
}
int main()
{
int k,a,b,ans;
k=read();a=read();b=read();
if(a<k&&b%k)return *puts("-1");
if(b<k&&a%k)return *puts("-1");
printf("%d",a/k+b/k);
}

D.Artsem and Saunders

题目大意:N<=100,000,给出[1,n]到[1,n]的映射f(x),求[1,n]到[1,m]的映射g(x)和[1,m]到[1,n]的映射h(x),使得任意x属于[1,m]g(h(x))=x,任意x属于[1,n]h(g(x))=f(x)。

思路:观察发现对于每组相等的f(x)的x,必须要有一个满足x=f(x),这些x全部映射到[1,m]中一个再映射到f(x)就行了。

#include<cstdio>
inline int read()
{
int x=;char c;
while((c=getchar())<''||c>'');
for(;c>=''&&c<='';c=getchar())x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 100000
int a[MN+],c[MN+],p[MN+],pn;
int main()
{
int n=read(),i;
for(i=;i<=n;++i)if((a[i]=read())==i)p[c[i]=++pn]=i;
for(i=;i<=n;++i)if(!c[a[i]])return *puts("-1");
printf("%d\n",pn);
for(i=;i<=n;++i)printf("%d ",c[a[i]]);puts("");
for(i=;i<=pn;++i)printf("%d ",p[i]);
}

E.Tree Folding

题目大意:一颗树,每次选一个点,把与他相连的两条同长的链并成一条(链上不能向其他地方连),问最后能否把树并成一条链,能的话求出最短链长。

思路:我瞎yy了一个做法,不会证明,请随意意会。求出每个点作为根时他每个儿子的子树深度,如果深度的种数超过2则无解,若全部都不超过2则答案为每个点为根时得到的两种深度相加中的最小值,算深度可以DP O(n)求出以1为根的情况然后O(1)移动根。

#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 200000
struct edge{int nx,t;}e[MN*+];
int h[MN+],en,d[MN+],d1[MN+],d2[MN+],c[MN+],g;
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
void cal(int x,int d)
{
if(!d1[x])d1[x]=d;else if(d1[x]!=d)
if(!d2[x])d2[x]=d;else if(d2[x]!=d)g=;
}
void pre(int x,int f)
{
for(int i=h[x];i;i=e[i].nx)if(e[i].t!=f)
{
pre(e[i].t,x);
if(d[e[i].t]>=d[x])c[x]=d[x],d[x]=d[e[i].t];
else if(d[e[i].t]>c[x])c[x]=d[e[i].t];
cal(x,d[e[i].t]);
}
++d[x];++c[x];
}
void dfs(int x,int f,int fd)
{
if(f)cal(x,fd);
for(int i=h[x];i;i=e[i].nx)if(e[i].t!=f)
dfs(e[i].t,x,max(fd+,d[x]==d[e[i].t]+?c[x]:d[x]));
}
int main()
{
int n=read(),i,ans;
for(i=;i<n;++i)ins(read(),read());
pre(,);dfs(,,);
if(g)return *puts("-1");
for(ans=d1[]+d2[],i=;i<=n;++i)ans=min(ans,d1[i]+d2[i]);
while(ans%==)ans/=;
printf("%d",ans);
}

F.Souvenirs

题目大意:给定一个长度为N的数列,M次询问,每次询问区间中最小的两个不同位置元素的最小差,区间长度至少为2。(N<=100,000,M<=300,000)

思路:觉得这题非常厉害,今天终于把这坑填了(这位置好深,不知道有没人看得到)。好多人写的玄学莫队,甚至多个log的都卡过去了。从网上某大神处找到了O(Nlogn^2+Mlogn)的解法,非常妙,大概是这样的:考虑从左到右加入数字,维护以当前加到的数字为右端点,各个左端点的答案。分两次做,一次只考虑前面的数小于后面的情况,另一次只考虑大于。这里说下第一种(另一种一样,反过来就好了):每次加入一个数ai,我们找到已加入的最右端的小等于ai的数aj,用ai-aj更新1~j作为左端点时的答案,接下来考虑再用aj左边小等于ai的数ak来更新,若用ak更新有意义,则必然ai-ak<ai-aj,即ak>aj,这里有个巧妙的性质,即如果ai-ak>ak-aj,我们可以不必更新k,因为更优的ak-aj必然会在我们做大于的时候被考虑到,也就是说,ak不仅要大于aj,还要大于(ai+aj)/2,这样我们每次更新最右的一个k后,下一个ak能取的范围必然缩小一半,也就是每次加入ai,最多只用更新log次!我们用线段树维护答案,权值线段树维护当前已加入的某数字最右端的位置,问题就迎刃而解啦。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100000
#define MQ 300000
#define N 131072
int a[MN+],p[MN+],c[MN+],cn,ans[MQ+];
int t1[N*+],t2[N*+];
vector<pair<int,int> > v[MN+];
void renew(int l,int r,int x)
{
for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
{
if(~l&)t1[l+]=min(t1[l+],x);
if( r&)t1[r-]=min(t1[r-],x);
}
}
int query(int k)
{
int r=t1[k+=N];
while(k>>=)r=min(r,t1[k]);
return r;
}
void renew(int k,int x){for(k+=N;k;k>>=)t2[k]=max(t2[k],x);}
int query(int l,int r)
{
int res=;
for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
{
if(~l&)res=max(res,t2[l+]);
if( r&)res=max(res,t2[r-]);
}
return res;
}
int main()
{
fread(B,,<<,stdin);
int n=read(),q,i,j,k;
for(i=;i<=n;++i)a[i]=c[i]=read();
sort(c+,c+n+);
for(i=,cn=;i<=n;++i)if(c[i]!=c[cn])c[++cn]=c[i];
for(i=;i<=n;++i)p[i]=lower_bound(c+,c+cn+,a[i])-c;
for(q=read(),i=;i<q;++i)j=read(),v[read()].push_back(make_pair(i,j));
memset(ans,,sizeof(ans));memset(t1,,sizeof(t1));
for(i=;i<=n;++i)
{
for(j=;j<=p[i]&&(k=query(j,p[i]));)
renew(,k,a[i]-a[k]),j=upper_bound(c+,c+cn+,(a[i]+a[k])>>)-c;
for(j=;j<v[i].size();++j)
ans[v[i][j].first]=min(ans[v[i][j].first],query(v[i][j].second));
renew(p[i],i);
}
memset(t1,,sizeof(t1));memset(t2,,sizeof(t2));
for(i=;i<=n;++i)
{
for(j=cn;j>=p[i]&&(k=query(p[i],j));)
renew(,k,a[k]-a[i]),j=lower_bound(c+,c+cn+,(a[i]+a[k]+)>>)-c-;
for(j=;j<v[i].size();++j)
ans[v[i][j].first]=min(ans[v[i][j].first],query(v[i][j].second));
renew(p[i],i);
}
for(i=;i<q;++i)printf("%d\n",ans[i]);
}

Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined)的更多相关文章

  1. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) F. Souvenirs 线段树套set

    F. Souvenirs 题目连接: http://codeforces.com/contest/765/problem/F Description Artsem is on vacation and ...

  2. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) E. Tree Folding 拓扑排序

    E. Tree Folding 题目连接: http://codeforces.com/contest/765/problem/E Description Vanya wants to minimiz ...

  3. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders 数学 构造

    D. Artsem and Saunders 题目连接: http://codeforces.com/contest/765/problem/D Description Artsem has a fr ...

  4. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) C. Table Tennis Game 2 水题

    C. Table Tennis Game 2 题目连接: http://codeforces.com/contest/765/problem/C Description Misha and Vanya ...

  5. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) B. Code obfuscation 水题

    B. Code obfuscation 题目连接: http://codeforces.com/contest/765/problem/B Description Kostya likes Codef ...

  6. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A. Neverending competitions 水题

    A. Neverending competitions 题目连接: http://codeforces.com/contest/765/problem/A Description There are ...

  7. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A B C D 水 模拟 构造

    A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...

  8. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) E. Tree Folding

    地址:http://codeforces.com/contest/765/problem/E 题目: E. Tree Folding time limit per test 2 seconds mem ...

  9. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders

    地址:http://codeforces.com/contest/765/problem/D 题目: D. Artsem and Saunders time limit per test 2 seco ...

  10. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) C - Table Tennis Game 2

    地址:http://codeforces.com/contest/765/problem/C 题目: C. Table Tennis Game 2 time limit per test 2 seco ...

随机推荐

  1. 2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现

    2017-2018-1 20155201 <信息安全系统设计基础> pwd命令的实现 一.对pwd命令的学习 在终端中输入man pwd查看手册中对pwd这一命令的解释: 以绝对路径的方式 ...

  2. C语言博客作业--字符数组-陈张鑫

    一.PTA实验作业(4分) 题目1:7-5 查验身份证 1. 本题PTA提交列表(要提交列表,不是结果) 2. 设计思路(伪代码或流程图) 定义变量身份证个数n,合法个数count=0,flag=0, ...

  3. centos 开放端口

    1.修改文件/etc/sysconfig/iptables [root@zsq ~]# cd /etc/sysconfig/[root@zsq sysconfig]# vi iptables 文件内容 ...

  4. centos 安装配置 mysql

    安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...

  5. 【TensorFlow随笔】关于一个矩阵与多个矩阵相乘的问题

    问题描述: Specifically, I want to do matmul(A,B) where  'A' has shape (m,n)  'B' has shape (k,n,p) and t ...

  6. 使用JDBC中的出现的乱码和查询无结果问题

    使用JDBC中的问题 连接的后出现查询结果是乱码. 1.可能是代码的编码与数据库的编码不同 ​ 有可以将二者都设置为UTF-8 2.如果比较懒得话可以只设代码为UTF-8 mysql 连接url中us ...

  7. Web Uploader初始化隐藏容器失败及点击上传图片时反应较慢的问题

    问题1:在一个页面集成一个或者多个文件上传插件,初始化时有些DOM容器是隐藏的,这时候经常会出现初始化失败的情况,虽然按钮样式改变了,但是点击就是没反应(有时候不经意点了哪个地方,或许会出现文件选择框 ...

  8. MySQL一些中重要命令

    前言: 最近在面试的过程中,深感对MySQL一些重要命令的缺失.借着这个机会,补补这块的知识.不让自己只会增删查改,懂一些高级的东西 limit 用法 order by 用法 in 和 between ...

  9. Docker学习笔记 - Docker的数据卷

    一.什么是数据卷? 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 数据 ...

  10. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...