测试 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; } }
#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 */
#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 */
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。