首页 > 其他分享 >NOIP2022 比赛

NOIP2022 比赛

时间:2023-10-04 12:44:56浏览次数:39  
标签:比赛 rs int tr ti NOIP2022 tb ta

Day \(2^2+3^2+4^2\)。

HNOI2016 序列的加强版。我去年怎么这么菜啊,虽然现在也是就是了。

\[\sum\limits_{[l,r]\in [L,R]}\left(\max\limits_{i\in [l,r]}a_i\right)\left(\max\limits_{i\in [l,r]}b_i\right) \]

考虑离线,对右端点 \(r\) 扫描线,对每个左端点 \(l\) 维护 \(S_l=\left(\max\limits_{i\in [l,r]}a_i\right)\left(\max\limits_{i\in [l,r]}b_i\right)\)。然后查询就变成了求历史版本和,由于需要维护最大值,建立关于 \(a_i,b_i\) 的单调栈,题目就变成了:

  1. 令 \(a_i\gets a_i+c,i\in [l,r]\)。
  2. 令 \(b_i\gets b_i+c,i\in [l,r]\)。
  3. 令 \(c_i\gets c_i+a_ib_i,i\in [l,r]\)。
  4. 查询 \(\sum \limits_{i\in [l,r]}c_i\) 的值。

类似上面那题,没有历史版本和的问题时容易的。维护 \(a_i,b_i\) 的区间和、区间加法标记以及 \(a_ib_i\) 的区间和就行了。由于要维护历史版本和,再维护 \(a_i,b_i\) 的区间历史版本和、区间历史加法标记和以及 \(a_ib_i\) 的历史版本和、\(a_i,b_i\) 标记乘积的历史版本和即可。

// Problem: #3899. 「NOIP2022」比赛
// Contest: LibreOJ
// URL: https://loj.ac/p/3899
// Memory Limit: 512 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define mt make_tuple
#define mp make_pair
#define fi first
#define se second
// #define FILE

using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int> tu;
bool Mbe;

const int N = 3e5 + 300;

int n, m, a[N], b[N], tp[2], st[N][2];
ull ans[N];
vector<pi> q[N];

struct node {
	ull sa, sb, sab, ta, tb, len;
	ull hsa, hsb, hsab, hta, htb, htab, ti;
	node () { sa = sb = sab = ta = tb = len = hsa = hsb = hsab = hta = htb = htab = ti = 0; }
} tr[N << 2];

node tag (ull _ta, ull _tb, ull _ti) { node res; res.ta = _ta, res.tb = _tb, res.ti = _ti; return res; }
#define ls x << 1
#define rs x << 1 | 1
#define mid ((l + r) >> 1)

void ptg(node &x, node y) {
	x.hsab += x.sab * y.ti + x.sb * y.hta + x.sa * y.htb + x.len * y.htab;
	x.hsa += x.sa * y.ti + x.len * y.hta, x.hsb += x.sb * y.ti + x.len * y.htb;
	x.htab += x.ta * x.tb * y.ti + x.ta * y.htb + x.tb * y.hta + y.htab;
	x.hta += x.ta * y.ti + y.hta, x.htb += x.tb * y.ti + y.htb;
	x.sab += y.ta * x.sb + y.tb * x.sa + x.len * y.ta * y.tb;
	x.sa += x.len * y.ta, x.sb += x.len * y.tb, x.ta += y.ta, x.tb += y.tb, x.ti += y.ti;
}

void pup(int x) {
	tr[x].sab = tr[ls].sab + tr[rs].sab;
	tr[x].sa = tr[ls].sa + tr[rs].sa;
	tr[x].sb = tr[ls].sb + tr[rs].sb;
	tr[x].hsa = tr[ls].hsa + tr[rs].hsa;
	tr[x].hsb = tr[ls].hsb + tr[rs].hsb;
	tr[x].hsab = tr[ls].hsab + tr[rs].hsab;
}

void pdn(int x) {
	ptg(tr[ls], tr[x]), ptg(tr[rs], tr[x]);
	tr[x].ta = tr[x].tb = tr[x].ti = tr[x].hta = tr[x].htb = tr[x].htab = 0;
}

void build(int l, int r, int x) {
	tr[x].len = r - l + 1;
	if (l == r) return;
	build(l, mid, ls), build(mid + 1, r, rs);
}

void upd(int l, int r, int s, int t, int op, int c, int x) {
	if (s <= l && r <= t) return ptg(tr[x], tag((ull)(op ? 0 : c), (ull)(!op ? 0 : c), 0)), void();
	pdn(x);
	if (s <= mid) upd(l, mid, s, t, op, c, ls);
	if (t > mid) upd(mid + 1, r, s, t, op, c, rs);
	pup(x);
}

ull qry(int l, int r, int s, int t, int x) {
	if (s <= l && r <= t) return tr[x].hsab;
	pdn(x); ull res = 0;
	if (s <= mid) res += qry(l, mid, s, t, ls);
	if (t > mid) res += qry(mid + 1, r, s, t, rs);
	return res;
}

void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> b[i];
	cin >> m;
	for (int i = 1, l, r; i <= m; i++)
		cin >> l >> r, q[r].pb(mp(l, i));
	build(1, n, 1);
	for (int i = 1; i <= n; i++) {
		while (tp[0] && a[st[tp[0]][0]] < a[i]) upd(1, n, st[tp[0] - 1][0] + 1, st[tp[0]][0], 0, a[i] - a[st[tp[0]][0]], 1), tp[0]--;
		while (tp[1] && b[st[tp[1]][1]] < b[i]) upd(1, n, st[tp[1] - 1][1] + 1, st[tp[1]][1], 1, b[i] - b[st[tp[1]][1]], 1), tp[1]--;
		st[++tp[0]][0] = st[++tp[1]][1] = i, upd(1, n, i, i, 0, a[i], 1), upd(1, n, i, i, 1, b[i], 1);
		ptg(tr[1], tag(0, 0, 1));
		for (pi j : q[i]) ans[j.se] = qry(1, n, j.fi, i, 1);
	}
	for (int i = 1; i <= m; i++)
		cout << ans[i] << '\n';
}

bool Med;
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cerr << (&Mbe - &Med) / 1048576.0 << " MB\n";
	#ifdef FILE
		freopen("match.in", "r", stdin);
		freopen("match.out", "w", stdout);
	#endif
	int T = 1;
	cin >> T, T = 1;
	while (T--) solve();
	cerr << (int)(1e3 * clock() / CLOCKS_PER_SEC) << " ms\n";
	return 0;
}

标签:比赛,rs,int,tr,ti,NOIP2022,tb,ta
From: https://www.cnblogs.com/Ender32k/p/17742144.html

相关文章

  • 亚马逊云科技中国峰会:探索强化学习的未来与Amazon DeepRacer赛车比赛
    目录一、如何构建自己的第一个强化学习模型第一步:创建AWSDeepRacer资源第二步:定义你的赛道第三步:训练你的模型第四步:优化你的模型第五步:在仿真器中测试你的模型第六步:在真实赛道上测试你的模型二、AmazonDeepRacer中国峰会总决赛三、AmazonDeepRacer自动驾驶赛......
  • 加训日记 Day6——来场div3上上分(为什么连着三天比赛啊喂,人要熬死了)
    Day6,9.26cfround900div3  ·前三题手速题,尝试用模板和库函数结果出了点岔子,罚时略高  ·感觉还有很大提升空间,觉得这种题应该要求自己10分钟内全过掉(开翻译的情况下)  ·D过的人数没有E多就很难绷  ·写了发D结果TLEon10,心态爆炸直接下播  ·美美+46......
  • 基于Java的高校竞赛管理系统设计与实现(亮点:发起比赛、报名、审核、评委打分、获奖排名
    高校竞赛管理系统一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述4.2系统角色五、系统主要功能展示5.1前端展示5.1.1......
  • BRICS区块链比赛流程
    BRICS比赛流程梳理如下,从上到下的顺序为比赛流程的顺序。总共3个部分,从环境搭建到常见问题踩坑。提供了参考。整合了许多文档于一体的一部参考文档。对于未完成的部分,未来会完成补坑。区块链平台运维基于提供的开发环境,使用离线安装包搭建区块链网络平台,含FISCOBCOS区块链......
  • P8867 [NOIP2022] 建造军营
    这道题想了很久,终于想出来了,非常抽象。经过一番无脑推导,我们发现u里面有没有军营,是否与根连通,u的子树有没有军营,……都对方案数有影响,然后我就一直修修改改,事实证明,当发现越来越多题目条件中被忽略的细节时,一定不要嫌麻烦,要从头开始设置状态。首先我们发现,子树中有没有军营对于......
  • 比赛抽签分组系统
    比赛抽签分组系统(项目回顾总结)1.滚动列表部分前言是什么让我选择了搞纯粹的前端?最主要的原因是,业务需求简单!当时知道的是,做双栏滚动列表。就一个页面而已。最重要的原因是,关于分组数据的算法,我发现确实可以通过前端实现,就是只需要map存起来就行了。我学到的教训在没有......
  • 「比赛游记」初赛简记
    「比赛游记」初赛简记J计算机常识两个,一个操作系统一个忘了,比较好。大家都在讨论哈夫曼编码?手算了一下应该选A啊。wkh说选B,那就选B吧,我不会。早上指导xrlong使用DP数数,虽然他似乎没太听但是压中题了,比较厉害。没有栈。又出锅是吧,我丢的30min这一块谁给我补啊?阅......
  • P8868 [NOIP2022] 比赛
    https://www.luogu.com.cn/problem/P8868我学会了历史和!在一阵扫描线过后,你会发现,\([l,r]\)的所有子区间的答案,就一定是扫到\(i\)的时候,加上\([k,i]\)的答案,\(k\lei,i\in[l,r]\),然后又因为只有当\(i\gel\)的时候,才能对左端点在\([l,r]\)的答案贡献,因此,你会发现这个东......
  • 暑假集训Day19 比赛题解
    2023-08-0516:22:13总结这次打下来,由于T2贪心不够完全,T3模拟\(5\)个时不是最优,T4想到暴力做法但是来不及打,加之全都是捆绑测试点,导致我T2,T3虽然加起来有不少点对了,但是还是判全错,最后也只剩下T1的100。感觉这次前三题也不难,都是可做的,T4的30pts暴力也很白给,但......
  • 通过凯利指数——分析足球比赛的胜平负
    ......