Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. 由于一次引爆的炸弹 一定是一个连续的区间内, 所以只需要记录左右边界, 并将左右边界转移给能到达它的联通块. 没写手工栈一直RE的我心里$mmp$啊. 为什么网上的题解都不写手工栈$QAQ$ Code #include<cstdio> #include<cstring> #inclu…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能够引爆的炸弹的显然应该是一个区间里面的,直接对这个区间进行线段树优化建图. 这样可以得到一个带环图,缩点以后这个炸弹能够炸到的炸弹就是从这个点能够走到的点. 但是这个不太好做,不过可以发现最终的炸弹也是一个区间,所以可以通过缩点后的 DAG 来求出左右端点. 时间复杂度 \(O(n\log n)\)…
方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n^2$爆炸.因为是区间建边,所以用线段树建边优化,不过这题比较特殊,只是点向区间连边,分析线段树建边原理,可以完全把出树省掉,就用一个入树连边就行了.(其实边数还是很多,所以边上界我开了$2\times 10^7$...) 这样缩点后DAG上找连通点数,有一道类似的题,不过最多数据只能出到$2000…
[SNOI2017]炸弹 线段树优化建图,然后跑一边tarjan把点全部缩起来,炸一次肯定是有连锁反应的所以整个连通块都一样-于是就可以发现有些是只有单向边的不能忘记更新,没了. #include <bits/stdc++.h> #define ls(x) ch[x][0] #define rs(x) ch[x][1] #define rep(i , j , k) for(int i = j ; i <= k ; i ++) #define Rep(i , j , k) for(int…
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆的炸弹连单向边 tarjan所点后拓扑排序 在拓扑图上倒着统计答案 可以得到一个炸弹能引爆的编号最小mi和最大的炸弹mx,mx-mi+1就是先引爆这个炸弹一共能引爆的炸弹数 优化: 一个炸弹一定是向一段区间连边 所以用线段树优化,这样向一个区间连边就变成了向一个点连边 注意存边的空间一定要开的足够大…
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在,请你帮忙计算一下,先把第 i 个炸弹引爆,将引爆多少个炸弹呢?  输入 第一行,一个数字 N,表示炸弹个数.  第 2∼N+1行,每行 2 个数字,表示 Xi,Ri,保证 Xi 严格递增.  N≤500000 −10^18≤Xi≤10^18 0≤Ri≤2×10^18 输出 一个数字,表示Sigma…
直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 #include<bits/stdc++.h> #define pa pair<ll,int> #define CLR(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; ,maxp=maxn*,maxl=maxn*,P=1e9+; ; inline ll rd(){ ll x=;; ;c=…
这道题我做了有半个月了...终于A了... 有图为证 一句话题解:二分LR线段树优化建边+tarjan缩点+建反边+跑拓扑统计答案 首先我们根据题意,判断出来要炸弹可以连着炸,就是这个炸弹能炸到的可以是由它能炸到的其他炸弹来炸到.也就是说具有拓扑性.(a->b,b->c==a->c) 所以我们首先有了一个想法:建反图,tarjan缩点,跑拓扑. 为什么建反图?因为i能炸到j,所以j能炸到的i就可以炸到了,所以建反图从j->i可以实现这一点. 但是每个炸弹能炸到的是一个区间,怎么搞呢…
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j 位置的数是区间[i,j]的最大值和次大值 提供p2的攻击力:i,j位置的数有一个是区间[i,j]的最大值,另一个不是次大值 记录L[i].R[i] 分别表示i左右第一个大于k[i]的位置 p1的贡献: 1.点对(L[i],R[i])    2.点对(i,i+1) p2的贡献: 1.点对(L[i],…
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色之后,任意满足要求的四联通块一定可以是 黑色-->紫左-->紫右-->白色 只要破坏三个箭头中的一个即可 所以可以构建最小割模型 1.源点向黑色格连流量为格子代价的边 2.黑色格向相邻的紫色格连inf边 3.与黑色格相邻的紫色格向与白色格相邻的紫色格连 流量 为 两个紫色格较小代价 的边 4…
炸弹(SNOI2017) Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸 时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在,请你帮忙计算一下,先把第 i 个炸弹引爆,将引爆多少个炸弹呢? Input Format 第一行,一个数字 N,表示炸弹个数. 第 2∼N+1行,每行 2 个数字,表示 Xi,Ri,保证 Xi 严格递增. N≤500000 −10 ^18≤Xi≤10 ^18…
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #include<cstdio> #include<iostream> #define N 200001 using namespace std; #define max(x,y) ((x)>(y) ? (x) : (y)) #define min(x,y) ((x)<(y)…
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 struct node { int siz; ],R[],con[]; ]; bool rev; int cover; }tr[…
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式为AA的子串个数 ans= ∑ suf[i]*pre[i+1] 这两个数组的求法,类似bzoj 2119.3238 枚举|A|的长度len,将序列每len个分一块,取每块内第一个元素作为关键点 每个合法的AA恰好占据两个关键点 枚举每一个关键点i,取j=i+len 计算[i,n]和[j,n]的lcp…
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 300001 char ss[N]; int s[N]; ,last; int fail[N],len[N],cnt[N…
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len [i] 表示以i结尾的最长不下降子序列的长度 pre_sum[i] 表示对应长度下的方案数 suf_len[i] 表示以i开头的最长不下降子序列长度 suf_sum[i] 表示对应长度下的方案数 若已有了这4个数组 设最长上升子序列长度=mx 那么 如果pre_len[i]+suf_len[i] -…
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最近是怎么了啊啊啊O(≧口≦)O #include<cstdio> #include<iostream> using namespace std; int n,m; ]; void read(int &x) { x=; ; char c=getchar(); ; c=getcha…
http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美味度 的边 2.负美味度区间 向 汇点 连 流量为 美味度的绝对值 的边 3.区间[i,j] 向 区间[i+1,j].区间[i,j-1] 连 流量为 inf 的边 4.区间[i,i] 向 寿司i 连 流量为 inf 的边 5.寿司i 向 汇点 连 流量为 寿司代号 的边 6.寿司i 向 它的代号 连…
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么num[i] 就是i到根节点的路径上,所有<=i/2 的节点的个数 这棵树的点随深度的递增而增大 所以用st表存这棵树 st 表 开[logn][n],常数优化求st表的过程 #include<cmath> #include<cstdio> #include<cstring…
http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p/8253800.html 精度真是卡的我醉生梦死,w(゚Д゚)w    O(≧口≦)O bzoj改成long double 就过了 洛谷仍处于 输出x.99999,答案输出x+1.00000 输出-0.00000,答案输出0.00000 救命啊~~~~(>_<)~~~~ 来自大佬的建议:输出do…
http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加上这个自字符之后新匹配到的状态s f[i+1][s]+=f[i][j] 转移的时候判断如果f[i][j]==0,就不用枚举字符了 没有这个复杂度在6e8,TLE 其实可以预处理 g[i][j]表示已经匹配了长度为i,再加字符j 可以匹配到的状态 #include<cstdio> #include&…
http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约数j 那么i*j一定是n*m的约数 d(nm)相当于不同的i*j 的个数 若i, j 不互质 设gcd(i,j)= g , 则 i= p*g ,j=q*g 那么i*j 可以 组成两个互质数p*g*g 和 q 的乘积 p*g*g 和 q 也都输n和m的约数 即p*g*g 和 q 也都是合法的i,j 所…
http://www.lydsy.com/JudgeOnline/problem.php?id=1569 dp[i][j][a][b] 表示i个职员,发广告状态为j,已有金钱a,声誉b的最少天数 j=0 表示没有发广告,否则j表示距离发广告j天 枚举有t个人增加金钱,那就有i-t个人增加声誉 当j=3时,人数+1 当j=0或j=3时,考虑发不发广告 注意: 1.当天赚的钱可以用来发广告 2.新招募的人当天不能为公司带来收益 #include<cmath> #include<cstdio&…
http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; void read(int &x) { x=; char c=getchar(); while(!isdigit(c)) c=getchar(); +c-';…
http://www.lydsy.com/JudgeOnline/problem.php?id=1260 区间DP模型 dp[l][r] 表示涂完区间[l,r]所需的最少次数 从小到大们枚举区间[l,r] 如果col[l]==col[r] dp[l][r]=min(dp[l+1][r],dp[l][r-1],dp[l+1][r-1]+1) 否则 dp[l][r]=min(dp[l][k]+dp[k+1][r]) 我还是辣鸡啊~~~~(>_<)~~~~,这种题都不能秒 #include<c…
http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #include<iostream> #include<algorithm> #define lowbit(x) x&-x using namespace std; #define N 500001 struct TREE { int xi,yi; }Tree[N]; struct…
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iostream> #include<algorithm> #define N 30001 using namespace std; ],nxt[N<<],tot; int n,val[N]; int siz[N],fa[N],dep[N]; int id[N],dy[N],bl[N];…
http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上AC COGS数据本机评测AC,提交50 bzoj WA 1.新产生蚂蚁时,如果洞口有蚂蚁,则不产生 2.移动的时候,第一次不能动,就不能动,接着下一次还不能动,那就可以走回之前来的那个位置 3.攻击,炮选定目标蚂蚁之后,要判断被殃及的蚂蚁所在圆是否与激光(线段)有交点 判断方式: 先判断是否与激光…
http://www.lydsy.com/JudgeOnline/problem.php?id=4515 把lca带进式子,得到新的式子 然后就是 维护树上一次函数取min 一个调了一下午的错误: 当一条线段完全在另一条线段之下时,用下面的完全覆盖上面的 判断条件为  两线段在范围内没有交点 然后若 新的线段的某一个端点<原来线段的对应的一个端点,就覆盖 错误的写法: 判断的时候 把两条线段在端点处相等也加了进去 即判断条件为  两线段在范围内没有交点 或 交点 在线段端点出 那么 若 新的线段…
http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+1 操作3:查询线段树区间最大值 1A,嘎嘎嘎 #include<cmath> #include<cstdio> #include<iostream> using namespace std; #define max(x,y) ((x)>(y) ? (x) : (y)…