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 ...
随机推荐
- linux下安装maven私服nexus
Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven仓库 ...
- ThreadPoolExecutor扩展
import java.util.concurrent.*; /** * ThreadPoolExecutor扩展 */ public class ExtThreadPool { public sta ...
- 如何使用Excel绘制甘特图
摘自:http://www.mifengtd.cn/articles/how-to-create-a-gantt-chart-in-excel.html 再造<优秀的时间管理和项目管理工具> ...
- Python中使用"subplot"在一张画布上显示多张图
subplot(arg1, arg2, arg3) arg1: 在垂直方向同时画几张图 arg2: 在水平方向同时画几张图 arg3: 当前命令修改的是第几张图 t = np.arange(0,5,0 ...
- django model的get和filter方法的区别
django的get方法: 1django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错. 2如果你用django的get去取得关联表的数据的话,而关键表的数据 ...
- [转]Win10企业版无法访问共享文件夹
Win10系统电脑在更新后,当我们访问共享文件夹时可能会出现如下图所示窗口,导致我们无法访问.那么这个问题如何解决呢?具体如下:1. 首先我们按“Windows+R键”打开运行窗口.2. 在该窗口文本 ...
- Struts2基础-4-2 -struts拦截器实现权限控制案例+ 模型驱动处理请求参数 + Action方法动态调用
1.新建项目,添加jar包到WEB-INF目录下的lib文件夹,并添加到builde path里面 整体目录结构如下 2.新建web.xml,添加struts2核心过滤器,和默认首页 <?xml ...
- 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!
<阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单元测试规约.异常日志规约.MySQL规约.工程规约.安全规约等,这是近万名阿里Java技术精英的经验总 ...
- CF 1172E Nauuo and ODT ——LCT
题目:http://codeforces.com/contest/1172/problem/E LCT好题. 考虑对每个颜色求出 “不是该颜色的点组成的连通块的 siz2 之和” .每个颜色用 LCT ...
- 前端每日实战:18# 视频演示如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZoxjXm 可交互视频教程 此视频 ...