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 ...
随机推荐
- ansible笔记(三)--模块讲解
ansible 常用命令 ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull ...
- bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...
- [Luogu1938][USACO09NOV]找工就业Job Hunt
原题链接:https://www.luogu.org/problem/show?pid=1938 这一道题有一个比较难的点就是,这一张图上,是点上有权.既然点上有权的话,我们就不好一下子使用最短路了. ...
- Ubuntu用户权限管理(chown, chmod)
改变文件所有权chown 例如 sudo chown username myfile myfile文件的所有权变为username. chown -R username /files/work 加入参 ...
- flask中间件请求流程
from flask import Flask,session,url_for,request,flash,get_flashed_messages app = Flask(__name__) app ...
- 【Vim编辑器】基本命令
前言 工作中免不了会使用到vim编辑文档,总会觉得不好上手,遂从网上找到一篇说明文档整理如下,共勉. 原文地址: https://www.cnblogs.com/shiyanlou/archive/2 ...
- 在python3.7下怎么安装matplotlib与numpy
一.安装matplotlib 1.在Matplotlib的官网下载电脑对应的版本,网址为:https://pypi.org/project/matplotlib/#files 2.将在下载的.whl文 ...
- jquery动态修改带有important的样式方法
$('.el-card').css("background", "#fff !important");(不起作用的) 改为: $('.el-card').css ...
- [HDU3117]Fibonacci Numbers
题目:Fibonacci Numbers 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117 分析: 1)后四位可以用矩阵快速幂解决.$T= \left ...
- 2018-2019-2 20175126谢文航 实验三《敏捷开发与XP实践》实验报告
一.实验报告封面 课程:Java程序设计 班级:1751 班 姓名:谢文航 学号:20175126 指导教师:娄嘉鹏 实验日期:2019年5月2日 实验时间:--- 实验序号:实验三 实验名称:敏捷开 ...