CF 1182F Maximum Sine——根号算法】的更多相关文章

题目:http://codeforces.com/contest/1182/problem/F 注意有绝对值. 那么就是 k*p 对 q 取模,找最接近 \(\frac{q}{2}\) 的结果. 也就是 2*k*p 对 2*q 取模,找最接近 q 的结果. 一个二元组,第一维表示 %2q 后与 q 的距离,第二维表示自己的 编号. 对 n 个二元组排序太花时间. 令 \( g(x) = 2*p*x mod (2*q) \) 把 n 分块,只排序第一个块里的元素.因为 \( g(x+y) = g(…
题目链接 根号算法真的是博大精深啊……明明是暴力但复杂度就是能过 这也太强了吧!!! 预处理出p<=sqrt(n)的所有情况,耗时n根n 查询: 如果p<=根n,O1查表 如果p>=根n,因为只有小于根n个数对答案有贡献,所以枚举,耗时根n 修改: 因为单点修改,直接修改1~size所有的情况,耗时根n 然后这个暴力一般的暴力就卡过了!!!!! 这也  太强  了   吧!!!! #include<cstdio> #include<cstring> #includ…
B. Maximum Submatrix 2 time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output You are given a matrix consisting of digits zero and one, its size is n × m. You are allowed to rearrange its rows. W…
简介:分块算法主要是把区间划分成sqrt(n)块,从而降低暴力的复杂度, 其实这算是一种优化的暴力吧,复杂度O(n*sqrt(n)) 题意:给定一个数列:a[i]    (1<= i <= n)    K[j]表示 在区间 [l,r]中j出现的次数. 有t个查询,每个查询l,r,对区间内所有a[i],求sigma(K[a[i]]^2*a[i]) 思路:离线+分块处理 分块和离线处理: 将n个数分成sqrt(n)块,设每块有bsize个数, 并且我们计算出每个询问的左端点所在的块号(q[i].b…
给定一个数组,求出给定区间[l,r]中元素的最大值或最小值或者最值的索引. 一看到这个题目,简单,看我暴力出奇迹.暴力当然是可行的.但是时间复杂度很高(O(n^2)).线段树,树状数组也可以解决这个问题,复杂度(O(nlogn))的预处理,最终查询为O(次数*logn). 而今天用ST(Sparse_Table)算法,也是O(nlogn)的预处理,但是是单次查询为O(1),挺高效的. 我们现在给定一组数据 n==9,元素为2,4,6,8,9,1,2,3,4.一个二维数组f[MAX][MAX];假…
http://codeforces.com/contest/376/problem/D 题意:给你一个矩阵,可以随意排列n行的次序,然后找出全部含有1的子矩阵.输出1的个数. 思路:c[i][j]表示在i列第j行的格子的右边连续的1的个数.对于每一列,排序c[i],然后比较c[i][j]*(n-j+1)与max1的大小,max1就是答案. #include <cstdio> #include <iostream> #include <cstring> #include…
http://codeforces.com/contest/332/problem/B #include <cstdio> #include <cstring> #include <algorithm> #define maxn 200010 using namespace std; int a[maxn]; long long sum[maxn]; long long max1; int main() { int n,k; scanf("%d%d"…
public static void main(String[] args) { long start = System.currentTimeMillis(); double target=9876543212345d; double result =sqrt(target); System.out.println("sqrt耗时:"+(System.currentTimeMillis()-start)+",result:"+result); start=Syst…
一道比较套路的题,看到数据范围就差不多有想法了吧. 题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大 取膜最大,好像不能DP/贪心/玄学乱搞啊.\(n\le35\)?果断meet in middle 考虑我们已经搜出了序列前一半的解,那么怎么根据后面的结果合并出结果? 设我们现在得到的和为\(x\)(对\(m\)取膜后),我们令一个数\(y=m-x\),然后在前面的解中查找\(y\)的前驱即可 接下来进行简单的证明: 若可以找到前驱\(z\),由于\(z<…
题目:http://codeforces.com/contest/888/problem/E 一看就是折半搜索?……然后排序双指针. 两个<m的数加起来如果>=m,一定不会更新答案.因为-m后的值比原来的两个数都小(a+b-m<a+m-m),不如它们去加0: 而如果两个数加起来<m,值比它们都大,可能更新答案. #include<iostream> #include<cstdio> #include<cstring> #include<al…