首页 > 其他分享 >P5350 序列

P5350 序列

时间:2023-12-26 09:11:53浏览次数:34  
标签:itl int auto Cht split P5350 序列 itr

题意

维护一个序列:

  • 区间查询
  • 区间赋值
  • 区间加法
  • 区间复制
  • 区间交换
  • 区间翻转

数据随机。

Sol

珂朵莉。

前 \(3\) 个操作很 \(trivial\)。

考虑区间复制。

先把两个区间 \(split\) 出来。

然后扔进 \(vector\),全部 \(erase\) 掉。再用 \(vector\) \(insert\) 进去。

随便搞搞就过了。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <set>
#include <vector>
#include <cassert>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
#define fi first
#define se second

const int mod = 1e9 + 7;

void Mod(int &x) {
	if (x >= mod) x -= mod;
	if (x < 0) x += mod;
}

namespace Chtholly {

class Node {

public:

	int l, r;
	mutable int v;

	Node (int _l, int _r, int _v) : l(_l), r(_r), v(_v) {}

	bool operator <(const Node &t) const { return l < t.l; }

};

set <Node> Cht;

auto split(int x, int n) {
	if (x > n) return Cht.end();
	auto it = --Cht.upper_bound(Node(x, 0, 0));
	if (it -> l == x) return it;
	int l = it -> l, r = it -> r, v = it -> v;
	Cht.erase(it), Cht.insert(Node(l, x - 1, v));
	return Cht.insert(Node(x, r, v)).fi;
}

int query(int l, int r, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	int ans = 0;
	for (auto it = itl; it != itr; it++)
		ans += it -> v * (it -> r - it -> l + 1) % mod, Mod(ans);
	return ans;
}

void assign(int l, int r, int v, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	Cht.erase(itl, itr);
	Cht.insert(Node(l, r, v));
}

void modify(int l, int r, int v, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	for (auto it = itl; it != itr; it++)
		it -> v += v, Mod(it -> v);
	return;
}

void copy(int l1, int r1, int l2, int r2, int n) {
	auto itr = split(r1 + 1, n), itl = split(l1, n);
	vector <Node> tp;
	for (auto it = itl; it != itr; it++)
		tp.push_back(Node(it -> l + l2 - l1, it -> r + l2 - l1, it -> v));
	itr = split(r2 + 1, n), itl = split(l2, n);
	Cht.erase(itl, itr);
	for (auto x : tp) Cht.insert(x);
}

void swap(int l1, int r1, int l2, int r2, int n) {
	auto itr = split(r1 + 1, n), itl = split(l1, n);
	vector <Node> tp1, tp2;
	for (auto it = itl; it != itr; it++)
		tp1.push_back(Node(it -> l + l2 - l1, it -> r + l2 - l1, it -> v));
	itr = split(r2 + 1, n), itl = split(l2, n);
	for (auto it = itl; it != itr; it++)
		tp2.push_back(Node(it -> l + l1 - l2, it -> r + l1 - l2, it -> v));
	Cht.erase(itl, itr); for (auto x : tp1) Cht.insert(x);
	itr = split(r1 + 1, n), itl = split(l1, n);
	Cht.erase(itl, itr); for (auto x : tp2) Cht.insert(x);
}

void reverse(int l, int r, int n) {
	auto itr = split(r + 1, n), itl = split(l, n);
	vector <Node> tp;
	for (auto x : Cht) {
		/* write(x.l), putchar(32); */
		/* write(x.r), putchar(32); */
		/* write(x.v), puts(""); */
	}
	for (auto it = itl; it != itr; it++) {
		int lp = it -> l, rp = it -> r, v = it -> v;
		lp = r - lp + l, rp = r - rp + l;
		if (lp > rp) std::swap(lp, rp);
		/* write(lp), putchar(32); */
		/* write(rp), puts(""); */
		tp.push_back(Node(lp, rp, v));
	}
	Cht.erase(itl, itr);
	for (auto x : tp) Cht.insert(x);
}

}

signed main() {
	int n = read(), q = read();
	for (int i = 1; i <= n; i++)
		Chtholly::Cht.insert(Chtholly::Node(i, i, read()));
	while (q--) {
		int op = read(), l = read(), r = read(), x, y;
		switch (op) {
		case 1:
			write(Chtholly::query(l, r, n)), puts("");
			break;
		case 2:
			x = read();
			Chtholly::assign(l, r, x, n);
			break;
		case 3:
			x = read();
			Chtholly::modify(l, r, x, n);
			break;
		case 4:
			x = read(), y = read();
			Chtholly::copy(l, r, x, y, n);
			break;
		case 5:
			x = read(), y = read();
			Chtholly::swap(l, r, x, y, n);
			break;
		default:
			Chtholly::reverse(l, r, n);
		}
	}

	int now = 0;
	for (auto x : Chtholly::Cht) {
		int tp = x.r - x.l + 1;
		now += tp;
		/* while (tp--) write(x.v), putchar(32); */
	}
	assert(now == n);
	for (auto x : Chtholly::Cht) {
		int tp = x.r - x.l + 1;
		now += tp;
		while (tp--) write(x.v), putchar(32);
	}
	puts("");

	return 0;
}

标签:itl,int,auto,Cht,split,P5350,序列,itr
From: https://www.cnblogs.com/cxqghzj/p/17927360.html

相关文章

  • LY1099 [ 20230222 CQYC模拟赛 T2 ] 相似序列
    题意给定一个序列。每次询问求两个区间排序后是否只有一个或者没有位置不同。Sol不难想到主席树维护值域。考虑如何判断。注意到当前答案正确,当且仅当值域上两点不同且相邻。维护每个点的哈希值判断即可。Code#include<iostream>#include<algorithm>#include<cstdio......
  • Jmeter参数化获取序列数据实现过程
    一、序列数据是什么很简单,就是利用参数化能产生顺序值,比如1,2,3,4,5,6或者约定格式001,002,003,004等。二、jmeter产生序列数据2.1利用函数助手对话框实现在jmeter菜单处点击工具--函数助手对话框--下拉框选择counter--进入如下界面:mac系统点击生成时会自动复制生成的函数,直接......
  • java alibaba fastjson自定义序列化反序列化(教你解决问题思路)
    大家版本不一样方式可能不一样,我不管你的fastjson版本是哪个,按照我这个思路去弄就行写一个JSONObject类,导入fastjson的JSONObject,然后CTRL+鼠标左键点进去看JSONObject源码,然后点击IDEA的左上角selectopenedfile来定位到当前打开的文件。然后看当前目录这边可以看到上面有个Seria......
  • 二叉树给出先序和中序遍历序列,求和树 要求输出中序遍历序列;
    1.就算不知道用vector的初始化,也可以手动赋值创建子数组。2.不断找到当前序列对应的根节点,计算他的子节点的总和,在这样递归处理过程中,注意要中序输出,所以对于是先遍历完左子树,然后输出答案,然后遍历右子树#include<bits/stdc++.h>usingnamespacestd;#definelllonglong//......
  • 双指针算法-最长不重复子序列
    思路这里的i才是主要的遍历指针,j是用来剔除元素以满足题目要求的。代码#include<iostream>usingnamespacestd;constintN=1e5+10;intn,res;inta[N],s[N];intmain(){cin>>n;for(inti=0;i<n;i++)cin>>a[i];for(int......
  • C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序
    https://www.cnblogs.com/s0611163/p/11872484.html测试结果整理后: 结论:1、这几个工具中,protobuf-net序列化和反序列化效率是最快的2、BinaryFormatter和Newtonsoft.Json反序列化慢的比较多3、Newtonsoft.Json序列化后的文件体积比较大4、Newtonsoft.Json在序列化反序列......
  • 7-3 最长公共子序列
    7-3最长公共子序列一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1,x2,…,xm>,则另一序列Z=<z1,z2,…,zk>是X的子序列是指存在一个严格递增的下标序列<i1,i2,…,ik>,使得对于所有j=1,2,…,k有:Xij=Zj例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B......
  • R语言经济学:动态模型平均(DMA)、动态模型选择(DMS)预测原油价格时间序列
    原文链接:http://tecdat.cn/?p=22458 原文出处:拓端数据部落公众号 简介本文提供了一个经济案例。着重于原油市场的例子。简要地提供了在经济学中使用模型平均和贝叶斯方法的论据,使用了动态模型平均法(DMA),并与ARIMA、TVP等方法进行比较。希望对经济和金融领域的从业人员和研究......
  • 1-4时间序列数据建模流程范例
    0.配置importtorchprint('torch.__version__=',torch.__version__)"""torch.__version__=2.1.0+cpu"""importos#mac系统上pytorch和matplotlib在jupyter中同时跑需要更改环境变量#os.environ["KMP_DUPLICATE_LIB_OK"]=&q......
  • 梭梭带你彻底搞懂YAML序列化语言
    目录前言简介yaml基本语法规则yaml支持的数据结构有三种基本语法大小写敏感用缩进表示层级关系用#表示注释一个文件中可以包含多个文件的内容数据结构与类型对象(Mapping)数组(Sequence)标量(Scalars)字符串(String)布尔值(Boolean)整数(Integer)浮点数(FloatingPoint)空(Null)时间戳(Timestamp)......