据说暴力也过了。还傻逼地写了这么长。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
using namespace std;
#define ll long long
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Val(x) tree[x].val
#define Lazy(x) tree[x].lazy
#define Num(x) tree[x].num
const ll oo = (ll)(-1e15);
inline ll Mid(ll x, ll y){return (x+y)>>1;}
inline ll gcd(ll x, ll y){
if(x>y)swap(x,y);
while(x){
y%=x;
swap(x,y);
}
return y;
}
#define N 100500
struct qqq{
ll op, l, r, val;
}Q[N];
ll n, a[N];
struct node{
ll l, r;
ll lazy, num;
}tree[N<<2];
void push_down(ll id){
if(tree[id].l == tree[id].r) return;
if(Num(id)>0){
Num(L(id)) = Num(R(id)) = Num(id);
}
if(Lazy(id) == oo) return;
Lazy(L(id)) = Lazy(R(id)) = Lazy(id);
Lazy(id) = oo;
}
void push_up(ll id){
if(Num(L(id)) != Num(R(id)))
{
Num(id) = -1;
}
else if(Num(L(id)) == Num(R(id)))Num(id) = Num(L(id));
}
void build(ll l, ll r, ll id){
tree[id].l = l, tree[id].r = r;
Lazy(id) = oo;
Num(id) = 0;
if(l == r)
{
Lazy(id) = a[l];
return;
}
ll mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
}
void updata1(ll l, ll r, ll val, ll num, ll id){
push_down(id);
if(Num(id) > num)return ;
if(l == tree[id].l && tree[id].r == r && Num(id) == 0)
{
Lazy(id) = val;
Num(id) = num;
return;
}
ll mid = Mid(tree[id].l, tree[id].r);
if(mid < l)
updata1(l, r, val, num, R(id));
else if(r <= mid)
updata1(l, r, val, num, L(id));
else {
updata1(l, mid, val, num, L(id));
updata1(mid+1, r, val, num, R(id));
}
push_up(id);
}
void updata2(ll l, ll r, ll val, ll num, ll id){
push_down(id);
if(Num(id) > num)return ;
if(l == tree[id].l && tree[id].r == r && Num(id)!=-1)
{
if(Lazy(id)!=oo)
{
if(Lazy(id) > val)
Lazy(id) = gcd(Lazy(id), val);
return ;
}
}
ll mid = Mid(tree[id].l, tree[id].r);
if(mid < l)
updata2(l, r, val, num, R(id));
else if(r <= mid)
updata2(l, r, val, num, L(id));
else {
updata2(l, mid, val, num, L(id));
updata2(mid+1, r, val, num, R(id));
}
if(Lazy(L(id)) == Lazy(R(id)))
Lazy(id) = Lazy(L(id));
else Lazy(id) = oo;
}
void query(ll id){
push_down(id);
if(tree[id].l == tree[id].r)
{
printf("%I64d ", Lazy(id));
return ;
}
ll mid = Mid(tree[id].l, tree[id].r);
query(L(id));
query(R(id));
}
int main(){
ll i, l, r, T, que, op, val; cin>>T;
while(T--){
cin>>n;
for(i = 1; i <= n; i++)scanf("%I64d",&a[i]);
build(1, n, 1);
cin>>que;
for(i = 1; i <= que; i++)scanf("%I64d %I64d %I64d %I64d", &Q[i].op, &Q[i].l, &Q[i].r, &Q[i].val);
for(i = que; i; i--)
if(Q[i].op == 1)
{
updata1(Q[i].l, Q[i].r, Q[i].val, i, 1);
}
for(i = 1; i <= que; i++)
if(Q[i].op == 2 && Q[i].op)
{
updata2(Q[i].l, Q[i].r, Q[i].val, i, 1);
}
query(1);
puts("");
}
return 0;
}

HDU 4902 Nice boat 线段树+离线的更多相关文章

  1. HDU 4902 Nice boat --线段树(区间更新)

    题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...

  2. hdu 4902 Nice boat 线段树

    题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...

  3. HDU 3333 Turing Tree 线段树+离线处理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...

  4. HDU 4288 Coder 【线段树+离线处理+离散化】

    题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...

  5. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  6. 线段树+离线 hdu5654 xiaoxin and his watermelon candy

    传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...

  7. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  8. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  9. HDU 4902 Nice boat (线段树)

    Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...

随机推荐

  1. (原) 剑指offer--之数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   初次看题觉得这题好简单,直接用库函数power()不就行了,仔细想了想,万 ...

  2. django 常见过滤器

      一.形式:小写 {{ name | lower }} 二.过滤器是可以嵌套的,字符串经过三个过滤器,第一个过滤器转换为小写,第二个过滤器输出首字母,第三个过滤器将首字母转换成大写 标签 {{ st ...

  3. grunt---grunt_test 测试用例

    说明: http://www.gruntjs.net/getting-started --grunt快速入门(创建package.json和Gruntfile.js准备一份新的 Grunt 项目一般需 ...

  4. x86保护模式 控制寄存器和系统地址寄存器

    控制寄存器和系统地址寄存器 控制寄存器    crx cr0   指示cpu工作方式的控制位  包含启用和禁止分页管理机制的控制位  包含控制浮点协处理器操作的控制位   注意必须为0的位 cr2和c ...

  5. TOJ 4008 The Leaf Eaters

    |A∪B∪C|=|A|+|B|+|C|-|A∩B|-|A∩C|-|B∩C|+|A∩B∩C| 这个是集合的容斥,交集差集什么的,这个在概率论经常用到吧 4008: The Leaf Eaters   T ...

  6. 九度oj 题目1120:全排列

    题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中 ...

  7. 机器学习实战之kNN算法

    机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.1 ...

  8. 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

    题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...

  9. [SCOI2005]最大子矩阵 (动态规划)

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  10. 【loj6029】「雅礼集训 2017 Day1」市场

    题目 题意:四种操作,区间加法.区间除法(下取整).区间求最小值.区间求和. 第1.3.4个操作都是摆设,关键在于如何做区间除法. 很明显不能直接把区间的和做除法后向下取整,因为区间和可能会多凑出一个 ...