题目大意: 链接:https://www.nowcoder.com/acm/contest/84/E 给定n个数字a1, a2, ..., an. 定义f(l, r) = al | al+1| ... | ar. 现在枚举(1 <= l <= r <= n),问不同的f值一共有多少个. 思路:确定一个 l 的情况下, 从 l 出发的的不同值最多只有20多个, 从后往前暴力更新就好啦. #include<bits/stdc++.h> #define LL long long #…
https://ac.nowcoder.com/acm/problem/17968 下面是错误的做法,因为题目要求必须使用x,而y在check的时候不一定用到等价于x的线性基来构成. 正确的做法是直接check(x^y),这样y已经使用了x,再看看能不能经过其他数表示. 因为异或是交换群. #include<bits/stdc++.h> using namespace std; #define ll long long const int MN=34; ll a[MN+1],tmp[MN+1]…
题目链接:https://ac.nowcoder.com/acm/contest/882/C 来自:山东大学FST_stay_night的的题解,加入一些注释帮助理解神仙代码. 好像题解被套了一次又一次 要学习的地方我觉得是2点: 1.使用dp(贪心)的思想求出每段所在的连续段 2.因为前缀和是连续变化的,可以用lazy标记来代替树状数组来维护. #include<bits/stdc++.h> using namespace std; typedef long long ll; #define…
题意 给一个长度为1e9的只包含1和-1的数列,1的个数不超过1e7,计算有多少对\((l,r)\)满足\(\sum_{i=l}^r a[i]>0\) 分析 dp求出每段连续的1最右端为右端点的最大子段和和最左端为左端点的最大子段和,可以得出这段1往左或右最远能扩到哪里,将相接的连续1段合并,合并后的每段区间和差值不会超过1e7,每段分别用桶来计数,细节很多要仔细想想.. Code #include<bits/stdc++.h> #define fi first #define se s…
[牛客网]Whalyzh's Problem 每个\(b_{i,j}\)建一个点,认为选了\(b_{i,j}\)一定会选\(a_{i}\)和\(a_{j}\) 选了\(a_{i}\)的话会带了一个\(-b_{i,i}\)的价值 然后再用01分数规划二分答案,选了\(a_{i}\)还会带来\(-x\)的代价,x是二分的答案 如果正数值减最大流大于0认为这个答案可以达到 #include <bits/stdc++.h> #define fi first #define se second #def…
题目传送门:http://poj.org/problem?id=3764 The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9482 Accepted: 1932 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of…
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM 时空裂隙 SOLUTION 楠神口胡算法我来实现系列 从小到大枚举边权,对于当前的权值,在当前的图找出所有等于该权值的边,把这些边的顶点用其在并查集中的代表元(即fa[x])替换,然后建图,求所建图的桥边.求完之后把每条边的两个顶点合并(缩点),然后枚举下一…
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the game OSU to the following problem. Given n and m, there are n clicks. Each click may success or fail. For a continuous success sequence with length X,…
牛客OI赛制测试赛3 毒瘤xor 传送门 题面,水表者自重 Solution 前缀和简单题(挖坑待补) 代码实现 #include<stdio.h> #define int long long int a[100010],n,sum[100010][31],two[31],tmp[31]; void init(){ two[0]=1; for(int i=1;i<31;i++) two[i]=two[i-1]<<1; } signed main(){ scanf("…