简单数学变换+线段树

简单数据结构签到题不解释

本来应该贴板子的,鉴于最近写代码太少了,而且由于要用两个线段树,平时板子都是一个的。以及板子在队友那。就当熟悉写代码,自己写了一下。

#include <bits/stdc++.h>
using namespace std; #define dual(i, n) (n) + 1 - (i) typedef long long ll;
int n, q;
const int maxn = 1e+5 + 5;
typedef ll arr[maxn];
arr a, pa; struct seg_tree
{
// a,nds坐标都是从1开始记
ll *a;
int n;
struct nd
{
ll sum;
};
vector<nd> nds;
seg_tree(ll *a0, int n0)
{
a = a0;
n = n0;
nds.resize(4 * n);
build(1, 1, n);
}
void build(int i, int l, int r)
{
if (l == r)
{
nds[i].sum = a[l];
return;
}
int m = l + (r - l) / 2;
build(2 * i, l, m);
build(2 * i + 1, m + 1, r);
nds[i].sum = nds[2 * i].sum + nds[2 * i + 1].sum;
} void change(int i, ll x)
{
ll delta = x - a[i];
a[i] = x;
add(i, delta);
} void add(int i, ll x)
{
int l = 1;
int r = n;
int u = 1;
int m;
while (true)
{
nds[u].sum += x;
if (l == r)
break;
m = l + (r - l) / 2;
if (i <= m)
{
r = m;
u = 2 * u;
}
else
{
l = m + 1;
u = 2 * u + 1;
}
}
} ll query(int l, int r, int u, int ul, int ur)
{
// ensure ul<=l<=r<=ur
if (ul == l && r == ur)
return nds[u].sum;
int um = ul + (ur - ul) / 2;
if (r <= um) // left
return query(l, r, 2 * u, ul, um);
else if (l >= um + 1) // right
return query(l, r, 2 * u + 1, um + 1, ur);
else
return query(l, um, 2 * u, ul, um) // left
+ query(um + 1, r, 2 * u + 1, um + 1, ur); // right
} inline ll query(int l,int r) {
return query(l,r,1,1,n);
}
}; int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
for (int i = n; i >= 1; --i)
{
cin >> a[i];
pa[i] = a[i] * i;
}
seg_tree s(a, n);
seg_tree ps(pa, n);
int t, l, r, k;
ll x, px;
for (int i = 0; i < q; ++i)
{
cin >> t;
if (1 == t)
{
// query
cin >> r >> l;
l = dual(l, n);
r = dual(r, n);
cout << ps.query(l, r) - (ll)(l - 1) * s.query(l, r) << "\n";
}
else
{
// a[k] = x
cin >> k >> x;
k = dual(k, n);
px = x * k;
s.change(k, x);
ps.change(k, px);
}
}
cout.flush();
return 0;
}

ACM-ICPC 2018 徐州赛区网络预赛 Ryuji doesn't want to study的更多相关文章

  1. ACM-ICPC 2018 徐州赛区网络预赛 HRyuji doesn't want to study 树状数组

    题目链接:https://nanti.jisuanke.com/t/A2007 题目大意:有一个序列含有n个数a[1],a[2],a[3],……a[n],有两种操作: 第一种操作:k=1,l,r,询问 ...

  2. 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)

    H.Ryuji doesn't want to study 27.34% 1000ms 262144K   Ryuji is not a good student, and he doesn't wa ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

    262144K   Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)

    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

  6. ACM-ICPC 2018 徐州赛区网络预赛(8/11)

    ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 枚举第一个选的,接下来的那个不能取前一个的取反 \(DP[i][0]\)表示选和第一个相同的 \(DP[i][1]\) ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)

    传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track

    262144K   Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...

随机推荐

  1. logstash 配置文件语法

    需要一个配置文件 管理输入.过滤器和输出相关的配置.配置文件内容格式如下: # 输入 input { ... } # 过滤器 filter { ... } # 输出 output { ... } 先来 ...

  2. 小记centos7下将未使用的磁盘空间重新分区挂载使用

    一块1TB的硬盘,用作samba共享,在安装系统时分区如下: /boot 2048M swap 512M / 229GB 剩下约 700GB左右未使用空间,在安装完系统后再使用 以下是详细操作,就几个 ...

  3. [Linux-CentOS7]yum清华源CentOS7

    shell直接运行 cat > 01.yumrepo.sh << 'EOF' # 创建备份路径 mkdir -p /etc/yum.repos.d/repo.bak/ # 备份源 m ...

  4. 阿里云ECS服务器,mysql无法外网访问

    可参考https://www.jianshu.com/p/7a41734b502e 问题原因 未授权远程IP地址登录.root用户默认只能在localhost也就是本机登录 解决方案 在服务器上登录数 ...

  5. emmet笔记

    1.div.div${div$}*6 生成 <div class="div1">div1</div> <div class="div2&qu ...

  6. JDBC 及 sql注入问题

    一.相关概念 1.什么是JDBC JDBC(Java Database Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由 ...

  7. JavaScript中基本数据类型之间的转换

    在JavaScript中共有六种数据类型,其中有五种是基本数据类型,还有一种则是引用数据类型.五种基本数据类型分别是:Number 数值类型.String 字符串类型.Boolean 布尔类型, nu ...

  8. Oracle11以后的行列转换

    Oracle11以后,行列转换有了新的方法. 下面的是已经疏通过的代码,请放心使用... With AA as ( Select A,B,C,row_number() over (partition ...

  9. Qt编写的项目作品3-输入法V2018

    一.功能特点 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4.6.0到Qt5 ...

  10. MySQL数据库的两种连接方式:TCP/IP和Socket

    Linux平台环境下主要有两种连接方式,一种是TCP/IP连接方式,另一种就是socket连接. 在Windows平台下,有name pipe和share memory(不考虑)两种. TCP/IP连 ...