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

  • 相关阅读:
    CF91 B. Queue
    CF18 C. Stripe
    CF767 A. Snacktower
    CF349 B. Color the Fence
    CF519 B. A and B and Compilation Errors
    NLog Helpper日志帮助类配置和使用
    一步一步搭建 .net core 应用
    使用webform、websevice来进行ajax请求操作
    各种奇技淫巧-持续更新
    防止表单提交时刷新页面-阻止form表单的默认提交行为
  • 原文地址:https://www.cnblogs.com/bxd123/p/11091017.html
Copyright © 2011-2022 走看看