HDU 4902
数据太弱,直接让我小暴力一下就过了,一开始没注意到时间是15000MS,队友发现真是太给力了
- #include <cstdio>
- #include <cstring>
- int n,q,a[],x[],p,l[],r[],t[];
- int tree[];
- void build(int l, int r, int rt)
- {
- tree[rt]=-;
- if(l==r){
- tree[rt]=;
- return;
- }
- int m=(l+r)/;
- build(l,m,rt*);
- build(m+,r,rt*+);
- }
- void update(int x, int y, int z, int l, int r, int rt)
- {
- if(x<=l&&y>=r){
- tree[rt]=z;
- return;
- }
- if(tree[rt]!=-) {
- tree[rt*]=tree[rt];
- tree[rt*+]=tree[rt];
- tree[rt]=-;
- }
- int m=(l+r)/;
- if(x<=m) update(x,y,z,l,m,rt*);
- if(y>m) update(x,y,z,m+,r,rt*+);
- }
- int query(int k, int l, int r, int rt)
- {
- if(tree[rt]!=-) return tree[rt];
- int m=(l+r)/;
- if(k<=m) return(query(k,l,m,rt*));
- else return(query(k,m+,r,rt*+));
- }
- int main()
- {
- int cas;
- scanf("%d",&cas);
- while(cas--){
- memset(tree,-,sizeof(tree));
- scanf("%d",&n);
- build(,n,);
- for(int i=; i<=n; i++)
- scanf("%d",&a[i]);
- scanf("%d",&q);
- for(int i=; i<=q; i++)
- {
- scanf("%d%d%d%d",&t[i],&l[i],&r[i],&x[i]);
- if(t[i]==) update(l[i],r[i],i,,n,);
- }
- for(int i=; i<=n; i++){
- p=query(i,,n,);
- if(p) a[i]=x[p];
- for(int j=p+; j<=q; j++)
- if(t[j]==&&l[j]<=i&&r[j]>=i){
- if(a[i]>x[j]){
- int aa=a[i],bb=x[j],t=aa%bb;
- while(t!=){
- aa=bb;
- bb=t;
- t=aa%bb;
- }
- a[i]=bb;
- }
- }
- }
- for(int i=; i<=n; i++)
- printf("%d ",a[i]);
- printf("\n");
- }
- }
CLJ给出的正确题解:
既然gcd(a[i],x)<0.5a[i]
那么最多每个数字修改不会超过32次,
应该便是储存区间最大值以及增加判断区间内数字是否一致的flag
每次对于区间最大值>x的区间进行修改,最差情况无非是每个数字都不同,且数字都大于x,nlgn,而最多就修改32次,因此最差情况nlg^2n。
虽然证明麻烦,但是凭借感觉还是能够明白的。
实现相对简单便不再累赘。
HDU 4902的更多相关文章
- HDU 4902 (线段树)
Problem Nice boat(HDU 4902) 题目大意 维护一个序列,两种操作. 第一种操作,将一段区间[l,r]赋值为x. 第二种操作,将一段区间[l,r]中大于等于x的数与x求gcd. ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 4902 Nice boat (线段树)
Nice boat 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4902 Description There is an old country a ...
- hdu 4902 线段树+逆向模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4902 出n个数,然后对这n个数进行两种操作: 如果是 1 l r x,则把 [l, r] 区间里面的每一个数都变 ...
- hdu 4902 Nice boat(线段树区间改动,输出终于序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 Problem Description There is an old country and ...
- hdu 4902 Nice boat--2014 Multi-University Training Contest 4
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4902 Nice boat Time Limit: 30000/15000 MS (Java/Othe ...
- HDU 4902 Nice boat --线段树(区间更新)
题意:给一个数字序列,第一类操作是将[l,r]内的数全赋为x ,第二类操作是将[l,r]中大于x的数赋为该数与x的gcd,若干操作后输出整个序列. 解法: 本题线段树要维护的最重要的东西就是一个区间内 ...
- 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...
- hdu 4902 Nice boat 线段树
题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...
随机推荐
- [转载]关于安装Android Studio的一些问题的解决方法
最近在研究Android编程,在Android Studio安装和使用时遇到了麻烦,从园子里找到了<关于安装Android Studio的一些问题的解决方法>的,很多问题找到了解决办法. ...
- 【BZOJ】【2194】快速傅里叶之二
FFT c[k]=sigma a[i]*b[i-k] 这个形式不好搞…… 而我们熟悉的卷积的形式是这样的 c[k]=sigma a[i]*b[k-i]也就是[下标之和是定值] 所以我们将a数组反转一下 ...
- 别让安全问题拖慢了 DevOps!
DEVSECOPS 所面临的挑战 敏捷开发和 DevOps 方法的出现使软件开发的速度与质量都有所提升,但它们不经意地也为安全机构增压不少.从前的安全策略是基于静态数据的,而在产品上线前才应用这些策略 ...
- DevOps 和技术债务偿还自动化
当企业想要迁移到一个 DevOps 模型时,经常需要偿还高等级的技术债务 说得更明确一点,机构往往陷入「技术债务的恶性循环」中,以至于任何迅速.敏捷的迁移方式都无法使用.这是技术债务中的希腊债务危机水 ...
- Properties --- C++读配置信息的类
http://blog.csdn.net/billow_zhang/article/details/4304980 在开发实践中,积累了一些通用的C++ 类库,在此写出来给大家分享.也希望能给出更好的 ...
- Chp14: Java
1.finally keyword: finally keyword is used in association with a try/catch block and guarantees that ...
- C#接口的经典案例
C#接口(interface)实例子(简单而经典)2008/12/04 10:04using System; using System.Collections.Generic; using Syste ...
- Sina App Engine(SAE)入门教程(3)-KVDB使用
简介 因为传统关系型数据库在分布式环境下表现的扩展性不足等缺点,近年来NoSQL的概念渐渐成为业界关注的焦点,越来越多的技术人员也习惯于使用NoSQL数据库进行日常开发,SAE为了应对这种新需求,也进 ...
- HTML5 增强的页面元素
一.HTML5 改良的 input 元素的种类 1.<input type="number" id="num1"> var n1 = documen ...
- 汇编debug 截图3