博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

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);
}
View Code

 

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]);
}
View Code

 

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]);
}
View Code

 

posted @ 2017-04-18 11:12  swm_sxt  阅读(198)  评论(0编辑  收藏  举报