P3899 [湖南集训]谈笑风生】的更多相关文章

题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的父亲. 第一种情况很好处理,写法见代码,懒得讲,反正很简单的. 第二种情况的话,按Dfs序建主席树,用主席树维护下标为Dep的序列,每次用Size-1(因为不能取本身:Size[i]即为以i为根的子树节点数)去更新, 询问的时候在以A为根的子树中查找Dep[A]+1~Dep[A]+K的和即可. 不思…
传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为a子树大小\(sz_a-1\) 否则,答案为\(sz_b-1\) 加上\(k\)的限制后,如果根节点1的深度\(de_1=1\)那么节点\(a\)的答案就是\(\sum_{b在a子树中,b\ne a,dist(a,b)\leq k}\ \ (sz_b-1)+\min(k,de_a-1)*(sz_a-…
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P3899 思路 三个点肯定在1到c的链上 a已经确定 1.b是a的祖先,答案就是(siz[u]-1)*min(dis[u]-1,k) 2.a是b的祖先,要求\(1<=dis[b]-dis[a]<=k\) \(1+dis[a]<=dis[b]<=k+dis[a]\) 第一问可以快速求出 第二…
Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str(),"r",stdin); freopen(out.c_str(),"w"…
题面 传送门:https://www.luogu.org/problemnew/show/P3899 Solution 你们搞的这道题啊,excited! 这题真的很有意思. 首先,我们可以先理解一下题面:固定一个a,找到一个b,c就是a与b的公共子树中的某个点. 那么,我们显然可以把这个b分成两类,第一种是在a上面的,第二种在a下面的. 对于b在a上面的情况,显然,c一定是a的子树中的某个点,答案即为min(K,depth[a])*size[a] 对于b在a下面的情况,问题就会变得比较exci…
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空间你懂得),但是需要离线,因为共用节点的缘故,之后的修改可能会修改到不需要修改的节点(好绕啊): 这题就是把向上向下的贡献分开算,然后移一下项发现只与深度有关 可以直接二维数点,也可以线段树合并 #include<bits/stdc++.h> using namespace std; const…
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<math.h> #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define LL long long using namespace std; ;…
题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 \[min(deep(p)-1,k)*size(p)\] 显然是可以直接算的. 2.\(b\)是\(a\)的孩子,对答案的贡献为 \[\sum_{\text{v是u的孩子且deep(v)<=deep(u)+k}}size[v]\] 后半段就可以主席树来维护了. 下标为深度,值为\(\sum siz…
题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a 和 b 为 T 中的两个不同节点.如果 a 与 b 在树上的距离不超过某个给定常数 x,那么称"a 与 b 谈笑风生". 给定一棵 n 个节点的有根树 T,节点的编号为 1 ∼ n,根节点为 1 号节点.你需要回答 q 个询问,询问给定两个整数 p 和 k,问有多少个有序三元组 (a;…
BZOJ 3653权限题. 这题方法很多,但我会的不多…… 给定了$a$,我们考虑讨论$b$的位置: 1.$b$在$a$到根的链上,那么这样子$a$的子树中的每一个结点(除了$a$之外)都是可以成为$c$的,答案就是$min(dep_a - 1, k) * (siz_a - 1)$. 2.$b$在$a$的子树中,这样子$c$的位置受$b$限制,这样子的答案就是$\sum_{x}(siz_x - 1) \ (x \in subtree(a), dep_x - dep_a \leq k)$. 第一个…
P3900 [湖南集训]图样图森破 链接 分析: 感觉像个暴力. 可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度. 此时如果回文串两端都没有到这个串的端点,那么以这个点作为回文中心的长度就直接算出来了. 如果回文串的长度刚好是这个串的长度,那么INF. 如果回文串一侧到了端点,那么枚举所有串,看看能否加到另一侧,来构成回文串.此过程记忆化搜索即可. 复杂度$O(nL \log nL)$ 代码: #include<cstdio> #inclu…
题意 题目描述 **记者弄了个大新闻,这个新闻是一个在 [0,n) 内等概率随机选择的整数,记其为 x.为了尽可能消除这个大新闻对公众造成的不良印象,我们需要在 [0,n)内找到某一个整数 y,使得 x ⊕ y 达到最大值.这里 ⊕ 代表异或. 问题在于,**记者有可能对大新闻进行了加密.情报显示,大新闻没有被加密的概率为 p.我们决定采取这样的策略:如果大新闻没有被加密,那么我们选出使得 x ⊕ y 最大的 y:否则,我们在 [0,n) 内等概率随机选择一个整数作为 y. 请求出 x ⊕ y…
题目大意:n个字符串,m个操作,可以插入字符串,也可以询问某T个字符串的最长后缀 题解:Trie+lca Trie树的插入与查询操作.把字符串反转就相当于求公共前缀. lca的深度就是公共前缀的长度. 代码: //biology include<iostream> #include<cstring> #include<cstdio> #define maxn 1000009 using namespace std; ],dad[maxn][]; char s[maxn]…
\(\color{#0066ff}{ 题目描述 }\) 兔子们决定在自己的城堡里安排一些士兵进行防守. 给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个兔子,使得它们两两所在的直线都不与圆相交. 兔子们希望知道最多能选出多少兔子. \(\color{#0066ff}{输入格式}\) 第一行两个整数 N 和 R, 表示兔子的个数和圆的半径接下来 N 行,每行两个整数 xi 和 yi ,表示第 i 只兔子的坐标 保证每只兔子都严格在障碍外部,且两两的所在的直线不与…
难度:☆☆☆☆☆☆ /* 由观察可知 同种颜色的减去他的父亲值相同 我们考虑把询问的两个数分别减去小于它的最大斐波那契数. */ #include<iostream> #include<cstdio> #include<cstring> #define N 3000007 #define ll long long using namespace std; ll n,m,x,y,ans,cnt1,cnt2; ll feb[N]; inline ll read() { ll…
难度:☆☆ /*显然可以前缀和*/ #include<iostream> #include<cstdio> #include<cstring> #define N 100007 using namespace std; int n,m,ans,cnt; int a[N],sum[N];char s[N]; int main() { freopen("reverse.in","r",stdin); freopen("rev…
难度:☆☆☆☆☆☆☆ /* 可以先考虑一维,可知 模k意义下相同的前缀和任意两个相减都是k的倍数 问题等价于统计前缀何种模k相同的数的对数. 多维的时候二维前缀和,压行或者压列,n^3可以解决. */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define K 1000007 #define N 400 using namespace std;…
难度:☆☆☆☆☆☆☆☆ /* 对于第一问:f[i][j]表示前i个数,当前黑板上的数为j的概率 当前有三种情况 1.当前数不是j的倍数—>黑板上的数字改变. 2.当前数是j的倍数且当前数在前i个数中(已经选过) 3.当前数是j的倍数且没有选过 转移:f[i+1][j]=((j的倍数个数-i)*f[i][j]+f[i][gcd(j,k)]) 的平均值 j的倍数个数-i是没选过的j的倍数. 对于第二问,考虑博弈论中sg函数.可知sg[i][1]二维含义同f数组)必定为0(最后黑板上剩下1必败) sg…
难度:☆☆☆☆☆☆☆ /* 二分答案 算斜率算截距巴拉巴拉很好推的公式 貌似没这么麻烦我太弱了...... 唉不重要... */ #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define N 100007 using namespace std; int n,m,cnt; int X[N],Y[N]; double k,x,y,b,dis2; struct…
难度:☆☆☆☆☆☆☆ 题解: 有个定理,另sum(x)表示小于等于x的数中与x互质的数的和 sum(x)=φ(x)*x/2    最后可知f(x)=x  (f(1)=2)  当然打表能知道. 然后就转化为了求Σi^k 然后就是拉格朗日插值法了,不在我理解范畴........ 但这个博客介绍挺好哒 http://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html std: #include <cstring> #include <ctime&…
难度:☆☆☆☆☆☆☆ 此时相望不相闻,愿逐月华流照君 /* 23 233 223 啦啦啦德玛西亚 */ #include<iostream> #include<cstdio> #include<cstring> #define N 1000007 using namespace std; int n,m,ans; char a[N]; int main() { freopen("trans.in","r",stdin); freo…
难度 不断网:☆☆☆ 断网:☆☆☆☆ /* 卡特兰数取模 由于数据范围小,直接做. 考试时断网.忘记卡特兰数公式,推错了只有5分. 数学公式要记别每次都现用现搜!!! */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; ]; int n,m,ans; int main() { freopen("stack.in","r",std…
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noip前的杂题训练,我也很无奈啊 做完了的扔最后,欢迎好题推荐 这么多题肯定是完不成了,能多做一道是一道吧 DP yyb真是强得不要不要的辣:http://www.cnblogs.com/cjyyb/category/1036536.html [ ] [SDOI2010]地精部落 https://www…
目录 数据结构 知识点及其应用 线段树 神奇标记 标记不下放 并查集 维护二分图 维护后继位置 堆 可并堆的可持久化 dsu on tree 方式&原理 适用范围 单调队列 尺取合法区间 模板库 线段树 点分治 数据结构 Tags:Noip前的大抱佛脚 知识点及其应用 线段树 注意:空间开4倍 神奇标记 From8.26 Test_zsy(CPU监控) 如果一个点权为\(val\)的点被打上了\((a,b)\)标记,那么他的实际点权为\(max(a+val,b)\) 干啥滴? 标记不下放 区间加…
吐槽:距离上一次写计划还没有一个月呢,咋又喊要重写捏?可以直接从上一次的计划粘上个一大半. bzoj刷题速度还是在计划之内的,这大半个月中,我bzoj刷进500道,知识方面主要是把莫比乌斯反演系统性的做了一遍,然后趁APIO无聊把toptree也学会了.后缀自动机如果是考到了虽然不能一下写出来,但是还是可以自己一点一点推出来[虽然这样明显不够]. NOI大概是在七月中旬,在此期间还有一周几次的考试,清华夏令营,湖南集训等,所以说真正可以用来自己刷题的时间不多了,所以为了bzoj通过数量而盲目刷水…
2017.5.31 今天开了这个博客,打算每天来写点东西,嗯...毕竟要NOI了嘛... 第一天跑到常州里集训,打开题目一看湖南集训题... T1刷一下写完,然后交了然后发现错了...赶紧改过来,大概1h吧... T2刷一下发现了数学性质,刷一下发现要二分答案,刷一下建出了图,刷一下发现需要上下届可行流... 感觉要AC了呢-(一口毒奶) 然后...上下届可行流怎么做啊... 然后看着以前SJTU的板子理解了一下然后开始写... 然后就写完了啊-是不是能AC了呢... 赛后发现这题只有70,拿一…
Day1 主打内容:dfs/bfs及其优化剪枝,以及贪心算法的应用. 老师:\(Gromah\) 不得不说这个老师真的是个有趣的强大怪... 今天讲的挺水的,其实就是搜索吧,也没啥好听的,追会儿小说\(?\) 晚上还与\(Gromah\)交流问题,感觉他的解题风格及其诡异... 希望第二天的考试不会凉. Day2 主打内容:考试 开场先看\(T1\),带权括号序列,一个\(dp\)吧,切切切¥!!$ 然后就开始看\(T2\),类似于一个\(bfs\)找最短路\(?\)是不是可以直接切掉了...…
题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,现给出 Q 个询问,每次询问距离 u 号节点不超过 K 的节点 b,c 为 a 与 b 的后代,求这样的三元组有多少个. 题解:学会了线段树合并. 由于之前对线段树合并理解的不深刻,导致狂 WA 不止QAQ. 需要统计 \[ \sum_{d e p t h(a)+k \geq d e p t h(b)} \operatorname({size}(b)-1) \] 这是一个二维数点问题,可以在一个维度上建立权值线段树,在另一个维度上统计权…
简化题意 m次询问,每次询问x的子树中,与x节点距离不超过y的节点的子树和.n,m≤300,000. 思路 按照dfs序排序,每次将一个点的答案塞到第depu的位置,这样得到一个前缀和,每次询问作减法即可. 可持久化线段树. 代码 #include<bits/stdc++.h> using namespace std; ; typedef long long int ll; ll n,m,x,y,sum[maxn],dep[maxn],cur,t[maxn*],root[maxn*],fa[m…
写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了50分... T2看了看似乎维护前缀和用树状数组搞搞比较可做, 爆肝到最后也没肝出来... T3正解玄学十字链表, 然而正解常数太大暴力卡一卡就过了Orz 下午惊喜意外又刺激地发现有了恶心大模拟的专题...爆肝猪国杀然后成功RE QAQ 欢声笑语中打出GG.png 10.9 机房电脑被 $ln$ 给关…