FZU 2201 序列操作 [线段树]

北航OJ-2014级第1次算法上机题解 北航2014级第一次算法上机题解 考查知识点:递归,排序,多项式求和技巧,以及数论、博弈论方面的一些知识。 评价:总体来说难度不大。比较困难的是C题和E题,算法都很精巧,是非常值得一做的好题。 阅读详情

Problem Description

给一个长度为n的序列a1,a2,a3,……,an,要求对序列进行以下两种操作

1.L,R,X,将区间[L,R]的每个数字ai变成X-ai,保证X>=区间[L,R]中的任意数字。

2.L R,求区间[L,R]中所有数字的最大公约数。

Input

包含多组数据

每组数据第一行两个数字n和m,分别表示序列长度和操作数。(n,m<=100000)

第二行n个数字,第i个数字表示序列中第i个数

接下来m行第一个数字typ表示操作种类

Typ=1,输入L,R,X

Typ=2,输入L R

Output

对于每一个询问操作,输出一行答案。


思路:经YYF大犇提示... 可知 gcd (A,B) = gcd (A,B-A),考虑对原序列做差分,得到新序列,则gcd【区间(L,R)】=gcd【差分序列(L+1,R),a[L]】,这样就可以将成段更新gcd,变成单点更改(因为转换成了差分,类似于首加尾减),不过也需要成段维护每个点的值是多少,所以蒟蒻建了两颗线段树....orz,不知道YYF怎么写的。

即:维护差分序列,将成段更新转换为单点更新,如此就能维护并询问区间GCD

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)
#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

#define NN 270000
int val[NN],a[NN];
struct node{
    int x;
    int l,r,bj,add;
}t[NN];

int n,m,qn,ql,qr,qv;
int gcd(int x,int y){
    if(y==0)return x;
    else return gcd(y,x%y);
}

void built(){
    for(m=1;m<n+3;m<<=1);
    rep(i,1,m<<1)val[i]=0;
    rep(i,2,n)val[i+m]=a[i]-a[i-1];
    drep(th,m-1,1)val[th]=gcd(val[lth],val[rth]);

    rep(i,1,m-1)t[i+m].l=t[i+m].r=i;
    rep(i,1,m<<1)t[i].bj=t[i].add=0;
    rep(i,1,n)t[i+m].x=a[i];
    drep(th,m-1,1){
        t[th].l=t[lth].l;
        t[th].r=t[rth].r;
    }
}
void pushdown(int th){
    if(t[th].bj){
        t[lth].bj^=1;
        t[rth].bj^=1;
        t[th].bj=0;
    }
    if(t[th].add){
        t[lth].add+=t[th].add;
        t[rth].add+=t[th].add;
        t[th].add=0;
    }
}
void maintain(int th){
    if(th>m){
        if(t[th].bj)t[th].x=-t[th].x,t[th].bj=0;
        if(t[th].add)t[th].x+=t[th].add,t[th].add=0;
    }
}
void update(int th){
    int l=t[th].l,r=t[th].r;
    if(th<m){
        pushdown(th);
        maintain(lth);
        maintain(rth);
    }
    maintain(th);
    //保证 此线段没有标记
    if(l>=ql&&r<=qr){
        t[th].add=qv;
        t[th].bj=1;
    }
    else{
        int m=(l+r)>>1;
        if(ql<=m)update(lth);
        if(qr>m)update(rth);
    }
    maintain(th);
}
int query(int th,int k){
    int l=t[th].l,r=t[th].r;
    if(th<m){
        pushdown(th);
        maintain(lth);
        maintain(rth);
    }
    maintain(th);
    //保证 此线段没有标记
    if(l>=k&&r<=k){
        return t[th].x;
    }
    else{
        int m=(l+r)>>1;
        if(k<=m)return query(lth,k);
        if(k>m)return query(rth,k);
    }
    maintain(th);
}
void modify(int idx,int v){
    if(idx>n)return;
    val[idx+m]=v;
    for(int th=(idx+m)>>1;th>0;th>>=1){
        val[th]=gcd(val[lth],val[rth]);
    }
}
int getgcd(int l,int r){
    int ans=query(1,l);
    if(l==r)return ans;
    l++;
    for(l=l+m-1,r=r+m+1;l^r^1;l>>=1,r>>=1){
        if(~l&1)ans=gcd(ans,val[l^1]);
        if(r&1) ans=gcd(ans,val[r^1]);
    }
    return ans;
}
int main(){
    while(scanf("%d%d",&n,&qn)!=EOF){
        rep(i,1,n)scanff(a[i]);
        built();
        int op;
        rep(i,1,qn){
            scanff(op);
            scanff(ql);
            scanff(qr);
            if(op==1){
                scanff(qv);
                update(1);
                int v1=query(1,ql)-query(1,ql-1);
                int v2=query(1,qr+1)-query(1,qr);
                modify(ql,v1);
                modify(qr+1,v2);

            }
            else{
                printf("%d\n",abs(getgcd(ql,qr)));
            }
        }

    }
    return 0;
}


个人整理的数据集(手写中文数据、发票数据、快递单数据、车牌数据) 本人在工作生活中收集了各个方面比较多的真实的数据集如下: 一、手写中文数据集 1、档案类数据: 此数据集为手写档案数据,数量较大,大约128G,图像均未标注。 ex: 2、手写作文数据: 此数据集为手写作文数据,是大约800M左右,图像按行提供位置和内容标注,十分珍贵。 ex: 二、发票数据集: 1、增值税发票 此数据集包含了大量真实的增值税发票数据,大约9G,标注了发票位置数据,未提供详细标注。 ex: 2、购车发票 此数据集未提供标注。 阅读详情

相关推荐

Contest 226 - C - Martial artist

from atcoder Problem Statement Time Limit: 2 sec / Memory Limit: 1024 MB Score :300300points Takahashi is a martial artist. There areNNmoves that a martial artist can learn, called Move11,22,\ldots…,NN. For each1 \leq i \leq N1≤i≤N, it takes...

m0_54674275的博客 1020

维护序列

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为 n 的数列,不妨设为 a1,a2,⋯,an。有如下三种操作形式: 把数列中的一段数全部乘一个值; 把数列中的一段数全部加一个值; 询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模 P 的值。 Input 第一行两个整数 n 和 P; 第二行含有 n 个非负整数,从左到右依次为 a1,a2,⋯,an; 第三行有一个整数 M,表示操作总数; 从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作 1:“1 t g c”,

p15008340649的博客 583

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

神奇的差分法

查分法是我们所用的一个强力的武器! 有这把武器你就可以统治世界。。。 目录 普通查分法 查分套查分 树上查分(点的意义与边的意义) 例题 普通差分法 对于某些题,我们经常会遇到区间修改,但是区间修改 ...

蒟蒻QMQ 1059

汇川机器人与PLC通信-ModbusTCP超详细案例

通过汇川机器人与PLC的ModbusTCP通信项目案例,我们可以了解通讯配置的过程,地址映射的方式,对接信号的转换,运行时序的逻辑等注意事项,帮助我们快速应用到项目中。

weixin_44166380的博客 1万+

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 256

线段树 FZU 2201 序列操作

把gcd转化成差值...然后建立两颗线段树.... #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long lon

yysys 724

《基于Yolo算法的火灾检测系统设计与实现》开题报告

在消防安全领域,火灾对生命财产安全构成严重威胁。传统的火灾检测手段存在诸多不足,如误报率高、检测范围有限、响应速度慢等。基于 Yolo 算法的火灾检测系统能够利用深度学习技术,实现对火灾的高效、精准检测,具有重要的现实意义。         从社会安全角度看,该系统可以广泛应用于各类公共场所、工业厂房和居民住宅,实时监测火灾隐患,及时发出警报,为人员疏散和消防救援争取宝贵时间,有效降低火灾造成的人员伤亡和财产损失,保障社会公共安全。

m0_69704149的博客 1384

小H的询问(线段树)

链接:https://www.nowcoder.com/acm/contest/72/D 来源:牛客网 题目描述 小H给你一个数组{a},要求支持以下两种操作: 0 l r(1&lt;=l&lt;=r&lt;=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认为是有效的当且仅当这个子区间中没有两个相邻的偶数或者奇数。 1 x v(1&lt;=x&lt;=n,-109...

w571523631的博客 1647

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

Claude Code 完整详解(Anthropic 官方 AI 编程 Agent)

它是运行在终端(Terminal)的 AI 编程代理,不是普通 IDE 插件;你用自然语言发指令,它自主规划步骤、读写项目文件、执行系统命令、排查 Bug、处理 Git 工作流,是能真正动手干活的 AI 程序员。真正的AI 开发代理人,不止写代码,还能执行开发全流程超长全局上下文,大型项目理解碾压传统补全工具终端原生 + IDE 双接入,开发流程无割裂代码质量、可读性、工程规范性普遍偏高权限安全机制完善,修改前预览、可随时中断回滚。

wange6906的博客 3156

操作序列

牛客网链接 小易有一个长度为n的整数序列,a_1,…,a_n。然后考虑在一个空序列b上进行n次以下操作: 1、将a_i放入b序列的末尾 2、逆置b序列 小易需要你计算输出操作n次之后的b序列。 输入描述: 输入包括两行,第一行包括一个整数n(2 ≤ n ≤ 2*10^5),即序列的长度。 第二行包括n个整数a_i(1 ≤ a_i ≤ 10^9),即序列a中的每个整数,以空格分割。输出

genglintong的博客 1640

《网络安全自学教程》- MySQL脱库原理和步骤

MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段

wangyuxiang946的博客 1万+

#洛谷 P2023 [AHOI2009]维护序列 (线段树)

题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。 输入格式 第一行两个整数N和P(1≤P≤1000000000)。 第二行含有N个非负整数,从左到右...

OlaMins 610

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

整数序列(牛客,线段树)

链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 题目描述 给出一个长度为n的整数序列a1,a2,…,an,进行m次操作,操作分为两类。 操作1:给出l,r,v,将al,al+1,…,ar分别加上v; 操作2:给出l,r,询问\sum\limits_{i=l}^{r}sin(a_i) i=l ∑ r ​ sin(a i ​ ) 输入描述: ...

starlet_kiss的博客 1218

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

快速序列操作I

给出一个n个元素的数组,设计一个数据结构,支持以下两种操作。 Add(L,R,v):把的值全部增加v。 Query(L,R):计算子序列的元素和、最小值和最大值。 #include<cstdio> #include<algorithm> using namespace std; const int maxn = 10005; const int inf = 0x3f...

qwerty559的博客 229

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【GDOI2018模拟8.12】区间第k小

Description给出一个长度为n的序列a,q次询问某个区间[l,r]中的区间第k小,注意如果一个数的出现次数大于w就把它当成n 询问强制在线 n,q,ai<=10^5SolutionOrz 数据结构 根号算法讲师 首先如果询问可以离线怎么做? 一个显然的思路就是莫队+数据结构直接做,但是这样是O(nn√logn)O(n\sqrt n \log n)的 实测数据无梯度一个点都跑不过Qw

时光真疯狂, 我一路执迷于匆忙. 954

给出一个含有n个数字的序列a1,a2,a3,...an,可以进行以下操作: 一次操作定义为对这个序列的每个数字进行以下两种改变之一: 1.ai ÷ 2 2.ai × 3 每一次的操作中,必须保证至少有

JAVA 给出一个含有n个数字的序列a1,a2,a3,…an,可以进行以下操作: 一次操作定义为对这个序列的每个数字进行以下两种改变之一: 1.ai ÷ 2 2.ai × 3 每一次的操作中,必须保证至少有一个数字是第1种改变;并且经过每次操作后,每一个数字都必须是整数。 牛牛得知,每进行一次操作,他就可以得到一颗西瓜糖,但是由于孱弱的数学功底,他不知道何时该对某一个数字进行第一种还是...

zhaoyangy_1025的博客 2万+

[COGS2632] [HZOI 2016] 数列操作d

题目一个长度为nn的序列,一开始序列数的权值都是00,有mm次操作 支持两种操作, 1 L R x1\ L\ R\ x,给区间[L,R][L,R]内位置为pospos的数加上(pos−L)⋅x(pos-L)\cdot x 0 L R0\ L\ R,查询区间[L,R][L,R]内的权值和 最终答案对1e9+71e9+7取模题解这是我偶然翻到学弟学妹们出的一道题,于是就做了做。 首先这道题肯定

ztx 737

【线段树】序列操作

序列操作 operation 【题目描述】 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0 3 a b 询问[a,

wu_yihao的专栏 985

[机房练习] [线段树] [RMQ] [区间gcd] 2017.1.21

大家都很强,可与之共勉;丁神来了考的第一次试,然而Simboy前两题半个小时做完(过样例)后便去做第三题的求区间gcd。话说Simboy写的第三题有毒,成功地连续让三台电脑卡死。调了近三个半小时。 然而只有第二题AC(F***********)。 Problem 1. setsum Problem 2. subtree Problem 3. matgcd

Lazer2001 726

2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest G题: Garden Gathering [线段树/最小曼哈顿距离生成树]

在求解曼哈顿最小距离生成树的时候,有一个求解在曼哈顿距离意义下的最近点对的过程,和这个原理相同,可以求解在这张图意义下的最远点对。

Asuna_acmer 1704

2014-2015 ACM-ICPC, Asia Tokyo Regional Contest G題:Flipping Parentheses [线段树]

给出N个括号,一开始是匹配的,然后M次操作,每次操作会把某个位置Pi的括号换个方向,这样就不合法了,我们需要把它再变得合法,输出一个最左边的需要翻转的括号的位置,每一个操作都是在上一个操作基础上进行的。

Asuna_acmer 880

HDU 5293 Tree chain problem [树链剖分+线段树+树形DP]

给出N个点的树,M条树链,树链有权,问在取出的树链互不相交的情况下,权值和最大是多少。

Asuna_acmer 795

BZOJ 8843 染色 [树链剖分+区间线段树]

给出一个树,树上每个点有颜色,两种操作:1)将路径,<X,Y> 上的点颜色全部改成C ;2)询问路径<X,Y> 上的颜色段数,11221为3段。

Asuna_acmer 633
上一篇: HDU 1890 Robotic Sort [splay]
下一篇: HDU 5239 Doom [线段树]
GrassTreeFlower
博客等级 码龄11年 14粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值