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