【LOJ#573】【LNR#2】单枪匹马(线段树)
【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】单枪匹马(线段树)相关推荐
- LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树
$f$ 函数暴力计算的话是 $O(n)$ 的(用一个 $\frac{x}{y}$ 来保存每一步计算结果,然后依次合并) 我们将一段区间的结果写成 $\frac{ax+by}{cx+dy}$ 的形式,初 ...
- LOJ 3094 「BJOI2019」删数——角标偏移的线段树
题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- 【线段树】海报(loj 3264)
正题 loj 3264 题目大意 有一个环,环上n个点,权值为a,有m次修改,每次修改一个aia_iai,然后让你选取一些数,使环上不存在连续四个以上的数被选取,让你求所选数的最大权值和 解题思路 ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- LOJ 534 花团(线段树+dfs栈)
题意 https://loj.ac/problem/534 思路 又是复杂度错误的一题,\(O(n^2\log n)\) 能过 \(15000\) . 虽然看起来强制在线,其实是一道假的在线题.首先按 ...
- 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 + ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)
题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...
最新文章
- python3命令记忆技巧_Python3学习笔记-回忆并复述是加强记忆的好方式!
- NeurIPS 2021 | 华为诺亚Oral论文:基于频域的二值神经网络训练方法
- GridView更新出现异常的解决过程
- Python面向对象中的self到底是什么?
- scss提取 vue_vue 中使用sass实现主体换肤
- 关于联合体输出的问题(是否小端模式)
- 该如何清理手机的垃圾?
- - 贪心基础入门讲解二——活动安排问题
- 关闭网页自动提示加入收藏
- Sentinel-2快速查询图幅号——基于MGRS_100kmSQ_ID_File_Geodatabase快速查询
- 【愚公系列】2022年09月 微信小程序-自定义tabBar的实现
- 宽高变化动画代码,旋转动画代码(HTML5)
- 一个大学教授让人发冷汗的讲演(浙大高分子物理郑强教授)
- 外文版计算机科学期刊,计算机期刊大全(国外英文资料).doc
- Linux常见Bug解决方案
- alter在MySQL中是什么意思_MySql中要AlterTable的同学请注意!!!_MySQL
- 快速删除node_modules目录的方法:指令rimraf
- 基于51单片机的数字时钟(万年历)
- Max-Min Fairness带宽分配算法
- 配置Python开发环境