点击打开链接

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
ll gcd(ll x, ll y){
if(x>y)swap(x,y);
while(x){
y%=x;
swap(x,y);
}
return y;
}
const ll inf = 1<<30;
const double eps = 1e-8; typedef pair<ll,ll> pii;
template <class T>
inline bool rd(T &ret) {
char c; ll sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if(x>9) pt(x/10);
putchar(x%10+'0');
} #define N 100005
struct node{
ll pos, l, r, gval;
node(ll a=0,ll b=0,ll c=0,ll d=0):pos(a),l(b),r(c),gval(d){}
bool operator < (const node &x) const {
if(x.gval != gval)
return gval < x.gval;
if(x.pos != pos)
return pos < x.pos;
return r < x.r;
}
}p[N*15]; vector<node> G[N];
ll a[N], n, que, top;
pii ans;
ll sum[N*15]; ll cnt[N*15];
void precal(){
G[n].push_back(node(n,n,n,a[n]));
for(ll i = n-1; i; i--){
G[i].push_back(node(i,i,i,a[i]));
for(ll j = 0; j < G[i+1].size(); j++){
node tmp = G[i+1][j];
ll x = gcd(a[i], tmp.gval);
if(x == G[i][G[i].size()-1].gval)
G[i][G[i].size()-1].r = tmp.r;
else G[i].push_back(node(i, tmp.l, tmp.r, x));
}
}
top = 0;
for(ll i = 1 ; i <= n; i++)
for(ll j = 0; j < (ll)G[i].size(); j++)
p[++top] = G[i][j];
sort(p+1, p+top+1);
sum[0] = 0;
for(ll i = 1; i <= top; i++) sum[i] = sum[i-1] + (ll)p[i].r-(ll)p[i].l+1LL;
cnt[1] = 1;
for(ll i = 2; i <= top; i++) cnt[i] = cnt[i-1] + (p[i-1].gval!=p[i].gval);
}
ll F(ll l, ll r){
ll z = 0, y = G[l].size()-1;
// putchar('&');for(ll i =0;i<G[l].size(); i++)pt(G[l][i].gval),putchar(' ');puts("");
while(z < y)
{
ll mid = (z+y)>>1;
// prllf("(%d,%d)\n", z, y);
if(G[l][mid].r < r)
z = mid+1;
else
y = mid;
}
return G[l][z].gval;
}
void Rank(ll l, ll r){
// puts("2--");
ll x = F(l,r);
// puts("**");
node tmp = node(-inf, 0, 0, x); //1
ll now1 = lower_bound(p+1, p+1+top, tmp) - p;
ans.first = (ll)cnt[now1];
tmp = node(l, l, r, x);
ll now2 = lower_bound(p+now1, p+1+top, tmp) - p;
ans.second = sum[now2-1] - sum[now1-1] + (ll)r - (ll)p[now2].l + 1LL;
// puts("end2");
}
void Select(ll k1, ll k2){
// puts("3--");
ans.first = -1;
if(cnt[top] < k1)return ;
ll L = lower_bound(cnt + 1,cnt + top + 1,k1) - cnt;
ll R = upper_bound(cnt + 1,cnt + top + 1,k1) - cnt - 1;
if(sum[R] - sum[L-1] < (ll)k2) return ;
ll pos = lower_bound(sum+L, sum+R+1, (ll)k2 + sum[L-1]) - sum;
ll tx = sum[pos] - sum[L-1] - (ll)k2;
ans.first = (ll)p[pos].pos;
ans.second = (ll)p[pos].r - tx;
// puts("end3");
}
void input(){
rd(n); rd(que);
for(ll i = 1; i <= n; i++) {
rd(a[i]);
G[i].clear();
}
G[0].clear();
}
int main(){
char s[10];
ll T, Cas = 1, l, r; rd(T);
while(T--){
input();
printf("Case #%I64d:\n", Cas++);
precal();
while(que--){
scanf("%s", s);
rd(l); rd(r);
// prllf("(%d,%d)\n", l, r);
if(s[0] == 'R') {
Rank(l, r);
pt(ans.first); putchar(' '); pt(ans.second); putchar('\n');
}
else {
Select(l, r);
if(ans.first == -1)puts("-1");
else {pt(ans.first); putchar(' '); pt(ans.second); putchar('\n');}
}
}
}
return 0;
}
/*
1
3 6
6 2 4
RANK 1 1
SELECT 3 1
RANK 2 3
SELECT 2 2
SELECT 1 3
SELECT 1 4 */

HDU 5042 GCD pair 预处理+二分 分段的更多相关文章

  1. HDU 5726 GCD(RMQ+二分)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...

  2. hdu 5930 GCD 线段树上二分/ 强行合并维护信息

    from NOIP2016模拟题28 题目大意 n个点的序列,权值\(<=10^6\) q个操作 1.单点修改 2.求所有区间gcd中,不同数个数 分析 1.以一个点为端点,向左或向右的gcd种 ...

  3. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  4. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  5. HDU 3622 Bomb Game(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU 5877 Weak Pair(弱点对)

    HDU 5877 Weak Pair(弱点对) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Jav ...

  7. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  8. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. HDU 6697 Closest Pair of Segments (计算几何 暴力)

    2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...

随机推荐

  1. 省选算法学习-数据结构-splay

    于是乎,在丧心病狂的noip2017结束之后,我们很快就要迎来更加丧心病狂的省选了-_-|| 所以从写完上一篇博客开始到现在我一直深陷数据结构和网络流的漩涡不能自拔 今天终于想起来写博客(只是懒吧.. ...

  2. Java众神之路(2)-标志符

    标志符 1.1标志符:用来标志类名.变量名.方法名.类型名.文件名的有效字符序列成为标志符. 1.2命名规则: Java语言规定标志符由字母(a-zA-Z).下划线(_).美元符号($)和数字(0-9 ...

  3. 部署私有Docker Registry

    安装部署一个私有的Docker Registry是引入.学习和使用Docker这门技术的必经之路之一.尤其是当Docker被所在组织接受,更多人.项目和产品开始接触和使用Docker时,存储和分发自制 ...

  4. 【CF1015F】Bracket Substring(字符串DP)

    题意:给定一个只由左右括号组成的字符串s,问长度为2*n的包含它的合法括号序列方案数,答案对1e9+7取模 1≤n≤100,1≤|s|≤200 思路:暴力预处理出s的每个前缀[0..i]后加左右括号分 ...

  5. 远程连接linux和linux的网络配置

    linux一般是作为服务器的,并不直接对其进行操作,并且由于地理位置的原因,我们需要对linux服务器进行远程连接. 首先我们要确定linux服务器是否安装了ssh服务,在linux服务器上安装ope ...

  6. [Oracle] 临时将Physical Standby激活

    Oracle 10g/11g下如何将物理Standby库临时激活用于测试 在实际运营环境中, 我们经常碰到类似这样的需求: 譬如想不影响现网业务评估DB补丁在现网环境中运行的时间, 或者是想在做DB切 ...

  7. C# 的 String.CompareTo Equals和==的比较

    String.CompareTo 语法 public int CompareTo(    string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...

  8. Java线程池ThreadPoolExecutor类源码分析

    前面我们在java线程池ThreadPoolExecutor类使用详解中对ThreadPoolExector线程池类的使用进行了详细阐述,这篇文章我们对其具体的源码进行一下分析和总结: 首先我们看下T ...

  9. 批处理备份mysql数据

    客户服务器,需要每天定时备份数据库,没办法,bat走起! 代码如下: @echo off C: cd C:\***\***\mysql\bin set Ymd=%date:~,4%%date:~5,2 ...

  10. centos中httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:8888

    Install semanage tools: sudo yum -y install policycoreutils-python Allow port 88 for httpd: sudo sem ...