首页 > TAG信息列表 > HNOI2012

[HNOI2012]与非

与非 题解 显然,我们的 n a n d nand nand是一种按位运算操作,我们发现我们可以通过

[HNOI2012]射箭

[HNOI2012]射箭 题意: 依次给出垂直于x轴的n条线段,求第几次给出的线段及其之前的所有线段不能被一条过原点开口朝下的抛物线穿过 Solution Part1:限制条件与转化 显然,求解第几条线段不能被抛物线穿过,可以运用二分答案。 接下来就只要考虑如何check当前的线段都能不能被穿过 若设该

P3224 [HNOI2012]永无乡(合并线段树)

Jisoo 这是一种叫线段树合并的东西。 为了简化,我们需要动态开点。 并且一开始为每一个节点建一个线段树,当然是动态开点的 然后合并就行了,相同的线段树节点加起来,只有一个有的就返回另一个 记一个根,并且并查集一下。 #include<cstdio> #include<iostream> #include<cstring> #inclu

[HNOI2012]永无乡

[HNOI2012]永无乡 题意: 一共 \(n\) 个点,每个点权值,给你 \(q\) 个操作: B x y 表示连接 \(x,y\) Q x k 表示求当前 \(x\) 所在连通块内权值第 \(k\) 小的点的编号 分析: 求一个联通块内的权值第 \(k\) 小的点,很容易想到主席树或者权值线段树,但是考虑到有合并连通块的操作,因此可以确

P3224 [HNOI2012]永无乡 题解

P3224 [HNOI2012]永无乡 题解 题意概括 有若干集合,每个集合最初包含一个值,和一个编号1~n。两个操作:合并两个集合,查询包含值x的集合中第k大值最初的集合编号。 思路 维护集合之间关系显然用并查集,但怎么处理询问,如果只是问最大值,那么显然可以用线段树把最大值存在并查集的祖先上,当

题解 P3224 [HNOI2012]永无乡

题目链接 前置知识:kruskal 重构树,主席树 来讲一种目前题解区里没有,使用 kruskal 重构树和主席树,且时间复杂度为一个 log 的做法。 题目大意是给定一张点数为 \(n\)​​ ,初始边数为 \(m\)​ 的无向图,图中每个点有一个权值,然后有 \(q\)​ 个操作,每个操作可能是询问与点 \(x\) 联通的

P3224 [HNOI2012]永无乡(线段树合并)

支持加边和询问连通块第k大点权。 线段树合并即可。 //线段树合并 //每次合并两个连通块的权值线段树 //询问第k大 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int M=maxn*100; int c[M],lson[M],rson[M],T[maxn],tot; void pushup (int newRo

P3224 [HNOI2012]永无乡 并查集+线段树合并

原题链接:https://www.luogu.com.cn/problem/P3224 目录 题意分析Code 题意 分析 和主席树操作有些像,查询区间K大,但这题又带上了修改,因此我们考虑用线段树合并。直接开n个权值线段树,然后用并查集维护当前连通块。由于这题比较模板,就不多解释了。 Code #include <bits/std

[HNOI2012]射箭

XVII.[HNOI2012]射箭 强烈谴责本道卡精度屑题。 首先,乍一看,二次函数\(ax^2+b\)在\(x=x_0\)处的值要在\([y_0,y_1]\)之内?带进去不就是一个关于\(a,b\)的半平面交吗? 然后再一看,要找到半平面交非空的最大位置, 难不成要用动态凸包? 后来想想动态凸包什么的完全没有必要啦,直接二分一下即

NC20099 [HNOI2012]矿场搭建

题目链接 https://ac.nowcoder.com/acm/problem/20099 题意 一张无向图, 问至少设置几个点使得当删除一个点后其他所有点能到达设置点,以及方案数。 思路 点不能设置在割点, 所以对于断开割点形成的所有双连通分量中,进行分类讨论。 AC代码 #include<bits/stdc++.h> using namespace

P3226 [HNOI2012]集合选数 状压DP

题意: 题面 分析: 我们发现每个数 \(n\) 是否被选,只与 \(\frac{n}{3},\frac{n}{2},2n,3n\) 有关,那么我们考虑建一张表,表上每一行按照 \(\times 3\) 的方式递增,每一列按照 \(\times 2\) 的方式递增,那么对于同一张表,任意上下左右相邻的数都是不能选的,那么这样的表一共有 \(n-\frac{n}{

题解 [HNOI2012]集合选数

题目传送门 题目大意 直接看题面吧。 思路 感觉挺水的一道题啊?怎么评到紫色的啊?考试的时候LJS出了这个题的加强版我就只想出这个思路,然后就爆了。。。 不难发现,我们可以构造矩阵: x 2x 4x 6x ... 3x 6x 12x 24x 48x ... 9x 18x 36x ... 然后实际上就相当于在这个矩阵中选出一些

P3224 [HNOI2012]永无乡

事实证明,没过对拍的代码都不一定是对的,即使你在各大OJ上都AC了。。我写的那个代码,说他漏洞百出一点都不过分,而且拍出来的第一组数据都过不去,但是他竟然能AC。。 这题思路其实挺简单的,一句话题意就是带合并的区间k大,这里的合并用线段树合并和splay启发式合并都可以,我写的是splay。

「HNOI2012」三角形覆盖问题

传送门 说真的这题的做法很迷啊,大部分做法都是 \(O(n^2)\) 级别过的。 我也不例外 不过 \(O(n ^ 2)\) 的做法确实很容易懂。 考虑扫描线,我们把所有三角形按底边的 \(y\) 值排序,然后从下往上扫,每次只移动一个单位长度。 然后我们在这个狭长的矩形里面截出来的面积就一定是若干梯形

永无乡「HNOI2012」

【题目描述】 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的。现

luogu_P3224 [HNOI2012]永无乡

并查集维护线段树合并 b加在a上 #include<iostream> #include<cstdio> #define ri register int #define u int namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') {

P3225 [HNOI2012]矿场搭建 题解

这道题挺难的,可以加深对割点的理解,还有,排列组合好重要了,分连通块,然后乘法原理(加法原理计数什么的) 传送门   https://www.luogu.org/problem/P3225 省选oi题好难啊QAQ           #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector

[HNOI2012]集合选数

洛咕 题意:《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若\(x\)在该子集中,则 \(2x\) 和 \(3x\) 不能在该子集中.同学们不喜欢这种具有枚举性质的题目,于是把它变成了以下问题:对于任意一个正整数 \(n<=100000\),如何求出\({1, 2,...

[bzoj2733] [HNOI2012] 永无乡

Description 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\),每座岛都有自己的独一无二的重要度,按照重要度可 以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 \(a\) 出发经过若干座(含 \(0\) 座)桥可以到达岛

[HNOI2012]集合选数(构造,状态压缩,DP)

神仙题。 莫名其妙的就试一试把所有数放进一个类似矩阵的东西里面。 首先把 \(1\) 放到左上角,然后在每个数的右边放它的 \(3\) 倍(大于 \(n\) 就不用放了),下面放它的 \(2\) 倍(大于 \(n\) 就不用放了)。 注意这样子有些数会不在里面。那么从小到大,每次选最小的且没有出现过的数作为一

HNOI2012 矿场搭建 v-DCC缩点+分类讨论

HNOI2012 矿场搭建 题目传送 sol: 首先需要对v-DCC缩点,对于缩点后的每一个连通块需分类讨论一下。 对于每一个连通块(v-DCC): 1、不存在割点。需要建两个出口(毁掉一个还得有一个)。 2、存在一个割点。需要一个出口。(毁掉割点,走连通块内出口;毁掉连通块内出口,走割点到别的连通块出口)。 3

HNOI2012矿场搭建

做完Mining Your Own Business后觉得这个题没什么意思了,数据范围小的连边数不清空都能A。 题解直接看这篇吧。做题的经历也挺……对吧。 #include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<stack

[BZOJ2730]:[HNOI2012]矿场搭建(塔尖)

题目传送门 题目描述: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。 请写一个

【luogu3225】 [HNOI2012]矿场搭建 [tarjan 割点]

P3225 [HNOI2012]矿场搭建 好吧 我是看了yyb大佬的题解才做起的 并且把我的割点模板改得和他的一样 先找割点 然后再一个点一个点地来找连通块 统计该块里的割点数和非割点数 如果没有割点,分类讨论:1.只有1个节点,只需要建立1个出口,方案累乘不变2.有n个节点(n≥2),至少建立两个出口,

BZOJ 2729: [HNOI2012]排队 排列组合 + 高精度

Code:  #include<bits/stdc++.h> #define maxn 10003 #define ll long long #define p 10000000000llusing namespace std;ll base[maxn];int n,m,len=1; void multiply(int x){ ll pre=0,tmp; for(int i=1;i<=len;i++) { tmp=base[i