HDU 4902 Nice boat 线段树+离线
据说暴力也过了。还傻逼地写了这么长。
。
。
#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 线段树+离线的更多相关文章
- HDU 4902 Nice boat --线段树(区间更新)
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...
- hdu 4902 Nice boat 线段树
题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...
- HDU 3333 Turing Tree 线段树+离线处理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- 线段树+离线 hdu5654 xiaoxin and his watermelon candy
传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...
- HDU 4902 Nice boat (线段树)
Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...
随机推荐
- 快照、克隆,xshell优化,Linux历史
目录 一.虚拟拍照功能 二.虚拟机克隆功能 三.Xshell的优化 四.介绍Linux历史 一.虚拟拍照功能 1.拍摄快照 关机状态拍照 关机命令:shutdown -h now 或者 init 0 ...
- 有关Kali处理源的方法
sudo apt-get update 更新源sudo apt-get install package 安装包sudo apt-get remove package 删除包sudo apt-cach ...
- Python日志(logging)模块,shelve,sys模块
菜鸟学python第十七天 1.logging 模块 logging模块即日志记录模块 用途:用来记录日志 为什么要记录日志: 为了日后复查,提取有用信息 如何记录文件 直接打开文件,往里写东西 直接 ...
- GYM 101350 G
G. Snake Rana time limit per test 4.0 s memory limit per test 256 MB input standard input output sta ...
- this version of SLF4J requires log4j version 1.2.12 or later.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFacto ...
- Java中TreeMap集合讲解
1.TreeSet介绍 TreeSet是一个有序集合,可以以任意顺序将元素插入到集合中,在对集合进行遍历的时候,每个元素将自动按照排序后的顺序呈现.底层使用的是二叉树(更具体点是红黑树)实现,对于元素 ...
- Python中的socket网络编程(TCP/IP,UDP)讲解
在网络编程中的一个基本组件就是套接字(socket).套接字基本上是两个端点的程序之间的"信息通道".程序可能分布在不同的计算机上,通过套接字互相发送信息.套接字包括两个:服务器套 ...
- PAT Basic 1042
1042 字符统计 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空格组成,至少包 ...
- Oracle中创建触发器示例及注意事项
1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYI ...
- 项目-开发手机app
一. 安装Hbuilder,和夜神安卓模拟器 注:夜神模拟器,如过windows中安装了hyper-v,需要卸载,不然会死机 二. Hbuilder简介 官网:http://www.dcloud.i ...