【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记
Nice boat
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 146 Accepted Submission(s): 75
Also, this devil is looking like a very cute Loli.
Let us continue our story, z*p(actually you) defeat the 'MengMengDa' party's leader, and the 'MengMengDa' party dissolved. z*p becomes the most famous guy among the princess's knight party.
One day, the people in the party find that z*p has died. As what he has done in the past, people just say 'Oh, what a nice boat' and don't care about why he died.
Since then, many people died but no one knows why and everyone is fine about that. Meanwhile, the devil sends her knight to challenge you with Algorithm contest.
There is a hard data structure problem in the contest:
There are n numbers a_1,a_2,...,a_n on a line, everytime you can change every number in a segment [l,r] into a number x(type 1), or change every number a_i in a segment [l,r] which is bigger than x to gcd(a_i,x) (type 2).
You should output the final sequence.
For each test case, the first line contains a integers n.
The next line contains n integers a_1,a_2,...,a_n separated by a single space.
The next line contains an integer Q, denoting the number of the operations.
The next Q line contains 4 integers t,l,r,x. t denotes the operation type.
T<=2,n,Q<=100000
a_i,x >=0
a_i,x is in the range of int32(C++)
Please output a single more space after end of the sequence
题意:给定一个数字序列,对其进行两种操作:1、将序列中连续的一段变成一样的数x;2、给序列中连续的一段和一个数x,对于这个连续一段中的每个数,如果小于x则取x与这个数的最大公约数,否则不操作。
题解:线段树+懒人标记
代码:
#include <cstdio>
#include <cstring> const int LEN = ; struct line
{
int left;
int right;
int value;
}line[LEN*];
int point[LEN*]; //记录线段树底层节点的位置 inline int gcd(int a,int b) //求最大公约数
{
return a % b ? gcd(b, a % b) : b;
} void buildt(int left, int right, int step) //建树同时初始化懒惰标记
{
line[step].value = -;
line[step].left = left;
line[step].right = right;
if (left == right){
point[left] = step;
return;
}
int mid = (left + right) / ;
buildt(left, mid, step*);
buildt(mid+, right, step*+);
} void query_1(int left, int right, int x, int step) //操作一
{
if (left == line[step].left && right == line[step].right){
line[step].value = x;
return;
}
if (line[step].value != -){
line[step*].value = line[step*+].value = line[step].value;
line[step].value = -;
}
int mid = (line[step].left + line[step].right) / ;
if (right <= mid)
query_1(left, right, x, step*);
else if (left > mid)
query_1(left, right, x, step*+);
else{
query_1(left, mid, x, step*);
query_1(mid+, right, x, step*+);
}
} void query_2(int left, int right, int x, int step) //操作函数二
{
if (line[step].left == left && line[step].right == right){
if (line[step].value != -){ //如果找到对应区间,且有标记,则进行条件判断,否则继续
if (line[step].value > x)
line[step].value = gcd(line[step].value, x);
return;
}
}
if (line[step].value != -){ //如果改点被标记,则下移一层
line[step*].value = line[step*+].value = line[step].value;
line[step].value = -;
}
int mid = (line[step].left + line[step].right) / ;
if (right <= mid)
query_2(left, right, x, step*);
else if (left > mid)
query_2(left, right, x, step*+);
else{
query_2(left, mid, x, step*);
query_2(mid+, right, x, step*+);
}
} void findans(int left, int right, int step) //dfs输出结果
{
if (line[step].left == left && line[step].right == right){
if (line[step].value != -){
for(int i = ; i < line[step].right - line[step].left + ; i++)
printf("%d ", line[step].value);
return;
}
}
if (line[step].value != -){
line[step*].value = line[step*+].value = line[step].value;
line[step].value = -;
}
int mid = (line[step].left + line[step].right) / ;
if (right <= mid)
findans(left, right, step*);
else if (left > mid)
findans(left, right, step*+);
else{
findans(left, mid, step*);
findans(mid+, right, step*+);
}
} int main()
{
int T;
//freopen("in.txt", "r", stdin);
scanf("%d", &T);
while(T--){
int n;
memset(point, , sizeof(point));
scanf("%d", &n);
buildt(, n, );
for(int i = ; i <= n; i++){
int t;
scanf("%d", &t);
line[point[i]].value = t;
}
int m;
scanf("%d", &m);
for(int i = ; i < m; i++){
int t, l, r, x;
scanf("%d %d %d %d", &t, &l, &r, &x);
if (t == ){
query_1(l, r, x, );
}
else if (t == ){
query_2(l, r, x, );
}
}
findans(, n, );
printf("\n");
}
return ;
}
【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记的更多相关文章
- 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...
- 2019牛客多校第四场A meeting——树的直径
题意: 一颗 $n$ 个节点的树上标有 $k$ 个点,找一点使得到 $k$ 个关键结点的最大距离最小. 分析: 问题等价于求树的直径,最小距离即为直径除2向上取整. 有两种求法,一是动态规划,对于每个 ...
- hdu6606多校第四次04——线段树加速dp
/* 首先想到二分答案,难点在于如何判断是否有K段,每段和<=mid 把问题转化成求最多有R段,最少有L段,每段的的和<=mid,如果 L<=K<=R 那么显然存在把这个序列分 ...
- 牛客多校第四场 A meeting 树的半径
题意: 有一棵树,树上有许多人,他们要聚会,找一个点使得所有人到这个点的距离的最大值最小. 题解: 首先,以一个有人的点为根,求一个生成树,删掉所有没有人的子树,保证所有的悬挂点(只连接一条边的点)都 ...
- Transformation HDU - 4578(线段树——懒惰标记的妙用)
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
随机推荐
- C# ToString()和Convert.ToString()的区别
一.一般用法说明 ToString()是Object的扩展方法,所以都有ToString()方法;而Convert.ToString(param)(其中param参数的数据类型可以是各种基本数据类型, ...
- spring3.0事务的配置
第一种配置方法:基于XML的事务管理 这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpd ...
- Linux系统编程(17)——正则表达式进阶
C的变量和Shell脚本变量的定义和使用方法很不相同,表达能力也不相同,C的变量有各种类型,而Shell脚本变量都是字符串.同样道理,各种工具和编程语言所使用的正则表达式规范的语法并不相同,表达能力也 ...
- Unix/Linux环境C编程入门教程(35) 编程管理系统中的组
组管理相关函数介绍 相关函数 getgid,setgid,setregid 表头文件 #include<unistd.h> #include<sys/types.h> 定 ...
- Randomized QuickSelect
In this blog, we give a solution for Quick Select. Here, we have an improvement. The idea is to rand ...
- canvas动画文字效果
Doughnut Chartvar c=document.getElementById("canvas");var ctx=c.getContext("2d") ...
- hdu1556 Color the ball
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)
给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...
- Struts2+Spring+Ibatis集成合并
上一篇博客讲述了Struts2+Spring的集成合并,主要是利用了一个中间jar包,这篇博客在加上Ibatis持久层框架,三个框架进行合并.其中Struts2和Spring部分和前边的一样,主要是讲 ...
- DataReader、Table、DataSet和Entity相互转化
public class CommonService { #region DataReader转化 /// <summary> /// 将DataReader转化为Table /// &l ...