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\n",ans[qe[i]][0],ans[qe[i]][1]);
        else
        {
            qe[i]=(qe[i]-cnt)%T;
            if(!qe[i])qe[i]=T;
            printf("%d %d\n",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\n",x,y);
        printf("%d %d\n",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   <<'\n'   前者超时  后者不超时

#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\n",x,y);
        printf("%d %d\n",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

猜你喜欢

转载自www.cnblogs.com/bxd123/p/11091017.html