B 题意:ZYB在远足中,和同学们玩了一个“数字炸弹”游戏:由主持人心里想一个在[1,N][1,N]中的数字XX,然后玩家们轮流猜一个数字,如果一个玩家恰好猜中XX则算负,否则主持人将告诉全场的人当前的数和XX比是偏大还是偏小,然后猜测的范围就会相应减小,一开始的范围是[1,N][1,N].每个玩家只能在合法的范围中猜测. 现在假设只有两个人在玩这个游戏,并且两个人都已经知道了最后的XX,若两个人都采取最优策略.求X \in [1,N]X∈[1,N]中是后手胜利的XX数量.

思路: 当n为奇数时,比如5: 1 2 3 4 5 。发现只有当X==3时 先手必输(后手始终可以跟着先手关于3的对称点选) 那么X==2(先手猜4,后手只能猜1 || 3 都是输) || 4(雷同) || 1(先手直接猜2 后手输) || 5(雷同)

那么当n为偶数时,比如 4: 1 2 3 4 。当前 X== 1 || 4 时 先手赢,当X==2时 ,先手猜4那么又变成奇数的情况了 所以一直都是先手赢

代码略......

C 题意: ZYB有一个排列P,但他只记得P中每个前缀区间的逆序对数,现在他要求你还原这个排列.

(i,j)(i < j)(i,j)(i<j)被称为一对逆序对当且仅当Ai>Aj

给定的ai是前缀区间[1,i]里面的逆序对数 直接说一组样例

下标     1 2 3 4 5 6

ai        0 1 1 4 8 10

全排列  5 3 6 2 1 4

很容易发现,ai从后往前,可以知道当前这个数在[1,i]区间有几个数比它大==a[i]-a[i-1];

10-8=2;当前[1,6]区间有2个数比它大,那么anw[6]=4;

8-4=4 ;当前[1,5]区间有四个数(6,5,3,2)比它大,4已经选了,那么anw[5]=1;

4-1=3;当前[1,4]区间有三个数(6,5,3)比它大,1,4已经选了,anw[4]=2;

1-1=0;当前[1,3]区间有0个数比它大,1,2,4已经选了,anw[3]=6;

1-0=1;当前[1,2]区间有1个数比它大,1,2,4,6已经选了,anw[2]=3;

1-0=0; 当前[1,1]区间有0个数比它大,1,2,3,4,6已经选了,anw[1]=5。

也就是用线段树或者树状数组维护第k小。k=i-(a[i]-a[i-1]);

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
///#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
#define INF (1ll<<60)-1
using namespace std;
int n;
int a[50010],tr[200010],anw[50010];
void build(int root,int l,int r){if(l==r){tr[root]=1;return ;}int mid=(l+r)>>1;build(root*2,l,mid);build(root*2+1,mid+1,r);tr[root]=tr[root*2]+tr[root*2+1];
}
int query(int root,int l,int r,int k){if(l==r){return l;}int mid=(l+r)>>1;if(tr[root*2]>=k) return query(root*2,l,mid,k);else return query(root*2+1,mid+1,r,k-tr[root*2]);
}
void update(int pos,int v,int root,int l,int r){if(l==r){tr[root]=v;return ;}int mid=(l+r)>>1;if(pos>mid) update(pos,v,root*2+1,mid+1,r);else update(pos,v,root*2,l,mid);tr[root]=tr[root*2]+tr[root*2+1];
}
int main(){int T;scanf("%d",&T);while(T--){mst(a,0);mst(anw,0);scanf("%d",&n);build(1,1,n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=n;i>=1;i--){int x=a[i]-a[i-1];anw[i]=query(1,1,n,i-x);update(anw[i],0,1,1,n);}for(int i=1;i<=n;i++){if(i==1) printf("%d",anw[i]);else printf(" %d",anw[i]);}printf("\n");}return 0;
}

D题意:ZYB有一颗N个节点的树,现在他希望你对于每一个点,求出离每个点距离不超过K的点的个数.

两个点(x,y)在树上的距离定义为两个点树上最短路径经过的边数,输出N个点的答案的xor和。

思路:第一遍DFS找当前节点向下走的长度<=k的num。第二遍DFS找当前节点向上走的长度<=k的num。

第一遍的时候直接搜就可以了,第二遍分两次取anw,令前节点为v,当前节点的父亲为x,仔细想一下,要寻找当前节点向上的num,是不是可以分成

1.找v的兄弟的num也就是父亲x的子节点 2.找父亲x的祖先  到x长度<=k-1的num

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define inf 0x3f3f3f3f
#define MAX 500010
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
#define INF (1ll<<60)-1
using namespace std;
int n,k,A,B,tot;
int head[MAX];
struct node{int to,next;
}edge[MAX];
void add(int u,int v){edge[tot].to=v; /// 当前边 u->vedge[tot].next=head[u]; /// 连接 u 节点的上一条边head[u]=tot++;
}
int son[MAX][15],pre[MAX][15],anw[MAX];
void init(){mst(head,-1); mst(son,0); mst(pre,0); mst(anw,0);tot=0;
}
void DFS(int x){son[x][0]=1;for(int i=head[x];i!=-1;i=edge[i].next){int v=edge[i].to;DFS(v);for(int j=1;j<=k;j++) son[x][j]+=son[v][j-1];}
}
void DFS1(int x){///pre[x][0]=1;for(int i=0;i<=k;i++) anw[x]+=(son[x][i]+pre[x][i]);for(int i=head[x];i!=-1;i=edge[i].next){int v=edge[i].to;for(int j=1;j<13;j++) pre[v][j]+=(pre[x][j-1]);pre[v][1]++;for(int j=2;j<13;j++) pre[v][j]+=(son[x][j-1]-son[v][j-2]);DFS1(v);}
}
int main(){int T;scanf("%d",&T);while(T--){init();scanf("%d%d%d%d",&n,&k,&A,&B);for(int i=2;i<=n;i++){ll w=((ll)A*i+B)%(i-1)+1;add((int)w,i);}DFS(1);DFS1(1);/*for(ll i=1;i<=n;i++) cout<<son[i][k]<<" ";cout<<endl;for(ll i=1;i<=n;i++){for(ll j=0;j<=k;j++){cout<<pre[i][j]<<" ";}cout<<endl;}*/int ans=0;for(int i=1;i<=n;i++) ans^=anw[i];printf("%d\n",ans);}return 0;
}

  

转载于:https://www.cnblogs.com/CrossCross/p/5029431.html

BestCoder Round #65 B C D || HDU 5591 5592 5593相关推荐

  1. BestCoder Round #4 前两题 hdu 4931 4932

    第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include< ...

  2. hdu 4956 Poor Hanamichi BestCoder Round #5(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956 Poor Hanamichi Time Limit: 2000/1000 MS (Java/Ot ...

  3. HDU 5228 ZCC loves straight flush( BestCoder Round #41)

    题目链接:ZCC loves straight flush 题面: ZCC loves straight flush Time Limit: 2000/1000 MS (Java/Others)    ...

  4. HDU 5804 BestCoder Round #86 Price List (水题)

    Price List 题目链接: 点我打开链接 Source BestCoder Round #86  题意:有一个人去 n 间商店购物,在每家商店购买最多一件物品,也可以什么都不买.给你每家商店的物 ...

  5. HDU 5597 GTW likes function(规律+欧拉函数模板题)——BestCoder Round #66(div.1 div.2)

    GTW likes function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  6. hdu4585 amp; BestCoder Round #1 项目管理(vector应用)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 项目管理 Time Limit: 2000/1000 MS (Java/Others)    M ...

  7. hdu4932 Miaomiao#39;s Geometry (BestCoder Round #4 枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4932 Miaomiao's Geometry Time Limit: 2000/1000 MS (Ja ...

  8. BestCoder Round #90 Kblack loves flag

     BestCoder Round #90 Kblack loves flag 问题描述 kblack喜欢旗帜(flag),他的口袋里有无穷无尽的旗帜. 某天,kblack得到了一个n∗mn*mn∗ ...

  9. 矩阵快速幂---BestCoder Round#8 1002

    当要求递推数列的第n项且n很大时,怎么快速求得第n项呢? 可以用矩阵快速幂来加速计算. 我们可以用矩阵来表示数列递推公式 比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [ ...

最新文章

  1. 肝了3版才满意:分布式系统之CAP理论,我们对它的理解和误解
  2. 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))
  3. Mybayis的项目使用的Mapping文件使用总结参考(一)
  4. 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程
  5. jquery-索引2019
  6. 用busybox制作文件系统
  7. 《An Attentive Survey of Attention Models》阅读笔记
  8. 蓝色妖姬T3300摄像头有驱动无法显示画面解决方案
  9. Linux的进程调度算法简介
  10. 像中文的罗马音字体复制_罗马音字体复制大全
  11. 使用hexo+github搭建免费个人博客详细教程
  12. ios设备开发教程-利用app申请ios开发证书及描述文件
  13. 利用Python制作本地Excel的查询与生成的程序
  14. win10修改DNS
  15. 《魔兽》审批 文化部出版署到底谁说了算?
  16. odoo 开发入门教程系列-安全-简介
  17. MySQL实验4 数据的查询
  18. 软件无线电:到2025年蓬勃发展的显著增长前景和趋势
  19. mysql基于微信小程序的化妆品商城系统设计与实现毕业设计源码041152
  20. 阿里云代理商(聚搜云):这是云计算最好的时代

热门文章

  1. 我是主考官:两次弃用的变态笔试题
  2. 定义一个属性_Python property属性
  3. linux java内存分析_Java内存分析利器MAT使用详解
  4. python 桑基图 地理坐标_【转载】Python数据可视化-实现Sankey桑基图
  5. 上传代码到git上的分支(协同开发)
  6. 1003 我要通过!
  7. 线性回归预测PM2.5值
  8. springboot 简单自定义starter - beetl
  9. 阿里云双12服务器和阿里云双12数据库活动又开始了
  10. linux实战考试题:批量创建用户和密码(不能使用循环)