The Preliminary Contest for ICPC Asia Xuzhou 2019 I J
I. query
题意:给出n的一个排列,有m个询问[l,r],询问[l,r]直接有倍数关系的pair个数。
解法:比赛完之后听说是原题,但是我没做过呀,做题太少了qwq。首先因为数字是1-n的,所以所有的pair总数就是n/1+n/2+n/3...=nlogn。也就是说我们可以把所有的pair预处理出来,然后对于一个pair<x,y>,我们令sum[y]++,做完之后我们对sum做个前缀和,那么我们最后得到的sum是什么呢?sum[i]就代表左右端点都小于等于i的pair数量。那么此时对于一个询问[li,ri],ans[i]=sum[ri]-sum[li]。但是还不能高兴太早,注意到其实这一部分ans还加多了横跨查询左端点li的数量,我们需要减去这部分数量。
现在我们就要解决这个问题:从左到右扫描i,然后在Bit上记录[1,i-1]的数的所有pair的右端点(例如有一对pair<x,y>,那么就令bit[y]++),那么此时对于一i为左端点的查询[l,r],要减去的部分就是bit[r]-bit[l-1]。为什么?因为我们此时我们只遍历到i且只把[1,i-1]的所有数的pair(即这些pair的左端点只在[1,i-1]区间)都计算右端点贡献了,那么bit[y]就是这堆[1,i-1]的pair的右端点总和小于等于y的pair数,bit[x-1]同理,那么bit[y]-bit[x-1]就是这些pair的右端点只在[i,y]区间且根据上面他们的左端点只在[1,i-1]区间,当然这个数就是左端点在[1,x-1]右端点在[x,y]的pair数了。
于是此题就可以AC了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,a[N],pos[N],ans[N],x[N],y[N],sum[N];
vector<int> G[N],v[N]; int bit[N];
void update(int x,int v) {
for (;x<=n;x+=x&-x) bit[x]+=v;
}
int query(int x) {
int ret=;
for (;x;x-=x&-x) ret+=bit[x];
return ret;
} int main()
{
cin>>n>>m;
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=m;i++) {
scanf("%d%d",&x[i],&y[i]);
G[x[i]].push_back(i);
} for (int i=;i<=n;i++) pos[a[i]]=i;
for (int i=;i<=n;i++)
for (int j=*i;j<=n;j+=i) {
int t1=pos[i],t2=pos[j];
if (t1>t2) swap(t1,t2);
v[t1].push_back(t2);
sum[t2]++;
}
for (int i=;i<=n;i++) sum[i]+=sum[i-];
for (int i=;i<=n;i++) {
for (int j=;j<G[i].size();j++)
ans[G[i][j]]-=query(y[G[i][j]])-query(x[G[i][j]]-);
for (int j=;j<v[i].size();j++)
update(v[i][j],);
}
for (int i=;i<=m;i++)
ans[i]+=sum[y[i]]-sum[x[i]-];
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}
J. Random Access Iterator
题意:给出一棵n个结点的树,从树根1出发,对于每个点都是选择k次:每次选择一个儿子走直到没得走(k是该点儿子个数)。问从1出发能到达最深叶子的概率。
解法:裸的树形概率dp。设dp[x]代表从x出发子树能到达最深叶子概率。
那么dp[x]=1 - ( sigma( (1-dp[y]) / k) ) ^ k 。其实就是反向思考,每个儿子都不能走到最深的概率相加就是一次实验不能到达最深叶子的概率,那么k次方就是k次实验都不能到达最深叶子概率,然后用1减就是,至少到达一次的概率。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
const int P=1e9+;
typedef long long LL;
int n,indeg[N],son[N],Max,dep[N];
vector<int> G[N];
LL dp[N]; LL power(LL x,LL p) {
if (x==) return ;
LL ret=;
for (;p;p>>=) {
if (p&) ret=ret*x%P;
x=x*x%P;
}
return ret;
} queue<int> q;
void bfs() {
q.push(); dep[]=;
while (!q.empty()) {
int x=q.front(); q.pop();
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (dep[y]==) {
dep[y]=dep[x]+;
Max=max(Max,dep[y]);
q.push(y);
indeg[x]++; son[x]++;
}
}
}
} void toposort() {
for (int i=;i<=n;i++) {
dp[i]=;
if (indeg[i]==) {
q.push(i);
if (dep[i]!=Max) dp[i]=;
}
} while (!q.empty()) {
int x=q.front(); q.pop();
dp[x]=power(dp[x],son[x]);
dp[x]=(-dp[x]+P)%P;
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (indeg[y]==) continue;
dp[y]=(dp[y]+(-dp[x]+P)%P*power(son[y],P-)%P)%P;
if (--indeg[y]==) q.push(y);
}
}
} int main()
{
cin>>n;
for (int i=;i<n;i++) {
int x,y; scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
bfs();
toposort();
printf("%lld",dp[]);
return ;
}
The Preliminary Contest for ICPC Asia Xuzhou 2019 I J的更多相关文章
- 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)
query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team [单调栈上二分]
也许更好的阅读体验 \(\mathcal{Description}\) 给n个数,与一个数m,求\(a_i\)右边最后一个至少比\(a_i\)大\(m\)的数与这个数之间有多少个数 \(2\leq n ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019
A:Who is better? 题目链接:https://nanti.jisuanke.com/t/41383 题意: 类似于有N个石子,先手第一次不能拿完,每次后手只能拿 1 到 前一次拿的数量* ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
题目链接:https://nanti.jisuanke.com/t/41387 思路:我们需要从后往前维护一个递增的序列. 因为:我们要的是wi + m <= wj,j要取最大,即离i最远的那个 ...
- 计蒜客 41387.XKC's basketball team-线段树(区间查找大于等于x的最靠右的位置) (The Preliminary Contest for ICPC Asia Xuzhou 2019 E.) 2019年徐州网络赛
XKC's basketball team XKC , the captain of the basketball team , is directing a train of nn team mem ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 【 题目:so easy】{并查集维护一个数的下一个没有被删掉的数} 补题ING
题意:给[1,n],n个数,有两种操作: 1 x,删去x2 x,查询还未被删去的数中大于等于x的最小的数是多少. input: output: 做法:按照并查集的方法压缩路径 代码: #include ...
- G.Colorful String(The Preliminary Contest for ICPC Asia Xuzhou 2019)
https://nanti.jisuanke.com/t/4 #include <bits/stdc++.h> using namespace std; ,; typedef unsign ...
- E.XKC's basketball team(The Preliminary Contest for ICPC Asia Xuzhou 2019)
https://nanti.jisuanke.com/t/41387 解: 离散化+线段树. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); ...
- A.Who is better?(The Preliminary Contest for ICPC Asia Xuzhou 2019)
https://nanti.jisuanke.com/t/41383 解: 斐波那契博弈+中国剩余定理. #include <bits/stdc++.h> using namespace ...
随机推荐
- java23种设计模式(三)-- 适配器模式
一.适配器模式 转载:https://www.cnblogs.com/V1haoge/p/6479118.html 适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配, ...
- WPF 几种常用控件样式的总结
这里把wpf中几种常用样式总结一下,后期可以直接拷贝使用,呵呵 一.Button <ResourceDictionary xmlns="http://schemas.microsoft ...
- html5 带声音的导航
代码实例: <!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3. ...
- LOJ2586 APIO2018 选圆圈
考前挣扎 KD树好题! 暴力模拟 通过kd树的结构把子树内的圈圈框起来 然后排个序根据圆心距 <= R1+R2来判断是否有交点 然后随便转个角度就可以保持优越的nlgn啦 卡精度差评 必须写ep ...
- JPA @Id 和 @GeneratedValue 注解详解
JPA @Id 和 @GeneratedValue 注解详解 @Id: @Id 标注用于声明一个实体类的属性映射为数据库的主键列.该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上 ...
- CDH6.3 Centos7
按照官方文档安装即可 CentOS7 上搭建 CDH(6.3.0) 官方文档:https://docs.cloudera.com/documentation/enterprise/6/6.3/topi ...
- python+selenium自动化框架搭建
环境及使用软件信息 python 3 selenium 3.13.0 xlrd 1.1.0 chromedriver HTMLTestRunner 说明: selenium/xlrd只需要再pytho ...
- 如何用命令行启动android的模拟器(简要描述)
参考来源 http://blog.sina.com.cn/s/blog_5033827f0101cxhz.html 环境前置条件: 已安装JDK,已下载并安装了SDK 1.查看已安装的SDK平台:an ...
- 【leetcode】331. Verify Preorder Serialization of a Binary Tree
题目如下: One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null ...
- json序列化反序列
json只能处理简单的数据类型:字典 列表等... 文件只能存字符串和二进制 序列化:把内存的对象变为字符串 反序列化:将字符串变回为内存对象