AtCoder Grand Contest 013
这场打得蛮菜的,很晚才出BC,还一堆罚时……
A - Sorted Arrays
题目大意:将给定数列划分成单调不增或单调不减的区间,求最少区间数。
贪心即可。
#include<cstdio> #include<algorithm> #define MN 1000001 using namespace std; int read_p,read_ca; inline int read(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9') read_ca=getchar(); while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } const int MOD=1e9+7; int n,a[MN],m=0,mmh=0; int main(){ int i,j; n=read(); for (i=1;i<=n;i++) a[i]=read(); for (i=2;i<=n;i++){ if (a[i]==a[i-1]) continue; if (m==-1&&a[i]>a[i-1]) mmh++,m=0;else if (m==1&&a[i]<a[i-1]) mmh++,m=0;else m=a[i]>a[i-1]?1:-1; } printf("%d\n",mmh+1); }
B - Hamiltonish Path
题目大意:无向图中任意求一条路径,使得与端点直接相连的所有点都在路径上。
一条不合法的路径就是端点可以继续往外拓展的路径。那么直接从一个点出发,拓展两次,把两次的终点作为端点即可。
因为输出顺序写错卡了好久。
#include<cstdio> #include<algorithm> #define MN 400001 using namespace std; int read_p,read_ca; inline int read(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9') read_ca=getchar(); while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } const int MOD=1e9+7; int n,a[MN],m=0,mmh=0,x,y,l[MN],r,st[MN],top=0,_st[MN],_top=0,num; struct na{int y,ne;}b[MN<<1]; inline void in(int x,int y){b[++num].y=y;b[num].ne=l[x];l[x]=num;} bool bo[MN]; void dfs(int p){ st[++top]=p; bo[p]=1; for (int i=l[p];i;i=b[i].ne) if (!bo[b[i].y]) {dfs(b[i].y);break;} } void _dfs(int p){ _st[++_top]=p; bo[p]=1; for (int i=l[p];i;i=b[i].ne) if (!bo[b[i].y]) {_dfs(b[i].y);break;} } int main(){ int i; n=read();m=read(); for (i=1;i<=m;i++) x=read(),y=read(),in(x,y),in(y,x); dfs(1); _dfs(1); printf("%d\n",top+_top-1); for (i=top;i;i--) printf("%d ",st[i]); for (i=2;i<=_top;i++) printf("%d ",_st[i]); }
C - Ants on a Circle
题目大意:一个环上一些蚂蚁在走,有顺逆时针两种方向,一秒走一步,相撞都掉头,问T秒后每只的位置。
先把相撞掉头这点换成交换编号,然后就不会做惹T_T
幸得tjw神犇相救。
回到原问题就比较容易看出,蚂蚁的相对位置是不变的。那么对最终位置排序并统计蚂蚁走了多少圈(跨过L-1与0的分界多少次),在对应的下标上移动即可。
#include<queue> #include<cstdio> #include<algorithm> #define MN 110001 using namespace std; int read_p,read_ca; inline int read(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9') read_ca=getchar(); while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } int n,l,t,p[MN],w[MN]; long long T=0; int main(){ register int i; n=read();l=read();t=read(); for (i=0;i<n;i++) p[i]=read(),w[i]=read(); for (i=0;i<n;i++) p[i]+=w[i]==1?t:-t,T+=p[i]/l,p[i]%=l; for (i=0;i<n;i++) if (p[i]<0){ T--; p[i]+=l; } sort(p,p+n);T%=n; for (i=0;i<n;i++) printf("%d\n",p[(i+T+n)%n]); }