day3上午

来源:互联网 发布:奥尼尔各赛季数据 编辑:程序博客网 时间:2024/05/01 21:54

t1
点点星空是一张N*M的棋盘,左下角有颗星星。尤和千每次可以将星星向
右边、右上、上边移动一格。尤和千轮流移动,尤先手,问尤是否必胜?
模拟一下n&1&&m&1

#include<cstdio>int n,m,t;int main (){    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&m);        if(n&1&&m&1) printf("Chito\n");        else printf("Yuri\n");    }}

t2
战场上有N个数,两两异或可以得到N×N−1/2
个数,求这些数中前K大的数的和
暴力60

#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<queue>#include<algorithm>using namespace std;int n,k;long long a[199999],tot,cnt[1024],f,ans;long long s[1999990];bool cmp(long long a,long long b){    return a>b;}int main(){    //freopen("war.in","r",stdin);    //freopen("war.out","w",stdout);    scanf("%d%d",&n,&k);    for(int i=1;i<=n;i++)    {scanf("%lld",&a[i]);    if(a[i]>1023) f=1;    else    cnt[a[i]]++;    }    if(!f){        for(int i=0;i<=1023;i++)        for(int j=i+1;j<=1023;j++)        s[i^j]+=cnt[i]*cnt[j];        for(int i=1023;i>=1;i--){            if(s[i]&&s[i]<k) ans+=i*s[i],k-=s[i];            else if(s[i]) ans=(ans+1ll*i*k)%1000000007,k=0;        }            printf("%lld",ans%1000000007);            return 0;    }    for(int i=1;i<=n;i++)    for(int j=1;j<i;j++)    s[++tot]=1ll*a[i]^a[j];    sort(s+1,s+tot+1,cmp);    for(int i=1;i<=k;i++)    ans=(1ll*ans+s[i])%1000000007;    printf("%lld",ans%1000000007);}

t3
N个数,M次操作,每次询问区间第K大,或者给区间加上一个数
线段树维护前十大值,简单的模板。。。

#include<cstdio>#include<cmath>#include<ctime>#include<cstring>#include<queue>#include<algorithm>using namespace std;struct st{    int z[11],add;     st operator +(const st &b){        st ans;int tot=1,tot2=1;        for(int i=1;i<=10;i++)        if(z[tot]>b.z[tot2]) ans.z[i]=z[tot++];        else ans.z[i]=b.z[tot2++];        ans.add=0;        return ans;    }}t[410999];void built(int o,int l,int r){    if(l==r) {scanf("%d",&t[o].z[1]);        return ;    }    int mid=(l+r)>>1;    built(o<<1,l,mid);    built(o<<1|1,mid+1,r);    t[o]=t[o<<1]+t[o<<1|1];}void pushdown(int o){    if(t[o].add){        t[o<<1].add+=t[o].add;        t[o<<1|1].add+=t[o].add;        for(int i=1;i<=10;i++)        if(t[o<<1].z[i]) t[o<<1].z[i]+=t[o].add;        for(int i=1;i<=10;i++)        if(t[o<<1|1].z[i]) t[o<<1|1].z[i]+=t[o].add;        t[o].add=0;    }}st query(int o,int l,int r,int ql,int qr){    if(l>qr||r<ql) {        st tmp;        tmp.add=0;        for(int i=1;i<=10;i++) tmp.z[i]=0;        return tmp;    }    if(l>=ql&&r<=qr) {        return t[o];    }    pushdown(o);    int mid=(l+r)>>1;    return query(o<<1,l,mid,ql,qr)+query(o<<1|1,mid+1,r,ql,qr);}void add(int o,int l,int r,int ql,int qr,int ins){    if(l>qr||r<ql) return ;    if(l>=ql&&r<=qr) {        for(int i=1;i<=10;i++)        if(t[o].z[i]) t[o].z[i]+=ins;        t[o].add+=ins;         return ;    }    pushdown(o);    int mid=(l+r)>>1;    add(o<<1,l,mid,ql,qr,ins);add(o<<1|1,mid+1,r,ql,qr,ins);    t[o]=t[o<<1]+t[o<<1|1];}int n,m;int main(){    freopen("noname.in","r",stdin);    freopen("noname.out","w",stdout);     scanf("%d%d",&n,&m);    built(1,1,n);    while(m--){        int opt,l,r,x;        scanf("%d%d%d%d",&opt,&l,&r,&x);        if(opt==1) add(1,1,n,l,r,x);        else {            if(r-l+1<x) printf("-1\n");            else printf("%d\n",query(1,1,n,l,r).z[x]);        }    } }
原创粉丝点击