题解
文章平均质量分 56
Yorug
qwq
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CF1187E Tree Painting 换根dp
题目传送门 这题一看就很换根dp( 换根dp其实挺有意思的。这题只需在草稿纸上画画就能推出式子了。 记得开longlong!! #include<bits/stdc++.h> #define int long long using namespace std; int n,head[205000],cnt,size[205000],f[205000],s[205000]; int ans; struct edge{ int v,next; }e[405000]; void add(int u,原创 2021-09-14 12:53:36 · 152 阅读 · 0 评论 -
洛谷P3482 [POI2009]SLO-Elephants 思维题
题目传送门 Description 给你两个长度为 nnn 的排列 aaa 与 bbb ,每次可以将 aia_iai 与 aja_jaj 互换,代价为 wi+wjw_i+w_jwi+wj ,请问最小代价是多少。 n≤106,100≤wi≤6500n\leq 10^6,100 \leq w_i\leq6500n≤106,100≤wi≤6500。 Solution 这类在数列内交换的题,有个很套路的trick:拆分成环。 在本题中具体来说就是将 aaa 与 bbb 之间下标或值相等的位置相连。(原创 2021-08-22 21:11:39 · 190 阅读 · 0 评论 -
牛客11245A 括号串 思维题
题目传送门 Description 有两个字符串 ttt 和 sss ,问你 ttt 能否通过添括号的方式修改成 sss ,使得 sss 是匹配的。 给定 sss 和 ttt,多组数据。 Solution 如果考虑一步一步让 ttt 变成 sss ,就会比较复杂(我一开始也是这么想的),但我们可以换个思路,即只需考虑 ttt 能否变成 sss ,就很简单了,只需判断一下 ttt 是否是 sss 的字串就可以了。 另外还需判断一下 sss 本身是否是匹配的。 Code #include<bits/s原创 2021-08-21 17:19:03 · 137 阅读 · 0 评论 -
P6306 「Wdsr-1」小铃的书 思维题
题目传送门 真的不知道是什么类型的题所以说成思维题。。 Description 给定两个数 nnn 和 kkk 及一个数列,求出该数列中哪一个数出现的次数不是 kkk 的倍数。(保证只有一个) Solution 有一个显然易见的结论:当 k=2k=2k=2 时,结果相当于全部异或一遍,能获得 252525 分的好成绩。 我们将这个结论推广一下,答案即为在 kkk 进制下做一遍不进位加法,时间复杂度为 O(nlogkai)O(n \log_k a_i )O(nlogkai) ,能得 757575 分。原创 2021-08-17 18:51:18 · 185 阅读 · 0 评论 -
洛谷P4551 最长异或路径 01trie
题目传送门 Description 给你一棵有边权的树,求最长异或路径。 Solution 和这题基本没区别。 不妨令 pip_ipi 为 iii 号节点到一号的路径异或值。 则点 uuu 和点 vvv 的路径异或值为 pu⊕pvp_u \oplus p_vpu⊕pv。 Code #include<bits/stdc++.h> using namespace std; int n,a[105000],vis[105000]; int head[105000],cnt; struct edg原创 2021-08-12 22:10:42 · 128 阅读 · 0 评论 -
LOJ 10051「一本通 2.3 例 3」Nikitosh 和异或 01trie
题目传送门 Descripton 给定一个数列,求区间最大异或和。 Solution 被一个数异或两次的结果为 000 ,相当于没异或,所以a[l]⊕a[l+1]⊕...⊕a[r]=(a[1]⊕a[2]⊕...⊕a[l−1])⊕(a[1]⊕a[2]⊕...⊕a[r])a[l]\oplus a[l+1]\oplus...\oplus a[r]=(a[1]\oplus a[2] \oplus ...\oplus a[l-1])\oplus(a[1]\oplus a[2] \oplus ...\oplus a[原创 2021-08-12 22:06:02 · 180 阅读 · 0 评论 -
LOJ 10050 「一本通 2.3 例 2」The XOR Largest Pair 01trie
题目传送门 Description 给定一个数列,从中选出两个数,求异或的最大值。 Solution 01trie模板题。 我们将数据以二进制形式储存在trie树中,每次查询时,从大位到小位尽可能选与当前相异的数据。 code #include<bits/stdc++.h> using namespace std; int n,a[1050000]; int trie[10500000][2],tot=0,ans=-1; void insert(int x){ int p=0; for(in原创 2021-08-12 21:30:23 · 182 阅读 · 0 评论 -
AtCoder ABC129E Sum Equals Xor 动态规划
题目传送门 Describtion 以二进制给定一整数 LLL ,求有多少二元组 (a,b)(a,b)(a,b) 满足 a+b=a⊕b≤La+b=a\oplus b\leq La+b=a⊕b≤L 。 Solution 对 a,ba,ba,b 的二进制形式的每一位进行讨论。 因为异或是不进位加法,所以 a+b=a⊕ba+b=a\oplus ba+b=a⊕b 相当于 aaa 和 bbb 的同一位不能同为 111。 令 dp[i][0]dp[i][0]dp[i][0] 为 a⊕ba\oplus ba⊕b 的前 i原创 2021-08-07 20:42:53 · 337 阅读 · 0 评论 -
洛谷P3398 斐波那契 思维题
题目传送门 标签里的lca是什么鬼,用lca不就炸了吗? 观察可知,子节点减去父节点为子节点在斐波那契数列中的前继。 于是我们可以二分查找第一个小于子节点的斐波那契数,从而实现向上跳一级。(实现过程和lca有一点点像) 跳的时候选大的,即深度深的那个节点跳。 记得开longlong。 #include<bits/stdc++.h> #define int long long using namespace std; int t,a,b,f[100]; int find(int x){ int原创 2021-08-07 19:04:38 · 118 阅读 · 0 评论 -
UVA 12716 XOR 找规律题
题目传送门 题意:给定整数 nnn ,求满足1≤b≤a≤n1 \leq b \leq a \leq n1≤b≤a≤n且gcd(a,b)=a⊕b\gcd(a,b)=a \oplus bgcd(a,b)=a⊕b的二元组 (a,b)(a,b)(a,b) 的数量. 因为当 a=ba=ba=b 时无解,所以下面默认 a>ba>ba>b. 这里我们有两个结论,下面依次给出并证明: 结论1 :gcd(a,b)≤a−b\gcd(a,b)\leq a-bgcd(a,b)≤a−b 证明:令 gcd(a,原创 2021-08-07 16:28:44 · 343 阅读 · 0 评论
分享