题目: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(x) + g(y) ( mod (2*q) ) \) ,所以其他块里的大小关系也可以通过第一个块的情况得知。

具体来说,设块大小是 bs ,在第 i 块就是要找与 \( q - 2*p*i*bs \) 最接近的元素。

用 lower_bound 的话,为了方便可以使 a[ tot+1 ] = a[ 1 ] , a[ 0 ] = a[ tot ] 。但是不能 a[ 0 ].first = a[ 1 ].first - 2*p , a[ 0 ].second = a[ 1 ].second - 1 ,因为模 2*q 意义下访问 0 就是要访问 tot 而不是真的 0 位置。

一定要注意相同 fir 只能保留最小的 second ,并且别用 unique 因为该函数不能做到刚才那个要求!!!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mkp make_pair
#define fi first
#define se second
#define ll long long
using namespace std;
const int N=4e4+,INF=1e9+;
int a,b,p,q,p2,q2,bs,tot;
pair<ll,int> c[N],ans;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&a,&b,&p,&q);
p2=*p; q2=*q; bs=sqrt(b-a+); tot=;
for(int i=;i<bs;i++)
c[++tot]=mkp((ll)p2*(a+i)%q2,i);
sort(c+,c+tot+);
//tot=unique(c+1,c+tot+1)-c-1;
tot=;
for(int i=;i<=bs;i++)
if(i==||c[i].fi!=c[i-].fi)
c[++tot]=c[i]; c[]=c[tot]; c[tot+]=c[];//
/*c[0]=mkp((c[1].fi+q2-p2)%q2,c[1].se-1);
c[tot+1]=mkp((c[tot].fi+p2)%q2,c[tot].se+1);*/
int tp=(ll)p2*bs%q2,pls=,pl2=a;//=a
ans=mkp(INF,INF);
for(int i=,d;i<bs;i++,pls=((ll)pls+tp)%q2,pl2+=bs)
{
d=lower_bound(c+,c+tot+,mkp(((ll)q+q2-pls)%q2,))-c-;//-1
ans=min(ans,mkp(abs((c[d].fi+pls)%q2-q),c[d].se+pl2));
ans=min(ans,mkp(abs((c[d+].fi+pls)%q2-q),c[d+].se+pl2));
}
for(int i=a+bs*bs;i<=b;i++)//a+
ans=min(ans,mkp(abs((ll)p2*i%q2-q),i));
printf("%d\n",ans.se);
}
return ;
}

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

  1. 【Luogu】P3396哈希冲突(根号算法)

    题目链接 根号算法真的是博大精深啊……明明是暴力但复杂度就是能过 这也太强了吧!!! 预处理出p<=sqrt(n)的所有情况,耗时n根n 查询: 如果p<=根n,O1查表 如果p>= ...

  2. CF 375B Maximum Submatrix 2[预处理 计数排序]

    B. Maximum Submatrix 2 time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  3. [置顶] CF 86D Powerful array 分块算法入门,n*sqrt(n)

    简介:分块算法主要是把区间划分成sqrt(n)块,从而降低暴力的复杂度, 其实这算是一种优化的暴力吧,复杂度O(n*sqrt(n)) 题意:给定一个数列:a[i]    (1<= i <= ...

  4. RMQ((Range Minimum/Maximum Query))ST算法

    给定一个数组,求出给定区间[l,r]中元素的最大值或最小值或者最值的索引. 一看到这个题目,简单,看我暴力出奇迹.暴力当然是可行的.但是时间复杂度很高(O(n^2)).线段树,树状数组也可以解决这个问 ...

  5. cf D. Maximum Submatrix 2

    http://codeforces.com/contest/376/problem/D 题意:给你一个矩阵,可以随意排列n行的次序,然后找出全部含有1的子矩阵.输出1的个数. 思路:c[i][j]表示 ...

  6. cf B. Maximum Absurdity

    http://codeforces.com/contest/332/problem/B #include <cstdio> #include <cstring> #includ ...

  7. java实现开根号算法

    public static void main(String[] args) { long start = System.currentTimeMillis(); double target=9876 ...

  8. CF 888E Maximum Subsequence

    一道比较套路的题,看到数据范围就差不多有想法了吧. 题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大 取膜最大,好像不能DP/贪心/玄学乱搞啊.\(n\le35 ...

  9. CF 888E Maximum Subsequence——折半搜索

    题目:http://codeforces.com/contest/888/problem/E 一看就是折半搜索?……然后排序双指针. 两个<m的数加起来如果>=m,一定不会更新答案.因为- ...

随机推荐

  1. 【SD系列】SAP 退货冲账过账成本更新

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 退货冲账过账成本更新   前 ...

  2. Vue 基础 day05 webpack 3.x

    什么是webpack webpack 是前端的一个项目构建工具, 它是基于 Node.js 开发出来的一个前端工具 借助于webpack这个前端自动化构建工具, 可以完美实现资源的合并.打包.压缩.混 ...

  3. MyBatis基础面试题

    转自:http://www.cnblogs.com/huajiezh/p/6415322.html 1.Mybatis基础: #{...} 和 ${...} 的区别MyBatis将 #{…} 解释为J ...

  4. 【mysql】select子句顺序

    sleect…from (1)where (2)group by (3)having (4)order by (5)limit

  5. MySQL-第十五篇使用连接池管理连接

    1.数据库连接池的解决方案是: 当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池.每次应用程序请求数据库连接时,无需重新打开连接,而是从连接池中取出已有的连接使用,使用完后不 ...

  6. Java:CAS(乐观锁)

    本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助. 什么是悲观锁.乐观锁?在java语言里,总有一些名 ...

  7. Python 数据分析中金融数据的来源库和简单操作

    目录 金融数据 pandas-datareader TuShare 金融学图表 案例 金融数据 数据分析离不开数据的获取,这里介绍几种常用的获取金融方面数据的方法. pandas-datareader ...

  8. 给当当同学的random data

    m**o 00'57"32街**o 00'52"23c**6 00'44"15斗**6 00'57"58n**5 00'32"04s**p 00'51 ...

  9. java 企业 网站源码 后台 springmvc SSM 前台 静态化 代码生成器

    前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...

  10. JavaScript中Number(),parseInt()和parseFloat()区别

    parseInt() 函数可解析一个字符串,并返回一个整数; parseFloat() 函数可解析一个字符串,并返回一个浮点数, 以上都是截取转换,具体代码如下: alert(parseInt(&qu ...