• 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
    ",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]!='';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
    ",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;
    }
    

      

  • 相关阅读:
    Apache Kafka:下一代分布式消息系统
    深入理解Java之线程池
    JAVA中线程同步的方法(7种)汇总
    String、StringBuffer与StringBuilder之间区别
    Java中是否可以继承String类,为什么
    JAVA4种线程池的使用
    一分钟教你知道乐观锁和悲观锁的区别
    java常见面试题及答案 11-20(JVM)
    springmvc中的页面解析器ViewResolver不起作用,变量输出字符串的解决方案
    SpringMVC默认欢迎页面的问题
  • 原文地址:https://www.cnblogs.com/absi2011/p/9459985.html
Copyright © 2020-2023  润新知