zoukankan      html  css  js  c++  java
  • 测试 5

    思路:找规律

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    int n,m;
    int main() {
        freopen("star.in","r",stdin);
        freopen("star.out","w",stdout);
        while(scanf("%d%d",&n,&m)&&n!=0&&m!=0) {
            if(!(n&1)||!(m&1)) printf("Yuri
    ");
            else printf("Chito
    ");
        }
        return 0;
    }

    #include<set>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream> 
    #include<algorithm>
    #define mod 1000000007
    using namespace std;
    set<int>se;
    int n,k,ans;
    int val[50010],num[100000];
    int cmp(int a,int b){
        return a>b;
    }
    int main(){
        freopen("war.in","r",stdin);
        freopen("war.out","w",stdout);
        scanf("%d%d",&n,&k);
        if(n<=100){
            int tot=0;
            memset(num,0,sizeof(num));
            for(int i=1;i<=n;i++)    scanf("%d",&val[i]);
            for(int i=1;i<=n;i++)
                for(int j=i+1;j<=n;j++)
                    num[++tot]=val[i]^val[j];
            sort(num+1,num+1+tot,cmp);
            for(int i=1;i<=k;i++)    ans=(ans+num[i])%mod;
            cout<<ans;
            return 0;
        }
        if(k==1){
            for(int i=1;i<=n;i++)     scanf("%d",&val[i]);
            sort(val+1,val+1+n);
            for(int i=1;i<=n;i++)
                for(int j=i+1;j<=n;j++)
                    ans=max(ans,val[i]^val[j]);
            cout<<ans;
        }
        else{
            for(int i=1;i<=n;i++){
                scanf("%d",&val[i]);
                se.insert(val[i]);
            }    
            int num1[1000],num2[1000],sum,tot1=0,tot2=0,tot=0;
            for(int i=1023;i>=1;i--){
                memset(num1,0,sizeof(num1));
                if(tot==k)    break;
                tot1=0;
                int xx=i;
                while(xx){
                    num1[++tot1]=xx%2;
                    xx/=2;
                }
                for(int j=1;j<=n;j++){
                    memset(num2,0,sizeof(num2));
                    tot2=0,sum=0;
                    int yy=j;
                    while(yy){
                        num2[++tot2]=yy%2;
                        yy/=2;
                    }
                    for(int q=1;q<=tot2;q++){
                        if(num1[q]==0&&num2[q]==1)    sum+=pow(2,q-1);
                        else if(num1[q]==1&&num2[q]==0)    sum+=pow(2,q-1); 
                    }
                    if(se.find(sum)!=se.end()){
                        ans=(ans+i)%mod;
                        tot++;
                        if(tot==k)    break;    
                    }
                } 
            }
            cout<<ans;
        }
    }
    40分暴力

    #include<ctime>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 100010
    using namespace std;
    struct nond{
        int l,r,flag,dis;
    }tree[MAXN*4];
    int n,m,t;
    int tot,cnt,sumcnt;
    int num[MAXN],hash[MAXN],root[MAXN],coppy[MAXN];
    int sum[MAXN*20],lchild[MAXN*20],rchild[MAXN*20];
    int cmp(int a,int b){    return a>b;}
    void HASH(){
        sort(hash+1,hash+1+n);
        tot=unique(hash+1,hash+1+n)-(hash+1);//求去重后元素的个数 
        for(int i=1;i<=n;i++)
            num[i]=lower_bound(hash+1,hash+tot+1,num[i])-hash;
    }
    void build(int x,int &y,int l,int r,int k){
        y=++cnt;
        sum[y]=sum[x]+1;
        if(l==r)    return ;
        int mid=(l+r)/2;
        if(k<=mid){
            rchild[y]=rchild[x];
            build(lchild[x],lchild[y],l,mid,k);
        }
        else{
            lchild[y]=lchild[x];
            build(rchild[x],rchild[y],mid+1,r,k);
        }
    }
    int query(int x,int y,int l,int r,int k){
        if(l==r)    return l;
        int mid=(l+r)/2;
        int tmp=sum[lchild[y]]-sum[lchild[x]];
        if(tmp>=k)    return query(lchild[x],lchild[y],l,mid,k);
        else return query(rchild[x],rchild[y],mid+1,r,k-tmp);
    }
    
    void up(int now){
        tree[now].dis=max(tree[now*2].dis,tree[now*2+1].dis); 
    }
    void build1(int now,int l,int r){
        tree[now].l=l;
        tree[now].r=r;
        if(tree[now].l==tree[now].r){
            tree[now].dis=num[++sumcnt];
            return ;
        }
        int mid=(tree[now].l+tree[now].r)/2;
        build1(now*2,l,mid);
        build1(now*2+1,mid+1,r);
        up(now);
    }
    void down(int now){
        tree[now*2].flag+=tree[now].flag;
        tree[now*2+1].flag+=tree[now].flag;
        tree[now*2].dis+=tree[now].flag;
        tree[now*2+1].dis+=tree[now].flag;
        tree[now].flag=0;
    }
    void change(int now,int optl,int optr,int k){
        if(tree[now].l==optl&&tree[now].r==optr){
            tree[now].dis+=k;
            tree[now].flag+=k;
            return ;
        }
        if(tree[now].flag)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(optr<=mid)    change(now*2,optl,optr,k);
        else if(optl>mid)    change(now*2+1,optl,optr,k);
        else{
            change(now*2,optl,mid,k);
            change(now*2+1,mid+1,optr,k);
        }
        up(now);
    }
    int query1(int now,int optl,int optr){
        if(tree[now].l==optl&&tree[now].r==optr)
            return tree[now].dis;
        if(tree[now].flag)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(optr<=mid)    return query1(now*2,optl,optr);
        else if(optl>mid)    return query1(now*2+1,optl,optr);
        else return max(query1(now*2,optl,mid),query1(now*2+1,mid+1,optr)); 
     } 
    int main(){
        freopen("noname.in","r",stdin);
        freopen("noname.out","w",stdout);
        //t=clock();
        scanf("%d%d",&n,&m);
        if(n<=1000&&m<=1000){
            for(int i=1;i<=n;i++)    scanf("%d",&num[i]);
            for(int i=1;i<=m;i++){
                int opt,l,r,k,sum=0;
                scanf("%d%d%d%d",&opt,&l,&r,&k);
                if(l>r)    swap(l,r); 
                if(opt==0){
                    if(k>r-l+1)    cout<<"-1"<<endl;
                    else{
                        for(int i=l;i<=r;i++)     coppy[++sum]=num[i];
                        sort(coppy+1,coppy+1+sum,cmp);
                        cout<<coppy[k]<<endl; 
                    }
                }
                else if(opt==1)    for(int i=l;i<=r;i++)    num[i]+=k;
            }
        }
        else{
            int sum1=0;
            int opt[MAXN],l[MAXN],r[MAXN],k[MAXN];
            for(int i=1;i<=n;i++)
                scanf("%d",&num[i]);
            for(int i=1;i<=m;i++){
                scanf("%d%d%d%d",&opt[i],&l[i],&r[i],&k[i]);
                if(l[i]>r[i])    swap(l[i],r[i]);
                if(k[i]!=1&&opt[i]==0)    sum1++;
            }
            if(!sum1){
                build1(1,1,n);
                for(int i=1;i<=m;i++){
                    if(opt[i]==1)    change(1,l[i],r[i],k[i]);
                    else{
                        if(k[i]>r[i]-l[i]+1)    cout<<"-1"<<endl;
                        else cout<<query1(1,l[i],r[i])<<endl;
                    }
                }
            }
            else{
                for(int i=1;i<=n;i++)    hash[i]=num[i];
                HASH();
                for(int i=1;i<=n;i++)
                    build(root[i-1],root[i],1,tot,num[i]);
                for(int i=1;i<=m;i++)
                    if(opt[i]==0){
                        if(k[i]>r[i]-l[i]+1)    cout<<"-1"<<endl;
                        else  printf("%d
    ",hash[query(root[l[i]-1],root[r[i]],1,tot,k[i])]);
                    }
            }
        }
        //cout<<"8888888888888****************"<<clock()-t;
    }
    /*
    5 3
    1 2 3 4 5
    0 2 3 1
    1 2 2 4
    0 2 3 1
    */
    50分暴力
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 100010
    using namespace std;
    int n,m;
    struct nond{
        int l,r,flag,sum[11];
    }tree[MAXN*4];
    void up(int now){
        int i=1,j=1;
        for(int k=1;k<=min(10,tree[now].r-tree[now].l+1);k++){
            if(tree[now*2].sum[i]<tree[now*2+1].sum[j]){ tree[now].sum[k]=tree[now*2+1].sum[j];j++; }
            else{ tree[now].sum[k]=tree[now*2].sum[i];i++; }
        }
    }
    void build(int now,int l,int r){
        tree[now].l=l;
        tree[now].r=r;
        if(tree[now].l==tree[now].r){
            scanf("%d",&tree[now].sum[1]);
            return ;
        }
        int mid=(tree[now].l+tree[now].r)/2;
        build(now*2,l,mid);
        build(now*2+1,mid+1,r);
        up(now);
    }
    void down(int now){
        tree[now*2].flag+=tree[now].flag;
        tree[now*2+1].flag+=tree[now].flag;
        for(int i=1;i<=min(10,tree[now*2].r-tree[now*2].l+1);i++)
            tree[now*2].sum[i]+=tree[now].flag;
        for(int i=1;i<=min(10,tree[now*2+1].r-tree[now*2+1].l+1);i++)
            tree[now*2+1].sum[i]+=tree[now].flag;
        tree[now].flag=0;
    }
    void change(int now,int optl,int optr,int k){
        if(tree[now].l==optl&&tree[now].r==optr){
            tree[now].flag+=k;
            for(int i=1;i<=min(10,tree[now].r-tree[now].l+1);i++)
                tree[now].sum[i]+=k;
            return ;
        }
        if(tree[now].flag)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(optr<=mid)    change(now*2,optl,optr,k);
        else if(optl>mid)    change(now*2+1,optl,optr,k);
        else{
            change(now*2,optl,mid,k);
            change(now*2+1,mid+1,optr,k);
        }
        up(now);
    }
    nond query(int now,int optl,int optr,int k){
        if(tree[now].l==optl&&tree[now].r==optr)
            return tree[now];
        if(tree[now].flag)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(optr<=mid)    return query(now*2,optl,optr,k);
        else if(optl>mid)    return query(now*2+1,optl,optr,k);
        else{
            nond c;memset(c.sum,0,sizeof(c.sum));
            nond a=query(now*2,optl,mid,k);
            nond b=query(now*2+1,mid+1,optr,k);
            int i=1,j=1;
            c.l=tree[now].l;c.r=tree[now].r;c.flag=tree[now].flag;
            for(int kk=1;kk<=min(k,a.r-a.l+1+b.r-b.l+1);kk++){
                if(a.sum[i]<b.sum[j]){ c.sum[kk]=b.sum[j];j++; }
                else if(a.sum[i]>=b.sum[j]){ c.sum[kk]=a.sum[i];i++; }
            }
            return c;
        }
    }
    int main(){
        freopen("noname.in","r",stdin);
        freopen("noname.out","w",stdout);
        scanf("%d%d",&n,&m);
        build(1,1,n);
        while(m--){
            int opt,l,r,k;
            scanf("%d%d%d%d",&opt,&l,&r,&k);
            if(opt==0){
                if(r-l+1<k)    cout<<"-1"<<endl;
                else{
                    nond b=query(1,l,r,k);
                    cout<<b.sum[k]<<endl;
                }
            }
            else    change(1,l,r,k);
        }
    }
    /*
    5 3
    1 2 3 4 5
    0 2 3 1
    1 2 2 4
    0 2 3 1
    */
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    phpcms 任意位置获取用户头像
    php微信公众帐号发送红包
    nginx解决502错误
    phpcms v9 万能字段使用
    0转换为万
    温故而知新(三)
    温故而知新(一)
    基础积累,来自其他网站的链接
    GCD多线程 在子线程中获取网络图片 在主线程更新
    iOS9 中的一些适配问题
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7787900.html
Copyright © 2011-2022 走看看