day3上午

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]);
        }
    } 

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值