Codeforces Round 492 (Div.1)

Posted absi2011

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round 492 (Div.1)相关的知识,希望对你有一定的参考价值。

大概这一场考的还算可以吧..

上来刚A...然后A死难写...

然后B是水题..

C猜了个结论错掉了,也找到了反例

然后后面干脆的直接把数据random_shuffle以后再跑这个贪心...

就过了...

D..

感谢Q巨...

Q巨猜了个结论让我交了一发..

然后过了...

========================================================

 

A题

给你一个4*n的网格图,第一行第四行是停车场

第二行第三行是过道

技术分享图片

 

现在一共有k辆车(编号1~k)停在过道上,你需要把它们挪到正确的位置上

你一旦将一辆车停入停车区,就不可以移动它,也就是说你必须让正确的车进入正确的位置

求一个20000步以内的方案,n<=50,k<=2n

 

 

 

做法;

你可以考虑,整个2*n的区域直接把它变成一个环,

例如上图

把它变成

1->2->0->4

^               |

|               v

5<-0<-0<-3

的一个环,然后在这个环上每次移动一个车,顺便把前面所有的车都往前推一格(或者推进目的地)

时间复杂度O(100*99+100) 99表示最多移动99下才能到目的地(这个环上)

我们就一直让它转直到所有车都到目的地

(如果位置是满的,而且一开始没有车可以到目的地,输出-1)

实现的时候不是这么写的..而是把每个没到终点的都往终点推...

 

B题

2n个数,1~n各出现2次

每次可以交换两个连续的数

问几次能让每个数出现的两次是连续的

n<=100

 

直接...暴力把跟第一个相同的拖到第二个....然后依次做下去...

 

C题

n个向量,长度<=1e6

每个向量可以选择+1或者-1倍,要求

最后向量的和加起来长度<=1.5*1e6

 

 

我的做法:

直接每次让当前向量和下一个合并,取小的那一个

如果最后发现错了,就把数据random_shuffle一下,再做一次,直到做出来为止

过了,虽然不知道为啥

 

std做法:

每次三个里面,肯定有两个(可能经过乘以-1后)会有一对成为一个120°以外的角

那么两个<=1e6的向量加起来还在1e6以内

那么最后就可以得到两个,加起来一定在1.5*1e6(实际上在sqrt(2)*1e6)以内

 

D题:

A和B在玩一个游戏

它们在填一个n位的二进制数,每次随机一个人过来选一位填成0或者1

最后得分是c[二进制数数值]

A要让它尽量大,B要让它尽量小

问期望得到的值是多少,然后接下来r次修改

每次修改c数组里面一个数的值,然后再询问

n<=18

r<=218

 

 

做法:

直接所有的c的和然后除以2^n

Q老师的结论...

 

EF不会做

 

A

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define move moasudoasjsap
int a[4][55];
struct move
{
    int id;
    int x;
    int y;
    move (int iid=0,int xx=0,int yy=0)
    {
        id=iid;
        x=xx+1;
        y=yy+1;
    }
    void output()
    {
        printf("%d %d %d
",id,x,y);
    }
};
vector<move> ans;
bool vis[105];
int n;
int newx,newy;
void find_next(int sx,int sy)
{
    newx=sx;
    newy=sy;
    if (sx==1)
    {
        if (sy==0)
        {
            newx++;
        }
        else
        {
            newy--;
        }
    }
    else
    {
        if (sy==n-1)
        {
            newx--;
        }
        else
        {
            newy++;
        }
    }
}
void find_way(int sx,int sy,int tx,int ty,int id)
{
    if ((sx==tx)&&(sy==ty)) return;
    find_next(sx,sy);
    int ttx=newx;
    int tty=newy;
    if (a[newx][newy]!=0)
    {
        if (a[ttx^1][tty]==a[ttx][tty])
        {
            ans.push_back(move(a[ttx][tty],ttx^1,tty));
            vis[a[ttx][tty]]=true;
            a[ttx][tty]=0;
        }
        else
        {
            find_next(ttx,tty);
            find_way(ttx,tty,newx,newy,a[ttx][tty]);
        }
    }
    ans.push_back(move(id,ttx,tty));
    a[ttx][tty]=id;
    a[sx][sy]=0;
    find_way(ttx,tty,tx,ty,id);
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int k;
    scanf("%d%d",&n,&k);
    int i;
    for (i=0;i<4;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    if (k==n+n)
    {
        for (i=1;i<=2;i++)
        {
            int j;
            for (j=0;j<n;j++)
            {
                if (a[i][j]==a[i^1][j])
                {
                    ans.push_back(move(a[i][j],i^1,j));
                    vis[a[i][j]]=true;
                    a[i][j]=0;
                    break;
                }
            }
            if (j!=n) break;
        }
        if (i==3)
        {
            puts("-1");
            return 0;
        }
    }
    for (i=1;i<=k;i++)
    {
        if (vis[i]) continue;
        int j;
        int final_x,final_y;
        int start_x,start_y;
        for (j=0;j<n;j++)
        {
            if (a[0][j]==i)
            {
                final_x=1;
                final_y=j;
            }
            if (a[3][j]==i)
            {
                final_x=2;
                final_y=j;
            }
            if (a[1][j]==i)
            {
                start_x=1;
                start_y=j;
            }
            if (a[2][j]==i)
            {
                start_x=2;
                start_y=j;
            }
        }
        find_way(start_x,start_y,final_x,final_y,i);
        ans.push_back(move(i,final_x^1,final_y));
        a[final_x][final_y]=0;
        vis[i]=true;
    }
    printf("%d
",ans.size());
    for (i=0;i<ans.size();i++)
    {
        ans[i].output();
    }
    return 0;
} 

B

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    int i;
    for (i=0;i<n+n;i++)
    {
        scanf("%d",&a[i]);
    }
    int ans=0;
    for (i=0;i<n+n;i+=2)
    {
        int j;
        for (j=i+1;j<n+n;j++)
        {
            if (a[i]==a[j])
            {
                int k;
                for (k=j;k>i+1;k--)
                {
                    swap(a[k],a[k-1]);
                    ans++;
                }
            }
        }
    }
    printf("%d
",ans);
    return 0;
} 

C

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct vv
{
    int x;
    int y;
    int id;
};
vv v[100005];
int ans[100005];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    srand(time(0));
    int n;
    scanf("%d",&n);
    int nowx=0,nowy=0;
    int i;
    for (i=0;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[i].id=i;
        v[i].x=x;
        v[i].y=y;
        long long t1=(long long)(nowx-x)*(nowx-x)+(long long)(nowy-y)*(nowy-y);
        long long t2=(long long)(nowx+x)*(nowx+x)+(long long)(nowy+y)*(nowy+y);
        if (t1<t2)
        {
            ans[i]=-1;
            nowx-=x;
            nowy-=y;
        }
        else
        {
            ans[i]=1;
            nowx+=x;
            nowy+=y;
        }
    }
    if ((long long)nowx*nowx+(long long)nowy*nowy>(long long)1500000*1500000)
    {
        for (;;)
        {
            random_shuffle(v,v+n);
            int nowx=0,nowy=0;
            for (i=0;i<n;i++)
            {
                int x=v[i].x;
                int y=v[i].y;
                long long t1=(long long)(nowx-x)*(nowx-x)+(long long)(nowy-y)*(nowy-y);
                long long t2=(long long)(nowx+x)*(nowx+x)+(long long)(nowy+y)*(nowy+y);
                if (t1<t2)
                {
                    ans[v[i].id]=-1;
                    nowx-=x;
                    nowy-=y;
                }
                else
                {
                    ans[v[i].id]=1;
                    nowx+=x;
                    nowy+=y;
                }
            }
            if ((long long)nowx*nowx+(long long)nowy*nowy<=(long long)1500000*1500000)
            {
                for (i=0;i<n;i++)
                {
                    printf("%d ",ans[i]);
                }
                printf("
");
                return 0;
            }
        }
    }
    for (i=0;i<n;i++)
    {
        printf("%d ",ans[i]);
    }
    printf("
");
    return 0;
} 

D

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1<<18];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n,r;
    scanf("%d%d",&n,&r);
    int k=(1<<n);
    int i;
    long long sum=0;
    for (i=0;i<k;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    printf("%.12lf
",sum*1.0/k);
    for (i=0;i<r;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        sum-=a[x];
        a[x]=y;
        sum+=y;
        printf("%.12lf
",sum*1.0/k);
    }
    return 0;
} 

以上是关于Codeforces Round 492 (Div.1)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #492 (Div. 2) [Thanks, uDebug!] — 赛后补题

CodeforcesCodeforces Round #492 (Div. 2) [Thanks, uDebug!] (Contest 996)

Codeforces Round #705 (Div. 2)

Codeforces Round #774 (Div. 2)

Codeforces Round #808 (Div. 1)(A~C)

Codeforces Round #717 (Div. 2)