Codeforces Round #502 (Div.1 + 2)

赛中unrated.......

cf又炸了系列.......

最近cf还不错,没那么容易炸

做了ABCDE五个题

A

给你n个人的四门科目的分数,问第一个人排名多少

分数相同的时候,id小的靠前

---------------------------------------------

写sort也行,直接比较也行...

反正随便做..

B

给你两个01串,a和b

你现在可以交换a中两个数字的位置

问有多少种交换方式,可以使得a OR b(a|b)的值会发生变化

---------------------------------------------

交换两个0或者两个1是没用的

b中为1的位交换是没用的

也就是说,换0和1,并且它们那一位的b位不都为1的值

直接统计一下就好了....

C

求一个1~n的排列,它的最长上升子序列长度+最长下降子序列长度最小

--------------------------------------------

我们可以这么构造

例如

n=6

3 2 1 6 5 4

n=9

3 2 1 6 5 4 9 8 7

n=7

3 2 1 6 5 4 7

这样 以sqrt(n)为界(上取整),我们可以得到一个排列

证明它是最优的我不会......但是这样能过

D

给你一个可重集合,包含m个01串,每个01串都是n位(n<=12)

两个01串的相似度是这么定义的:

给你一个w数组,如果它们第i位相同则相似度+wi,否则不变

q次询问

每次给你一个01串,一个k

问集合中有多少个01串和它的相似度<=k

--------------------------------------------------

224还算挺快的,直接求一下两两的相似度,然后预处理所有的答案

两两的相似度可以用抑或(XOR 或者叫 ^)操作来处理,然后预处理所有抑或值的相似度

从而可以O(1)的求出

每次询问直接回答即可

E

题目说了一堆.........

原版题意恕我无能不会翻译

(从原版题意转化到下面的过程:)

1,如果两点连线可以造新的点,那么新的每个点都可以和别的店造新的点

这样我们实际得到的是一个区域的面积,换句话说是个凸包

2,我们考虑两组点合并后,得到的凸包一定要求每个点都有2个才能safe

3,所以我们合并前应该是两个可以重合的凸包

实际效果:

给你两组点,一组n个点,一组m个点

两组分别求凸包,然后问它们是否可以通过平移和旋转重合

-----------------------------------------------

直接hash............

hash了每条边的权值和叉积...

注意处理三点一线...

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

A

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

B

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char a[100005];
char b[100005];
long long cnt0,cnt1,cnt2,cnt3;
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    scanf("%s%s",a,b);
    int i;
    for (i=0;i<n;i++)
    {
        if (b[i]=='0')
        {
            if (a[i]=='1')
            {
                cnt1++;
            }
            else
            {
                cnt0++;
            }
        }
        else
        {
            if (a[i]=='1')
            {
                cnt3++;
            }
            else
            {
                cnt2++;
            }
        }
    }
    cout<<cnt0*cnt1+cnt0*cnt3+cnt1*cnt2<<endl;
    return 0;
}

C

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

D

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int ans[1<<12][105];
int w[15];
int sum[1<<12];
int diff[1<<12];
int n,q,m;
int get_val()
{
    static char a[1005];
    scanf("%s",a);
    int i;
    int sum=0;
    for (i=0;a[i]!='\0';i++)
    {
        if (a[i]=='1')
        {
            sum+=(1<<i);
        }
    }
    return sum;
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    scanf("%d%d%d",&n,&m,&q);
    int i;
    for (i=0;i<n;i++)
    {
        scanf("%d",&w[i]);
    }
    for (i=0;i<m;i++)
    {
        int t=get_val();
        sum[t]++;
    }
    for (i=0;i<(1<<n);i++)
    {
        int j;
        int sum=0;
        for (j=0;j<n;j++)
        {
            if ((1<<j)&i) sum+=w[j];
        }
        diff[i]=sum;
    }
    for (i=0;i<(1<<n);i++)
    {
        int j;
        for (j=0;j<(1<<n);j++)
        {
            if (diff[i^j^((1<<n)-1)]>100) continue;
            ans[i][diff[i^j^((1<<n)-1)]]+=sum[j];
        }
    }
    for (i=0;i<q;i++)
    {
        int x=get_val();
        int y;
        scanf("%d",&y);
        int j;
        int sum=0;
        for (j=0;j<=y;j++)
        {
            sum+=ans[x][j];
        }
        printf("%d\n",sum);
    }
    return 0;
}

E

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct point
{
    int x;
    int y;
    point (int xx=0,int yy=0)
    {
        x=xx;
        y=yy;
    }
    friend point operator - (const point &a,const point &b)
    {
        return point(a.x-b.x,a.y-b.y);
    }
    friend long long operator * (const point &a,const point &b)
    {
        return (long long)a.x*b.y-(long long)b.x*a.y;
    }
    long long length() const
    {
        return (long long)x*x+(long long)y*y;
    }
    friend bool operator < (const point &a,const point &b)
    {
        if (a*b==0)
        {
            return a.length()<b.length();
        }
        return a*b<0;
    }
    void read()
    {
        scanf("%d%d",&x,&y);
    }
};
point a[100005];
point b[100005];
const int p[5]={131,149,191,233,271};
const int modo[5]={200003,300007,400009,500009,700001};
int power(int x,int y,int modo)
{
    if (y==0) return 1;
    int t=power(x,y/2,modo);
    t=(long long)t*t%modo;
    if (y%2==1)
    {
        t=(long long)t*x%modo;
    }
    return t;
}
bool check(int n,int m)
{
    if (n!=m)
    {
        return false;
    }
    a[n]=a[0];
    a[n+1]=a[1];
    b[m]=b[0];
    b[m+1]=b[1];
    int i,j;
    long long val_a[15];
    long long val_b[15];
    long long val_c[15];
    long long val_d[15];
    for (i=0;i<5;i++)
    {
        val_a[i]=0;
    }
    for (i=0;i<5;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            val_a[i]=(val_a[i]*p[i]+(a[j]-a[j+1]).length())%modo[i];
        }
    }
    for (i=0;i<5;i++)
    {
        val_b[i]=0;
    }
    for (i=0;i<5;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            val_b[i]=(val_b[i]*p[i]+(b[j]-b[j+1]).length())%modo[i];
        }
    }
    for (i=0;i<5;i++)
    {
        val_c[i]=0;
    }
    for (i=0;i<5;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            val_c[i]=(val_c[i]*p[i]+(a[j]-a[j+1])*(a[j+1]-a[j+2]))%modo[i];
            if (val_c[i]<0) val_c[i]+=modo[i];
        }
    }
    for (i=0;i<5;i++)
    {
        val_d[i]=0;
    }
    for (i=0;i<5;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            val_d[i]=(val_d[i]*p[i]+(b[j]-b[j+1])*(b[j+1]-b[j+2]))%modo[i];
            if (val_d[i]<0) val_d[i]+=modo[i];
        }
    }
    for (j=0;j<n;j++)
    {
        int i;
        for (i=0;i<5;i++)
        {
            if (val_a[i]!=val_b[i]) break;
            if (val_c[i]!=val_d[i]) break;
        }
        if (i==5) break;
        for (i=0;i<5;i++)
        {
            val_a[i]=(val_a[i]-((a[j]-a[j+1]).length())%modo[i]*power(p[i],n-1,modo[i]))%modo[i];
            val_a[i]=(val_a[i]*p[i]+(a[j]-a[j+1]).length())%modo[i];
            val_a[i]=(val_a[i]+modo[i])%modo[i];
            val_c[i]=(val_c[i]-((a[j]-a[j+1])*(a[j+1]-a[j+2]))%modo[i]*power(p[i],n-1,modo[i]))%modo[i];
            val_c[i]=(val_c[i]*p[i]+(a[j]-a[j+1])*(a[j+1]-a[j+2]))%modo[i];
            val_c[i]=(val_c[i]+modo[i])%modo[i];
        }
    }
    if (j==n) return false;
    return true;
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n,m;
    scanf("%d%d",&n,&m);
    int i;
    for (i=0;i<n;i++)
    {
        a[i].read();
    }
    int min_x=1000000005,min_y=1000000005,id=-1;
    for (i=0;i<n;i++)
    {
        if ((a[i].x<min_x)||((a[i].x==min_x)&&(a[i].y<min_y)))
        {
            min_x=a[i].x;
            min_y=a[i].y;
            id=i;
        }
    }
    swap(a[id],a[0]);
    for (i=1;i<n;i++)
    {
        a[i]=a[i]-a[0];
    }
    a[0]=point(0,0);
    sort(a+1,a+n);
    static point que[1000005];
    que[0]=a[0];
    int front=0,rail=1;
    for (i=1;i<n;i++)
    {
        for (;rail>=2;rail--)
        {
            if ((que[rail-1]-que[rail-2])*(a[i]-que[rail-1])<0)
            {
                break;
            }
        }
        que[rail++]=a[i];
    }
    n=rail;
    for (i=0;i<n;i++)
    {
        b[i]=que[i];
    }
    //////////////////////
    for (i=0;i<m;i++)
    {
        a[i].read();
    }
    min_x=1000000005,min_y=1000000005,id=-1;
    for (i=0;i<m;i++)
    {
        if ((a[i].x<min_x)||((a[i].x==min_x)&&(a[i].y<min_y)))
        {
            min_x=a[i].x;
            min_y=a[i].y;
            id=i;
        }
    }
    swap(a[id],a[0]);
    for (i=1;i<m;i++)
    {
        a[i]=a[i]-a[0];
    }
    a[0]=point(0,0);
    sort(a+1,a+m);
    que[0]=a[0];
    front=0;
    rail=1;
    for (i=1;i<m;i++)
    {
        for (;rail>=2;rail--)
        {
            if ((que[rail-1]-que[rail-2])*(a[i]-que[rail-1])<0)
            {
                break;
            }
        }
        que[rail++]=a[i];
    }
    m=rail;
    for (i=0;i<m;i++)
    {
        a[i]=que[i];
    }
    if (check(m,n))
    {
        puts("YeS");
    }
    else
    {
        puts("nO");
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/absi2011/p/9459985.html