zoukankan      html  css  js  c++  java
  • P1890 gcd区间 线段树

    题目描述

    给定一行(n)个正整数(a[1]..a[n])

    (m)次询问,每次询问给定一个区间([L,R]),输出(a[L]..a[R])的最大公因数。

    输入格式

    第一行两个整数(n,m)

    第二行n个整数表示(a[1]..a[n])

    以下(m)行,每行(2)个整数表示询问区间的左右端点。

    保证输入数据合法。

    输出格式

    共m行,每行表示一个询问的答案。

    输入输出样例

    输入 #1

    5 3
    4 12 3 6 7
    1 3
    2 3
    5 5
    

    输出 #1

    1
    3
    7
    

    说明/提示

    对于30%的数据,(n <= 100, m <= 10)

    对于60%的数据,(m <= 1000)

    对于100%的数据,(1 <= n <= 1000,1 <= m <= 1,000,000)

     0 < 数字大小 <= 1,000,000,000
    

    题解:

    这里提供一种结构体指针线段树的写法:

    做这道题,你首先要知道(gcd)的求法,由欧几里得算法可知:

    int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); }
    

    其次,(gcd)满足区间可加性,即:

    [gcd(l, r) = gcd(gcd(l, k), gcd(k+1, r)),kin[l, r] ]

    线段树直接维护即可...

    code:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int read() {
    	int x = 0, f = 1; char ch;
    	while(! isdigit(ch = getchar())) (ch == '-') && (f = -f);
    	for(x = ch^48; isdigit(ch = getchar()); x = (x<<3) + (x<<1) + (ch^48));
    	return x * f;
    }
    int n, m;
    inline int gcdd(int x, int y) { return y == 0 ? x : gcdd(y, x % y); }
    struct Segment {
    	struct node {
    		int l, r, gc;
    		node* ch[2];
    		node(int l, int r, int gc) : l(l), r(r), gc(gc) {}
    		inline int mid() { return (l + r) >> 1; }
    		inline void up() { gc = gcdd(ch[0]->gc, ch[1]->gc); }
    	} *root;
    	void build(node *&o, int l, int r) {
    		o = new node (l, r, 0);
    		if(l == r) { o->gc = read(); return; }
    		build(o->ch[0], l, o->mid());
    		build(o->ch[1], o->mid()+1, r);
    		o->up();
    	}
    	int query(node *o, int l, int r) {
    		if(l <= o->l && o->r <= r) return o->gc;
    		int res = 0;
    		if(o->mid() >= l) res = query(o->ch[0], l, r);
    		if(o->mid() < r) res = gcdd(res, query(o->ch[1], l, r));
    		return res;
    	}
    } tr;
    int main() {
    	n = read(); m = read();
    	tr.build(tr.root, 1, n);
    	for(int i = 1, l, r; i <= m; ++ i) {
    		l = read(); r =  read();
    		printf("%d
    ", tr.query(tr.root, l, r));
    	}
    	return 0;
    }
    
  • 相关阅读:
    多线程案例
    Fault-Tolerance, Fast and Slow: Exploiting Failure Asynchrony in Distributed Systems
    LRU缓存实现案例
    kubernetes:基于ab的压力测试
    《软件测试52讲》——测试数据准备篇
    《软件测试52讲》——性能测试篇
    《软件测试52讲》——代码测试篇
    《软件测试52讲》——API自动化测试篇
    《软件测试52讲》——GUI自动化测试篇
    《梁宁产品思维30讲》——创新模式:找到创新模式,发现新大陆
  • 原文地址:https://www.cnblogs.com/Paranoid-LS/p/11582701.html
Copyright © 2011-2022 走看看