Codeforces Round #502 (Div.1 + 2)

賽中unrated.......ios

cf又炸了系列.......數組

最近cf還不錯,沒那麼容易炸spa

作了ABCDE五個題翻譯

 

Ablog

給你n我的的四門科目的分數,問第一我的排名多少get

分數相同的時候,id小的靠前input

 

---------------------------------------------string

寫sort也行,直接比較也行...hash

反正隨便作..it

 

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;
}
相關文章
相關標籤/搜索