「LibreOJ NOI Round #2」单枪匹马
嘟嘟嘟
这题没卡带一个\(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」单枪匹马的更多相关文章
- 「LibreOJ NOI Round #2」不等关系
「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...
- LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿
二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...
- 「LibreOJ NOI Round #1」验题
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...
- #509. 「LibreOJ NOI Round #1」动态几何问题
下面给出部分分做法和满分做法 有一些奇妙的方法可以拿到同样多的分数,本蒟蒻只能介绍几种常见的做法 如果您想拿18分左右,需要了解:质因数分解 如果您想拿30分左右,需要了解:一种较快的筛法 如果您想拿 ...
- #510. 「LibreOJ NOI Round #1」动态几何问题
题目: 题解: 几何部分,先证明一下 \(KX = \sqrt{a},YL = \sqrt{b}\) 设左侧的圆心为 \(O\) ,连接 \(OK\) ,我们有 \(OK = r\). 然后有 \(r ...
- #507. 「LibreOJ NOI Round #1」接竹竿 dp
题目: 题解: 我们考虑把每对花色相同的牌看作区间. 那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案. 那么有 \(f_i = max\{max\{(f_{j-1}+\s ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- LOJ 510: 「LibreOJ NOI Round #1」北校门外的回忆
题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \ ...
- LOJ575. 「LibreOJ NOI Round #2」不等关系 [容斥,分治FFT]
LOJ 思路 发现既有大于又有小于比较难办,使用容斥,把大于改成任意减去小于的. 于是最后的串就长成这样:<<?<?<??<<<?<.我们把一段连续的& ...
随机推荐
- 全栈项目|小书架|服务器开发-Koa2 连接MySQL数据库(Navicat+XAMPP)
为什么使用数据库 为什么需要数据库?-知乎 相比与文件系统,数据库具有以下优势: 高效率:查找效率高 高可用:可数据库共享 安全性强:数据不能随意修改 选择哪个数据库 数据库可以分为关系型数据库和非关 ...
- ESP8266 智能家居简单实现
本文转自CSDN,地址 https://blog.csdn.net/jsagacity/article/details/78531819 全文如下 : 前段时间,公司利用 ESP8266 这个WiFi ...
- 原生JS获取HTML DOM元素的8种方法
JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...
- CSS ID选择器&通配选择器
ID选择器 ID(IDentity)是编号的意思,一般指定标签在HTML文档中的唯一编号.ID选择器和标签选择器.类选择器的作用范围不同. ID选择器仅仅定义一个对下对象的样式,而标签选择器和类选择器 ...
- Android里的Dalvik、ART、JIT、AOT有什么关系?
JIT,Just-in-time,即时编译,边运行边编译: AOT,Ahead Of Time,提前编译,指运行前编译. 区别 这两种编译方式的主要区别在于是否在“运行时”进行编译 优劣JIT优点: ...
- Core Animation笔记(特殊图层)
1.shapeLayer: 渲染快速,内存占用小,不会被图层边界裁掉(可以在边界之外绘制),不会像素化(当做3D变化如缩放是不会失真) CGRect rect = self.containerView ...
- Python学习日记(十二) 匿名函数
匿名函数: 未解决一些简单的需求而设计的函数 语法: func = lambda x : x**2 func:函数名 lambda:类似def的关键字 x:参数 x**2:返回值表达式 适用内置函数: ...
- Linux下用的脚本
http://blog.itpub.net/29510932/viewspace-1166603/ 批量启动Tomcat 点击(此处)折叠或打开 #!/bin/bash #JDK路径 export J ...
- [https][tls] 如何使用wireshark查看tls/https加密消息--使用私钥
之前总结了使用keylog进行https流量分析的方法: [https][tls] 如何使用wireshark查看tls/https加密消息--使用keylog 今天总结一下使用服务器端证书私钥进行h ...
- CentOS7怎样安装Tomcat8.5.38
cd /usr/local进入/usr/local目录 mkdir tomcat创建tomcat目录 cd tomcat进入tomcat目录 wget https://mirrors.tuna.tsi ...