祖孙询问

(tree.pas/c/cpp)

【问题描述】

已知一棵n个节点的有根树。有m个询问。每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系。

【输入格式】

输入第一行包括一个整数n表示节点个数。

接下来n行每行一对整数对a和b表示a和b之间有连边。如果b是-1,那么a就是树的根。

第n+2行是一个整数m表示询问个数。

接下来m行,每行两个正整数x和y。

【输出格式】

对于每一个询问,输出1:如果x是y的祖先,输出2:如果y是x的祖先,否则输出0。

【样例输入】

10

234 -1

12 234

13 234

14 234

15 234

16 234

17 234

18 234

19 234

233 19

5

234 233

233 12

233 13

233 15

233 19

【样例输出】

1

0

0

0

2

【数据规模】

对于30%的数据,n,m≤1000。

对于100%的.据,n,m≤40000,每个节点的编号都不超过40000。

/*
树剖求lca,看x和y的lca是x还是y还是其他点
*/
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 40010
int n,m,fa[maxn],num,head[maxn],root,sz[maxn],son[maxn],top[maxn],dep[maxn];
struct node{
int to,pre;
}e[maxn*];
void Insert(int from,int to){
e[++num].to=to;
e[num].pre=head[from];
head[from]=num;
}
void dfs1(int father,int now){
fa[now]=father;
dep[now]=dep[father]+;
sz[now]=;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==father)continue;
dfs1(now,to);
sz[now]+=sz[to];
if(sz[to]>sz[son[now]]||!son[now])son[now]=to;
}
}
void dfs2(int father,int now){
top[now]=father;
if(son[now])dfs2(father,son[now]);
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==fa[now]||to==son[now])continue;
dfs2(to,to);
}
}
int lca(int a,int b){
while(top[a]!=top[b]){
if(dep[top[a]]<dep[top[b]])swap(a,b);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
return a;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
scanf("%d",&n);
int x,y;
for(int i=;i<=n;i++){
scanf("%d%d",&x,&y);
if(y==-)root=x;
else{
Insert(x,y);
Insert(y,x);
}
}
dfs1(,root);
dfs2(root,root);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
int k=lca(x,y);
if(k==x){printf("1\n");continue;}
if(k==y){printf("2\n");continue;}
printf("0\n");
}
return ;
}

100分 lca

比赛

 (mat.pas/c/cpp)

【问题描述】

有两个队伍A和B,每个队伍都有n个人。这两支队伍之间进行n场1对1比赛,每一场都是由A中的一个选手与B中的一个选手对抗。同一个人不会参加多场比赛,每个人的对手都是随机而等概率的。例如A队有A1和A2两个人,B队有B1和B2两个人,那么(A1 vs B1,A2 vs B2)和(A1 vs B2,A2 vs B1)的概率都是均等的50%。

每个选手都有一个非负的实力值。如果实力值为X和Y的选手对抗,那么实力值较强的选手所在的队伍将会获得(X-Y)^2的得分。

求A的得分减B的得分的期望值。

【输入格式】

第一行一个数n表示两队的人数为n。

第二行n个数,第i个数A[i]表示队伍A的第i个人的实力值。

第三行n个数,第i个数B[i]表示队伍B的第i个人的实力值。

【输出格式】

输出仅包含一个实数表示A期望赢B多少分。答案保留到小数点后一位(注意精度)

【样例输入】

2

3 7

1 5

【样例输出】

20.0

【数据规模】

对于30%的数据,n≤50。

对于100%的.据,n≤50000;A[i],B[i]≤50000。

/*
排序后只需枚举一个人i,用一个指针指着另一 队中实力比i弱的里面最强的人,维护实力值的前缀和,实力值平方的前缀和即可算出期望。
显然指针只可能向右移动,所以这一步是线性的。
我直接用了个二分
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
using namespace std;
inline ll read(){
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
ll a[],b[];
ll s1[],s2[];
ll ans1,ans2;
int find(int x){
int l=,r=n,ans=;
while(l<=r){
int mid=(l+r)>>;
if(b[mid]<=x)l=mid+,ans=mid;
else r=mid-;
}
return ans;
}
int main(){
freopen("mat.in","r",stdin);
freopen("mat.out","w",stdout);
n=read();
for(int i=;i<=n;i++)
a[i]=read();
for(int i=;i<=n;i++)
b[i]=read();
sort(b+,b+n+);
for(int i=;i<=n;i++){
s1[i]=s1[i-]+b[i];
s2[i]=s2[i-]+b[i]*b[i];
}
for(int i=;i<=n;i++){
int t=find(a[i]);
ans1+=t*a[i]*a[i]+s2[t]-*s1[t]*a[i];
ans2+=(n-t)*a[i]*a[i]+(s2[n]-s2[t])-*(s1[n]-s1[t])*a[i];
}
printf("%.1lf",(double)(ans1-ans2)/n);
return ;
}

100分 排序+前缀和

数字

(num.c/cpp/pas)

【问题描述】

一个数字被称为好数字当他满足下列条件:

1. 它有2*n个数位,n是正整数(允许有前导0)

2. 构成它的每个数字都在给定的数字集合S中。

3. 它前n位之和与后n位之和相等或者它奇数位之和与偶数位之和相等

例如对于n=2,S={1,2},合法的好数字有1111,1122,1212,1221,2112,2121,2211,2222这样8种。

已知n,求合法的好数字的个数mod 999983。

【输入格式】

第一行一个数n。

接下来一个长度不超过10的字符串,表示给定的数字集合。

【输出格式】

一行一个数字表示合法的好数字的个数mod 999983。

【样例输入】

2

0987654321

【样例输出】

1240

【数据规模】

对于20%的数据,n≤7。

对于100%的.据,n≤1000,|S|≤10。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 2010
#define mod 999983
int n,a[maxn],num[maxn],len;
char ch[];
int dfs(int pos,int v){
if(pos==n*+){
int w=,x=,y=,z=;
for(int i=;i<=*n;i++){
if(i&)w+=num[i];//奇数位
else x+=num[i];
if(i<=n)y+=num[i];
else z+=num[i];
}
if(w==x||y==z)return ;
else return ;
}
int ans=;
for(int i=;i<=len;i++){
num[pos]=a[i];
ans=(ans+dfs(pos+,a[i]))%mod;
}
return ans;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
scanf("%d%s",&n,ch+);
len=strlen(ch+);
for(int i=;i<=len;i++)a[i]=ch[i]-'';
cout<<dfs(,);
}

20分 暴力

/*
ANS=前n位之和与后n位之和相等的方案数+奇数位之和与偶数位之和相等的方案数-前n位之和与后n位之和相等且奇数位之和与偶数位之和相等的方案数
前2个需要+的方案数直接递推,重点是最后一个要满足2个条件的方案数怎么求:
因为前n位之和=后n位之和,奇数位之和=偶数位之和
所以前n位中奇数位之和=后n位中偶数位之和 且
前n位中偶数位之和=后n位中奇数位之和
现在只要求上面这个问题的方案数
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#define mod 999983
#define ll long long
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
char ch[];
int a[];
int f[][];
ll ans;
ll cal(int x)
{
ll ans=;
for(int i=;i<=x*;i++)
if(f[x][i])
ans=(ans+((ll)f[x][i]*f[x][i]))%mod;
return ans;
}
int main()
{
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
n=read();
scanf("%s",ch);
int l=strlen(ch);
for(int i=;i<l;i++)
a[i+]=ch[i]-'';
f[][]=;
for(int i=;i<n;i++)
for(int j=;j<=n*;j++)
if(f[i][j])
for(int k=;k<=l;k++)
f[i+][j+a[k]]=(f[i+][j+a[k]]+f[i][j])%mod;
ans=*cal(n)-cal(n/)*cal(n-n/);
printf("%d",(ans%mod+mod)%mod);
return ;
}

100分

2014-10-5 NOIP模拟赛的更多相关文章

  1. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  2. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  3. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  4. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  5. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  6. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  7. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  8. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  9. 2016.10.29 NOIP模拟赛 PM 考试整理

    300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...

  10. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

随机推荐

  1. VIM中使用tab键自动完成(vim tab键自动补全 )插件supertab

    supertab.vmb 这个插件好好用, Tab自动补全 http://www.vim.org/scripts/script.php?script_id=1643 安装步骤: 1.下载 supert ...

  2. 冷门PHP函数汇总

    概述 整理一些日常生活中基本用不到的PHP函数,也可以说在框架内基本都内置了,无需我们去自行使用的函数.量不多.后续在日常开发中如遇到更多的冷门,会更新本文章 sys_getloadavg 获取系统的 ...

  3. hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)

    题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路 ...

  4. 算法(Algorithms)第4版 练习 1.3.11

    主要思路: 这个和Dijkstrad的双栈算法不太一样,后缀的计算只需要一个栈即可. 用一个栈来存数字栈即可. 遇到数字,压栈. 遇到运算法,从栈中弹出相应的数字,用该运算法计算得到结果. 再次压入栈 ...

  5. Java常用四大线程池用法以及ThreadPoolExecutor详解

    为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中,线 ...

  6. js正则表达式(2)

    找到以某个字符串开头的字符串 var myReg=/^(abc)/gim; 如果不加m,那么只找一行,而加了m可以找到每行中以该字符串开头的匹配文本. 如: abcsfsdfasd7890hklfah ...

  7. Centos 6.3 编译安装Nginx+php+Mysql

    1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables 将 -A INPUT -m state --state NEW -m tcp -p tcp --dpo ...

  8. spring与jdbc整合

    spring+jdbc开发,我使用的是c3p0连接池 1.数据库建表: create table person( id int primary key auto_increment, name var ...

  9. C语言中的文件操作

    按照字符的方式读取文件 按照行的方式读取文件 按照数据块的方式读取文件 按照格式化的方式读取文件 文件分类 记录文件:具有一定的结构记录组成,分为定长和不定长两种方式 流式文件:按照一个字符一个字符( ...

  10. HihoCoder1333 :平衡树(splay+lazy)(区间加值,区间删除)

    描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙管理一下团队的人员,但是感觉好难啊. 小Hi:说来听听? 小Ho:事情是这样的.我们有一个运动同好会 ...