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 ...
随机推荐
- Codeforces Round #538 (Div. 2) (CF1114)
Codeforces Round #538 (Div. 2) (CF1114) 今天昨天晚上的cf打的非常惨(仅代表淮中最低水平 先是一路缓慢地才A掉B,C,然后就开始杠D.于是写出了一个O( ...
- This MySqlConnection is already in use
项目中类似于以下的代码,实际的代码要更复杂,DbContext是依赖注入的: 报错如下: This MySqlConnection is already in use. See https://fl. ...
- 在VMware中配置网卡之NAT模式
为什么要在VMware中配置网卡? 因为在远程连接服务器时,需要虚拟机连接网络 虚拟机网络配置的三种模式:桥接模式,NAT模式,主机模式 NAT模式也称之为网络转换模式,两层路由: 第一层路由:物理机 ...
- PHP curl_exec函数
curl_exec — 执行一个cURL会话 说明 mixed curl_exec ( resource $ch ) 执行给定的cURL会话. 这个函数应该在初始化一个cURL会话并且全部的选项都被设 ...
- 攻防世界 WEB篇
0x01 ics-06 查看源码发现:index.php 一开始直接用sqlmap跑了下没有发现注入,然后用brupsuite爆破参数 0x02 NewsCenter SQL注入中的POST注入,查阅 ...
- BZOJ 4399: 魔法少女LJJ(线段树)
传送门 解题思路 出题人真会玩..操作\(2\)线段树合并,然后每棵线段树维护元素个数和.对于\(6\)这个询问,因为乘积太大,所以要用对数.时间复杂度\(O(nlogn)\) 代码 #include ...
- nodejs环境安装
centos7安装nodejs环境 原文地址: https://www.cnblogs.com/MY0101/p/6625344.html 下载地址: https://nodejs.org/dist/ ...
- 2018-2019-2 20175223 实验四 《Android开发基础》实验报告
目录 北京电子科技学院(BESTI)实验报告 实验名称:实验四 Android程序设计 实验内容.步骤与体会: 一.实验四 Android程序设计-1 二.实验四 Android程序设计-2 三.实验 ...
- wsl和windows相互访问文件夹
How to access Windows folders from Bash on Ubuntu on Windows You'll find the Windows C:\ structure a ...
- 使用 Gradle 快速创建 Java 项目
上一篇介绍了如何安装 Gradle,现在就可以直接通过已经安装好的 Gradle 创建一个普通 Java 项目 Gradle 默认内建了一个 init 插件,可以生成 Java 项目基础结构 $ gr ...