【LOJ#573】【LNR#2】单枪匹马(线段树)

题面

LOJ

题解

考虑拿线段树维护这个值,现在的问题就是左右怎么合并,那么就假设最右侧进来的那个分数是\(\frac{x}{y}\)的形式,那么就可以维护一下每一个值的系数,就可以直接合并了。
我代码又臭又长,还写得贼复杂

#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 998244353
#define MAX 1000500
#define lson (now<<1)
#define rson (now<<1|1)
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,m,type,a[MAX],N,MX;
struct Num{int a,b,c;};
Num operator+(Num a,Num b){return (Num){(a.a+b.a)%MOD,(a.b+b.b)%MOD,(a.c+b.c)%MOD};}
Num operator*(Num a,int b){return (Num){1ll*a.a*b%MOD,1ll*a.b*b%MOD,1ll*a.c*b%MOD};}
struct Fact{Num a,b;};
Fact operator+(Fact a,int b){return (Fact){a.b*b+a.a,a.b};}
Fact Rev(Fact a){return (Fact){a.b,a.a};}
Fact Value(Fact a,int x,int y)
{int u=(1ll*a.a.a*x+1ll*a.a.b*y+a.a.c)%MOD;int v=(1ll*a.b.a*x+1ll*a.b.b*y+a.b.c)%MOD;return (Fact){(Num){0,0,u},(Num){0,0,v}};
}
struct Node{Fact s,v;}t[MAX<<2];
Node Calc(Node l,Node r)
{Node ret;swap(r.v.a,r.v.b);swap(r.s.a,r.s.b);ret.s=Value(l.v,r.s.a.c,r.s.b.c);Num a=(Num){(1ll*l.v.a.a*r.v.a.a+1ll*l.v.a.b*r.v.b.a)%MOD,(1ll*l.v.a.a*r.v.a.b+1ll*l.v.a.b*r.v.b.b)%MOD,(1ll*l.v.a.a*r.v.a.c+1ll*l.v.a.b*r.v.b.c+l.v.a.c)%MOD};Num b=(Num){(1ll*l.v.b.a*r.v.a.a+1ll*l.v.b.b*r.v.b.a)%MOD,(1ll*l.v.b.a*r.v.a.b+1ll*l.v.b.b*r.v.b.b)%MOD,(1ll*l.v.b.a*r.v.a.c+1ll*l.v.b.b*r.v.b.c+l.v.b.c)%MOD};ret.v=(Fact){a,b};return ret;
}
void Modify(int now,int l,int r,int p)
{if(l==r){t[now].s=(Fact){(Num){0,0,a[l]},(Num){0,0,1}};t[now].v=(Fact){(Num){1,0,0},(Num){0,1,0}}+a[l];return;}int mid=(l+r)>>1;if(p<=mid)Modify(lson,l,mid,p);else Modify(rson,mid+1,r,p);t[now]=Calc(t[lson],t[rson]);
}
Node Query(int now,int l,int r,int L,int R)
{if(L==l&&r==R)return t[now];int mid=(l+r)>>1;if(R<=mid)return Query(lson,l,mid,L,R);if(L>mid)return Query(rson,mid+1,r,L,R);return Calc(Query(lson,l,mid,L,mid),Query(rson,mid+1,r,mid+1,R));
}
int main()
{n=read();m=read();type=read();N=n+m;MX=n;for(int i=1;i<=n;++i)a[i]=read(),Modify(1,1,N,i);for(int i=1,lans=0;i<=m;++i){int opt=read();if(opt==1){int x=read();if(type==1)x^=lans;a[++MX]=x;Modify(1,1,N,MX);}else{int l=read(),r=read();if(type==1)l^=lans,r^=lans;Node u=Query(1,1,N,l,r);printf("%d %d\n",u.s.a.c,u.s.b.c);lans=u.s.a.c^u.s.b.c;}}return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/11148331.html

【LOJ#573】【LNR#2】单枪匹马(线段树)相关推荐

  1. LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树

    $f$ 函数暴力计算的话是 $O(n)$ 的(用一个 $\frac{x}{y}$ 来保存每一步计算结果,然后依次合并) 我们将一段区间的结果写成 $\frac{ax+by}{cx+dy}$ 的形式,初 ...

  2. LOJ 3094 「BJOI2019」删数——角标偏移的线段树

    题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...

  3. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  4. 【线段树】海报(loj 3264)

    正题 loj 3264 题目大意 有一个环,环上n个点,权值为a,有m次修改,每次修改一个aia_iai​,然后让你选取一些数,使环上不存在连续四个以上的数被选取,让你求所选数的最大权值和 解题思路 ...

  5. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  6. LOJ 534 花团(线段树+dfs栈)

    题意 https://loj.ac/problem/534 思路 又是复杂度错误的一题,\(O(n^2\log n)\) 能过 \(15000\) . 虽然看起来强制在线,其实是一道假的在线题.首先按 ...

  7. Loj#510-「LibreOJ NOI Round #1」北校门外的回忆【线段树】

    正题 题目链接:https://loj.ac/p/510 题目大意 给出一个代码 function add(x,v)while x <= n dos[x] = s[x] xor vx = x + ...

  8. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)

    题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...

  9. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

最新文章

  1. python3命令记忆技巧_Python3学习笔记-回忆并复述是加强记忆的好方式!
  2. NeurIPS 2021 | 华为诺亚Oral论文:基于频域的二值神经网络训练方法
  3. GridView更新出现异常的解决过程
  4. Python面向对象中的self到底是什么?
  5. scss提取 vue_vue 中使用sass实现主体换肤
  6. 关于联合体输出的问题(是否小端模式)
  7. 该如何清理手机的垃圾?
  8. - 贪心基础入门讲解二——活动安排问题
  9. 关闭网页自动提示加入收藏
  10. Sentinel-2快速查询图幅号——基于MGRS_100kmSQ_ID_File_Geodatabase快速查询
  11. 【愚公系列】2022年09月 微信小程序-自定义tabBar的实现
  12. 宽高变化动画代码,旋转动画代码(HTML5)
  13. 一个大学教授让人发冷汗的讲演(浙大高分子物理郑强教授)
  14. 外文版计算机科学期刊,计算机期刊大全(国外英文资料).doc
  15. Linux常见Bug解决方案
  16. alter在MySQL中是什么意思_MySql中要AlterTable的同学请注意!!!_MySQL
  17. 快速删除node_modules目录的方法:指令rimraf
  18. 基于51单片机的数字时钟(万年历)
  19. Max-Min Fairness带宽分配算法
  20. 配置Python开发环境

热门文章

  1. 1. 计算机网络和因特网
  2. 抓取国家统计局2018年的省市区街道数据
  3. java实现生成纯色图片代码实例
  4. 家装灯线走线图_家装灯线怎么布线
  5. 标准光源与色温对应关系
  6. 美国计算机专业修什么课程,美国大学计算机专业课程有4大特点
  7. spss入门——简单的数据预处理到时间序列分析系列(四)
  8. 我是怎么利用微信月收入三万以上的!(绝对的干货来袭!)
  9. CDS — 数据管理分析平台
  10. 屑 催 逝 员 剧 情 java 版