首页 > TAG信息列表 > MAXN

9.15-CSP-S开小灶4

T1 山洞 比较简单但是我脑子抽了绕了半天弯。 朴素dp是很好写的 $ dp[i][j]= dp[i-1][j-i]+dp[i-1][j+i] ,(j-i \neq j+i)$ 考虑优化,我们可以先暴力推出前n步(当然最大可以推到10000步好像也没问题),然后我们一次走n步,这样会一共走m/n次,然后剩下m%n次仍然暴力推就行。中间一次走n

CSP-S开小灶4

A. 山洞 暴力枚举 \(nm\) 暴力 然后发现枚举的步长每 \(n\) 个一循环 搞出从\(0, 0\) 走 \(n\) 步的数组 进而发现从 \(0\) 到 \(i\) 和从 \(x\) 到 \((x + i) \% n\) 等价 于是可以\(n^2\) 转移出走 \(n + n\) 步,然后发现可以倍增了 其实这本质上是个循环矩阵 我太菜了,今天才知道

9.13-CSP-S模拟5

由于某些原因,现在改为发单篇博客的形式 9.13CSP-S模拟5 T1 F 比较水的一眼题,先没看题观察数据范围发现是n方的,读题发现显然可能合法的x只有\(O(n)\)个,就是拿\(a_1\)和所有的b异或一遍就行了,别的x既然\(a_1\)都异或不出来那显然不可能,对于一个数,它异或另一个数能得到x的话,那么异或

[kuangbin带你飞]专题四 最短路练习

Til the Cows Come HomePOJ - 2387 题意:给你一幅地图,点1~N,双向正权路,问你N到1的最短路径? 算法:Dijkstra或者SPFA 思路:因为是正权路径,可以用Dijkstra算法;SPFA区别就是可以判断负权环。 1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 #include <algorithm

CF868F Yet Another Minimization Problem 题解

CF8658F 题意 一个长度为 \(n\) 的序列,要分为 \(m\) 段,每段代价为段内相同数的对数,求总代价的最小值。 分析 设 \(cal(i,j)\) 表示段 \([i,j]\) 内的相同的数的对数,\(dp_i\) 表示当前最后一段以 \(i\) 为末端的最小总代价,则有转移方程: \[dp_i=\min\limits_{j=1}^{i-1}\{dp_j+cal(i

KMP,Trie,&&洛谷P2580

KMP: 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+5; 4 char a[maxn],b[maxn],aa[maxn],bb[maxn]; 5 //aa,bb为输入的字符串 6 //为了方便KMP的实现 7 //另开a,b两个字符串为实际操作自符串 8 //b为模式串 9 int nxt[maxn],cx[maxn]; 10 //

洛谷 P2590 [ZJOI2008]树的统计 题解

树链剖分板子,两次 DFS 预处理之后用线段树维护,问题转化为单点修改,区间查询(求和、最大值),对于询问路径跳到 LCA 上再查询即可。 //P2590 [ZJOI2008]树的统计 #pragma GCC optimize("Ofast") #include <bits/stdc++.h> using namespace std; const int MAXN=500005; int siz[MAXN],fa

51nod模拟4/CSP-S模拟3

T1 score and rank %%t%ourist 比较智慧的贪心。考虑类似求最大子段和类的东西,我们逐个i考虑,当$a_i <0 $时,以i结尾的最大子段显然不会再超过S,但是它会抵消掉一部分之前的数 点击查看代码 #include <bits/stdc++.h> typedef long long ll;typedef unsigned long long ull; typed

中秋节yyds

P8539 「Wdoi-2」来自地上的支援 为什么都在用线段树啊? 首先,我们发现一个数如果有一次没有被选,那它以后就永远不会被选上了,所以x被选k次的临界是它从x到x+k-1一直被选上,x+k-1>n就不合法了。 为了保证这个数在它自己的位置上被选中第一次,它需要比前面的修改后最大值大或相等(因为修

「解题报告」[AGC022F] Checkers

题目大意 设 \(x=10^{100}\),在数轴上有 \(n\) 个点,第 \(i\) 个点的坐标为 \(x^i\),每次可以将一个点 \(A\) 变为关于点 \(B\) 的对称点,并把 \(B\) 删除,进行 \(n-1\) 次这样的操作,问最后能得到多少种不同的坐标。 \(n \le 50\) 去看了官方的题解,这里给出官方的 \(O(n^4)\) 做法和

AcCoders 7961 Problem D:【省选基础数据结构 树状数组】树状数组 题解

树状数组板子,单点修改,区间查询,注意处理读入字符的问题。 //7961 Problem D:【省选基础数据结构 树状数组】树状数组 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=100005; ll c[MAXN],a[MAXN],n; #define lowbit(x) ((x)&-(x)) void add(l

Luogu3354 河流 - 树形dp -

题目链接:https://www.luogu.com.cn/problem/P3354 题解: 考虑树形dp 设\(f[i][j][k]\)表示考虑到 i 点,j 是i的祖先中与i最近的伐木场,i及子树中共有 k 个伐木场的最小代价 我们发现,这样设状态无法表示 i 是否有伐木场这个条件,因此钦定 f[][][] 表示 i 没有伐木场,g[][][]表示有 转移

洛谷 P1734 最大约数和(dp)

https://www.luogu.com.cn/problem/P1734 题目描述 选取和不超过 S 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。 输入格式 输入一个正整数 S。 输出格式 输出最大的约数之和。 输入输出样例 输入 #1复制 11 输出 #1复制 9 说明/提示 【样例说明】 取数字 4 和

CSP-S开小灶2

A. 元素周期表 发现当同一列有多个点,他们所在行可以合并 同一行有多个点,他们所在列可以合并 一个方案可行,当且仅当能够合并成一个格子 用并查集处理,合并行列后得到的矩形,他的每一行每一列至多有一个元素 那么\(ans = n +m - 1 - cnt\) code #include<cstring> #include<cstdio> #

CSP集训题解

CSP集训题解 Summer已经完结了于是新开一个,而且旧的已经很卡了 9.9CSP-S短赛2(开小灶2) T1 元素周期表 看来是一种套路,将每个点对应的x,y坐标连边,在一个联通块内的就是可达的,那么答案就是联通块数减一 点击查看代码 #include <bits/stdc++.h> typedef long long ll;typedef unsi

[ARC125F] Tree Degree Subset Sum

题目传送门 Solution 首先这个树的限制几乎没用,我们可以先把每个点度数 \(-1\),然后总的度数就是 \(n-2\) ,设 \(z\) 为度数为 \(0\) 的点的个数。 可以看出,这个问题的麻烦之处就在于对于一个度数和还要求出有多少个满足的大小,而这个似乎只能 \(\Theta(n^2\log n)\) dp。 不过,我们稍

题解【CF1702G2 Passable Paths (hard version)】

题目传送门。 考虑建立虚树然后再上面搞树形 DP。 于是这道题就变成分讨题。 设 \(f_i\) 表示 \(i\) 子树内的答案。若 \(f_i=1\),表示 \(i\) 子树内的特殊点可以被一条链覆盖,且 \(i\) 可以作为链的开头。若 \(f_{i}=1\),表示 \(i\) 子树内的点可以被一条链覆盖,但 \(i\) 不能作为链

多项式全(?)家桶

贴个板子,以备复习 点击查看代码 #include<cstdio> #include<cstdlib> #include<algorithm> #include<unordered_map> #include<cmath> #define mod 998244353 #define maxn 400010 #define ll long long #define it unordered_map<ll,int>::iterator

洛谷 P1123 取数游戏(dfs)

https://www.luogu.com.cn/problem/P1123 题目大意:给定一个n*m的矩阵,问我们从里面怎样取能取到最大的总和? 条件是选了一个数,下次它的八个方向上的数字就不能选了 输入 #1复制 3 4 4 67 75 63 10 29 29 92 14 21 68 71 56 8 67 91 25 2 3 87 70 85 10 3 17 3 3 1 1 1 1 99 1 1 1

[kuangbin带你飞]专题三 Dancing Links

Dancing Links 是一种数据结构,用于精确覆盖。详情去下面链接学;感谢大牛总结。 学习资料: http://www.cnblogs.com/grenet/p/3145800.html http://blog.csdn.net/mu399/article/details/7627862     F - SudokuPOJ - 3074  题意:就是给你一个随机的九宫格,问你答案是多少? 算法:Dan

[Editorial] Codeforces Contest 1726

A. Mainak and Array 显然如果 \([l,r]\) 不包括两端那么就不会对答案有影响,那么直接枚举包括两端的情况即可。 /* author : Gemini date : September 6th, 2022 url : https://codeforces.com/contests/1726/A */ #include<bits/stdc++.h> using namespace std; template<typena

可持久化线段树

现想现写的,没有借鉴别人的任何东西。 可持久化线段树1 考虑不会变得太多,每次该值操作只会改变一个位置的值,其它位置是可以继承的。如果用数组,那就是下标继承。如果把数组分成 \(2\) 半,那改一个值,就一半继承,另一半重新赋值。而用线段树,就可以做到区间继承 \(\log\) 的时间复杂度。

Rock and Lever

题意: 找出数列中满足,ai & aj >= ai ^ aj 的 (i,j)的数量,i<j 由样例发现,当ai 与 aj 的最高位一样时,不等式就成立 故,记录数的最高位的数目,假设一个最高位的数目为x,则能选,C(n,2)种 得到一个数的二进制的最高位,不断右移即可。 处理组合数即可。又:C(n,2)=(n/2)*C(n-1,1)=n*(n-1)/2. 

CSP-S模拟2(联考)

差点又双叒叕模拟退役 上来先\(\% T2\), 然后感觉就差一点, 最后搞出来就十点多了.. 然后心态一度爆炸,有点小摆烂,上厕所冷静一下觉得还有时间,能抢救一下 然后开了 \(T1\), 没啥思路瞎搞,开根号在附近找数用 \(pow\),发现大数据丢精异常严重 $pow(n, 1.0 / 1) $比 \(n\)大了好几百你敢信

Index × A(Not Continuous ver.)

Index × A(Not Continuous ver.) (背包问题) 题目大意同Index × A,只是这里的取值可以任意了,但是要有顺序,说白了题目就是要你在一堆数中选出M个数,让这M个数的乘权重后的和最大 AC代码 #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #define ll