测试 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\n");
        else printf("Chito\n");
    }
    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\n",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
*/

 

posted @ 2017-11-05 17:16  一蓑烟雨任生平  阅读(700)  评论(0编辑  收藏  举报