博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CODE FESTIVAL 2016 qual A题解
阅读量:4935 次
发布时间:2019-06-11

本文共 3184 字,大约阅读时间需要 10 分钟。

不知道为什么\(AGC\)系列的题里突然多了这些……那就做吧……

\(A\)

什么玩意儿……

upd:因为没看到最后要加换行居然没有\(1A\)好气哦……

const int N=15;char s[N];int main(){    scanf("%s",s+1);    fp(i,1,4)putchar(s[i]);    putchar(' ');    fp(i,5,12)putchar(s[i]);    putchar('\n');    return 0;}

\(B\)

什么玩意儿……

const int N=1e5+5;int a[N],n,res;int main(){    scanf("%d",&n);    fp(i,1,n)scanf("%d",&a[i]);    fp(i,1,n)res+=(a[a[i]]==i);    printf("%d\n",res>>1);    return 0;}

\(C\)

什么玩意儿……

const int N=1e5+5;char s[N];int a[N],n,k;int main(){    scanf("%s%d",s+1,&k),n=strlen(s+1);    fp(i,1,n)a[i]=(s[i]-'a');    fp(i,1,n)if(a[i]&&k>=26-a[i])k-=26-a[i],s[i]='a';    k%=26;    s[n]+=k;    printf("%s\n",s+1);    return 0;}

\(D\)

我好蠢啊为什么总是想到开头想不到后面呢……

首先题中的限制等价于\(a_{i,j}-a{i-1,j}=a_{i,j-1}-a_{i-1,j-1}\),同理也有\(a_{i,j}-a_{i,j-1}=a_{i-1,j}-a_{i-1,j-1}\)

那么我们如果存在合法的解,则必定存在两个序列\(c_1,...,c_n\)\(d_1,...,d_m\),满足\(a_{i,j}=c_i+d_j\)

那么我们把行列看做一个二分图,对于每一个有限定的格子从对应的行向列连边,那么每条边的权值都应该等于它连接的两个点的点权之和。那么对于一个联通块,先\(dfs\)一遍判断是否合法。之后在考虑如何满足所有点权都非负,这个的话,我们可以找到这个连通块中左边最小的点权\(xmn\)和右边最小的点权\(ymn\),如果\(xmn+ymn\geq 0\)就有解了。这个是因为每一次调整肯定是右边所有点权\(+1\)且左边所有点权\(-1\)或者反过来,那么如果满足之前的条件肯定可以调整到合法

//quming#include
#define R register#define fp(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
inline bool cmax(T&a,const T&b){return a
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;struct eg{int v,nx,w;}e[N<<1];int head[N],tot;inline void add(R int u,R int v,R int w){e[++tot]={v,head[u],w},head[u]=tot;}ll dis[N],xmn,ymn;int vis[N],vv[N],fl,n,m,c;void dfs(int u){ vis[u]=1; go(u)if(!vis[v])dis[v]=e[i].w-dis[u],dfs(v); else if(dis[u]+dis[v]!=e[i].w)fl=0;}void find(int u){ vv[u]=1; u<=n?cmin(xmn,dis[u]):cmin(ymn,dis[u]); go(u)if(!vv[v])find(v);}int main(){ scanf("%d%d%d",&n,&m,&c); for(R int i=1,u,v,w;i<=c;++i){ scanf("%d%d%d",&u,&v,&w); add(u,v+n,w),add(v+n,u,w); } fp(i,1,n+m)if(!vis[i]){ fl=1;dfs(i);if(!fl)return puts("No"),0; xmn=ymn=1e18,find(i); if(xmn+ymn<0)return puts("No"),0; } puts("Yes"); return 0;}

\(E\)

orz 司公子

首先我们假设已经对于某个序列确定了操作顺序,考虑这个序列最终是什么样子的

首先没有被操作过的按顺序排在后面,前面的数,我们按操作序列从后往前扫描,越早出现的排在越前面,如果重复出现不用考虑

那么我们不难发现所有数列最终的样子就是随便选一个序列进行所有操作之后的样子

那么我们随便选一个序列进行所有操作,然后把结尾那一段极长的递增的序列取出来,那么前面的操作都是必须进行的,只要判断前面的操作序列的个数是否大于等于\(n\)即可

//quming#include
#define R register#define fp(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
inline bool cmax(T&a,const T&b){return a
inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}using namespace std;const int N=5e5+5;int a[N],st[N],pos[N],cnt[N],vis[N];int n,m,q,top,p;int main(){ scanf("%d%d%d",&n,&m,&q); fp(i,1,q)scanf("%d",&a[i]); fd(i,q,1)if(!vis[a[i]])st[++top]=a[i],vis[a[i]]=1; fp(i,1,m)if(!vis[i])st[++top]=i; fp(i,1,m)pos[st[i]]=i; p=m; while(p>1&&st[p-1]
=n?"Yes":"No"); return 0;}

转载于:https://www.cnblogs.com/yuanquming/p/11470157.html

你可能感兴趣的文章
tornado 使用入门
查看>>
weblogic出现response already committed(转)
查看>>
HDU-3523 Image copy detection
查看>>
打开input输入的时候,css中position:absolute/fixed定位的时候,定位元素上移问题解决...
查看>>
fckeditor 上传图一直显示进度条
查看>>
10个让你忘记 Flash 的 HTML5 应用演示
查看>>
python读取数据库数据,读取出的中文乱码问题
查看>>
ACM/ICPC 之 数据结构-邻接表+BFS(TSH OJ-无线广播Broadcast)
查看>>
《sqlite权威指南》读书笔记 (一)
查看>>
Summer Project
查看>>
类文件结构
查看>>
FF与IE对JavaScript和CSS的区别
查看>>
MySQL数据库不识别server=.而是识别localhost
查看>>
JS之文本框获得焦点和失去焦点
查看>>
[CF-676B]PYRAMID OF GLASSES
查看>>
【codeforces 1025E】Colored Cubes 【构造】
查看>>
信安系统设计基础(个人报告阅读说明)
查看>>
mysql5.7 on MAC安装初始root密码
查看>>
【C#】学习笔记(3) Events
查看>>
七 · 周 · 后
查看>>