zoukankan      html  css  js  c++  java
  • Codeforces Round #569 (Div. 2)

    http://codeforces.com/contest/1180/problems

    B. Nick and Array

    题意:给出一个n位序列  存在一个变换  使得  an变为 -an-1  求经过若干变换后  序列的乘积最大 

    这道水题卡了半天实在不应该   主要卡在  0 和-1  分了很多类 

    其实可以先默认全部变为负数  如果此时个数为偶数  那么就是最大值

    如果为奇数:将最小的负数变为正数即可 

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=1e5+10;
    int n,m;
    struct node
    {
        int v,pos;
    }s[N];
    bool cmp(node a,node b)
    {
        return a.v<b.v;
    }
    bool cmp2(node a,node b)
    {
        return a.pos<b.pos;
    }
    int main()
    {
        RI(n);
        rep(i,1,n)
        {
            int x;RI(x);if(x>=0)x=-x-1;
            s[i].v=x;s[i].pos=i;
        }
        if(n%2==0)
        {
            rep(i,1,n)
            printf("%d ",s[i].v);
        }
        else
        {
            sort(s+1,s+1+n,cmp);
            s[1].v=-s[1].v-1;
            sort(s+1,s+1+n,cmp2);
            rep(i,1,n)
            printf("%d ",s[i].v);
        }
        return 0;
    }
    View Code
    C. Valeriy and Deque

     题意:给出n个数的序列  m个询问

    将该序列看作双端队列  每次从头取出两个数 A B    大的在前 小的在后

    问第 k 次取出的是哪两个数

    一开始还模拟了一下找循环节  。。。 浪费了一些时间

    其实  当最大的在头就已经结束了  循环节为n-1 然后模拟一下就可以了

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=3e5+10;
    int n,m,x,maxx,ans[N][2],A,B,cnt;
    deque<int>q;
    ll qe[N];
    int main()
    {
        RII(n,m);
        int T=n-1;
        rep(i,1,n)
        {
            RI(x);
            q.push_back(x);
            maxx=max(maxx,x);
        }
        cnt=0;
        while(1)
        {
            ++cnt;
             A=q.front();q.pop_front();
             B=q.front();q.pop_front();
            ans[cnt][0]=A,ans[cnt][1]=B;
            if(A>B)
            q.push_front(A),q.push_back(B);
            else q.push_back(A),q.push_front(B);
            if(q.front()==maxx){break;}
        }
        int cnt2=cnt;
        rep(i,1,T)
        {
            ++cnt2;
            A=q.front();q.pop_front();
            B=q.front();q.pop_front();
            ans[cnt2][0]=A,ans[cnt2][1]=B;
            if(A>B)
            q.push_front(A),q.push_back(B);
            else q.push_back(A),q.push_front(B);
        }
        rep(i,1,m)
        {
            scanf("%lld",&qe[i]);
            if(qe[i]<=cnt2)printf("%d %d
    ",ans[qe[i]][0],ans[qe[i]][1]);
            else
            {
                qe[i]=(qe[i]-cnt)%T;
                if(!qe[i])qe[i]=T;
                printf("%d %d
    ",ans[ qe[i]+cnt ][0],ans[qe[i]+cnt][1]);
            }
        }
        return 0;
    }
    View Code

    D. Tolik and His Uncle

    题意:给出一个n*m的矩阵  一开始在1 1   求一种方法遍历所有的格子  要求任意一步的行走向量不能相同  如果走不完 输出-1

    显然 一边从1 1  一边从n m  交替走蛇形就是答案

    注意 格子的奇偶情况

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=3e5+10;
    int n,m;
    int main()
    {
        RII(n,m);
        int x=1,y=1,d1=1,x2=n,y2=m,d2=-1;
        if(n==1&&m==1){printf("1 1");return 0;}
        int X=n+1,Y=m+1;
        ll cnt=n*m;
        ll temp=cnt/2;
    
        while( temp--)
        {
            printf("%d %d
    ",x,y);
            printf("%d %d
    ",X-x,Y-y);
            y+=d1;
            if(y==m+1)
            {
                y=m;d1=-d1;x++;
            }
            if(y==0)
            {
                y=1;d1=-d1;x++;
            }
        }
        if(cnt%2==1)
        printf("%d %d",x,y);
    
        return 0;
    }
    View Code

    这题的输出量 达到1000^2  经过测试  c 比c++ 快 (当然 c++关闭了流)

     <<endl   <<' '   前者超时  后者不超时

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=3e5+10;
    int n,m;
    int main()
    {
        RII(n,m);
        int x=1,y=1,d1=1,x2=n,y2=m,d2=-1;
        if(n==1&&m==1){printf("1 1");return 0;}
        int X=n+1,Y=m+1;
        ll cnt=n*m;
        ll temp=cnt/2;
    
        while( temp--)
        {
            printf("%d %d
    ",x,y);
            printf("%d %d
    ",X-x,Y-y);
            y+=d1;
            if(y==m+1)
            {
                y=m;d1=-d1;x++;
            }
            if(y==0)
            {
                y=1;d1=-d1;x++;
            }
        }
        if(cnt%2==1)
        printf("%d %d",x,y);
    
        return 0;
    }
    View Code

    最终rank 270  虽然打的很臭 但居然是历史最好成绩了QAQ

  • 相关阅读:
    104.Maximum Depth of Binary Tree
    103.Binary Tree Zigzag Level Order Traversal
    102.Binary Tree Level Order Traversal
    101.Symmetric Tree
    100.Same Tree
    99.Recover Binary Search Tree
    98.Validate Binary Search Tree
    97.Interleaving String
    static静态初始化块
    serialVersionUID作用
  • 原文地址:https://www.cnblogs.com/bxd123/p/11091017.html
Copyright © 2011-2022 走看看