嘟嘟嘟




这题没卡带一个\(log\)的,那么就很水了。

然后我因为好长时间没写矩阵优化dp,就只敲了一个暴力分……看来复习还是很关键的啊。




这个函数显然是从后往前递推的,那么令第\(i\)位的分子分母为\(x', y'\),第\(i + 1\)的为\(x, y\),因为\(f(i) = a_i + \frac{1}{f(i + 1)} = \frac{a_i * f(i + 1) + 1}{f(i + 1)}\),所以\(x' = a_i * x + y, y' = x\)。

这样我们把\(x, y\)看成\(f[i][0],f[i][1]\),就很容易构造矩阵了。




然后线段树维护矩阵即可。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<queue>
#include<assert.h>
#include<ctime>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
#define forE(i, x, y) for(int i = head[x], y; ~i && (y = e[i].to); i = e[i].nxt)
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e6 + 5;
const ll mod = 998244353;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
In void MYFILE()
{
#ifndef mrclr
freopen(".in", "r", stdin);
freopen(".out", "w", stdout);
#endif
} int n, m, N, cnt, T; In ll inc(ll a, ll b) {return a + b < mod ? a + b : a + b - mod;} #define LS t[now].ls
#define RS t[now].rs
struct Tree
{
int ls, rs;
ll a[2][2];
In Tree operator + (const Tree& oth)const
{
Tree ret; Mem(ret.a, 0);
for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k)
ret.a[i][j] = inc(ret.a[i][j], a[i][k] * oth.a[k][j] % mod);
return ret;
}
}t[maxn * 20];
int tcnt = 0, root = 0;
In void insert(int l, int r, int& now, int id, ll d)
{
if(!now) now = ++tcnt;
if(l == r)
{
t[now].a[0][0] = d, t[now].a[1][1] = 0;
t[now].a[1][0] = t[now].a[0][1] = 1;
return;
}
int mid = (l + r) >> 1;
if(id <= mid) insert(l, mid, LS, id, d);
else insert(mid + 1, r, RS, id, d);
int tp1 = LS, tp2 = RS;
t[now] = t[LS] + t[RS];
LS = tp1, RS = tp2;
}
In Tree query(int l, int r, int now, int L, int R)
{
if(l == L && r == R) return t[now];
int mid = (l + r) >> 1;
if(R <= mid) return query(l, mid, LS, L, R);
else if(L > mid) return query(mid + 1, r, RS, L, R);
else return query(l, mid, LS, L, mid) + query(mid + 1, r, RS, mid + 1, R);
} int main()
{
// MYFILE();
n = read(), m = read(), T = read();
N = n + m, cnt = n;
for(int i = 1; i <= cnt; ++i) insert(1, N, root, i, read());
ll ansX = 0, ansY = 0;
for(int i = 1; i <= m; ++i)
{
int op = read();
if(op == 1)
{
int x = read();
if(T) x ^= ansX ^ ansY;
insert(1, N, root, ++cnt, x);
}
else
{
int L = read(), R = read();
if(T) L ^= ansX ^ ansY, R ^= ansX ^ ansY;
Tree tp = query(1, N, root, L, R);
write(ansX = tp.a[0][0]), space, write(ansY = tp.a[1][0]), enter;
}
}
return 0;
}

「LibreOJ NOI Round #2」单枪匹马的更多相关文章

  1. 「LibreOJ NOI Round #2」不等关系

    「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...

  2. LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿

    二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...

  3. 「LibreOJ NOI Round #1」验题

    麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...

  4. #509. 「LibreOJ NOI Round #1」动态几何问题

    下面给出部分分做法和满分做法 有一些奇妙的方法可以拿到同样多的分数,本蒟蒻只能介绍几种常见的做法 如果您想拿18分左右,需要了解:质因数分解 如果您想拿30分左右,需要了解:一种较快的筛法 如果您想拿 ...

  5. #510. 「LibreOJ NOI Round #1」动态几何问题

    题目: 题解: 几何部分,先证明一下 \(KX = \sqrt{a},YL = \sqrt{b}\) 设左侧的圆心为 \(O\) ,连接 \(OK\) ,我们有 \(OK = r\). 然后有 \(r ...

  6. #507. 「LibreOJ NOI Round #1」接竹竿 dp

    题目: 题解: 我们考虑把每对花色相同的牌看作区间. 那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案. 那么有 \(f_i = max\{max\{(f_{j-1}+\s ...

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

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

  8. LOJ 510: 「LibreOJ NOI Round #1」北校门外的回忆

    题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \ ...

  9. LOJ575. 「LibreOJ NOI Round #2」不等关系 [容斥,分治FFT]

    LOJ 思路 发现既有大于又有小于比较难办,使用容斥,把大于改成任意减去小于的. 于是最后的串就长成这样:<<?<?<??<<<?<.我们把一段连续的& ...

随机推荐

  1. NIO(2):Channel

    Channel可以理解为铁轨,Buffer是铁轨上的火车.铁轨的两端连接这文件描述符或者说文件的缓冲区和程序运行时的内存.借助NIO是一种更加符合OS底层文件系统的调用方式,使用NIO可以用更小的开销 ...

  2. Spring Spring boot 获取IOC中的bean,ApplicationContext

    https://blog.csdn.net/weixin_38361347/article/details/89304414 https://www.jianshu.com/p/9ea13b00b1d ...

  3. C#使用共享内存与C++进行数据交互

    现在做桌面的不多了.前端太流行了,大家都去搞前端了. 需求如下: 上层UI使用C#开发,数据采集模块使用C++开发.数据采集模块采集到的数据比较大,上层需要接收这一块数据并显示 进程间通信的方式有多种 ...

  4. 14 Scroll 滚动搜索

      Scroll的用法: 第一次搜的时候,要指定 快照保留时间1min,分页的大小:2条/页: 对于第一次搜索,ES会返回一个这个scroll的id: 下次再搜的时候,就带着这个scrollid去搜就 ...

  5. 虹软人脸识别SDK在网络摄像头中的实际应用

    目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容 ...

  6. 跨服务器查询sql语句样例(转)

    若2个数据库在同一台机器上: insert into DataBase_A..Table1(col1,col2,col3----) select col11,col22,col33-- from Da ...

  7. mysql学习之基础篇01

    大概在一周前看了燕十八老师讲解的mysql数据库视频,也跟着学了一周,我就想把我这一周所学的知识跟大家分享一下:因为是第一次写博客,所以可能会写的很烂,请大家多多包涵.文章中有不对的地方还请大家指出来 ...

  8. 【Flask】 python学习第一章 - 2.0 视图方式和返回值

    路由参数与请求方式制定   ALT+回车 pycharm 快速导包  demo3  指定访问地址  与请求方式  #   给路由传入参数 使用尖括号 ,视图函数需要接收参数 @app.route(&q ...

  9. 用js刷剑指offer(数组中的逆序对)

    题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P ...

  10. MyBatis_tp50_动态sql_sql标签_抽取可重用的sql片段_使用include标签进行引用

    笔记要点出错分析与总结 include内部使用自定的属性,之能使用$ {}来取值 ,#{}不能用 工程组织数据库组织0.重新修改Bean类1.定义接口 public interface Employe ...