首页 > 其他分享 >P4425 HNOI/AHOI2018 转盘

P4425 HNOI/AHOI2018 转盘

时间:2023-09-25 10:44:26浏览次数:34  
标签:typedef le limits AHOI2018 int HNOI op P4425 define

Day 21。

容易发现最优解里一定存在一种方案,为「一开始停留一段时间,然后一直往下一个取」的形式。通过调整容易证明。

断环成链,直接列出式子:

\[\text{ans}=\min\limits_{n\le i<2n}\max\limits_{i-n< j\le i}a_j-j+i \]

令 \(t_i=a_i-i(1\le i\le 2n)\),然后让 \(i\) 平移 \(n-1\) 位,化简后得:

\[\text{ans}=(n-1)+\min\limits_{1\le i\le n}\left(i+\max\limits_{i\le j\le 2n}a_j\right) \]

相当于对每个 \(i\),求出其后缀最大值 \(a_j\)。反过来,考虑每个 \(j\),其作为 \(i\) 的后缀最大值最小的 \(i\)。那么要求的就是 \(j\) 前面第一个满足 \(a_i>a_j\) 的 \(i+1\),可以单调栈解决。

现在有了修改,直接线段树维护单调栈(楼房重建线段树)即可。

复杂度 \(O((n+m)\log^2 n)\)。

// Problem: #2495. 「AHOI / HNOI2018」转盘
// Contest: LibreOJ
// URL: https://loj.ac/p/2495
// 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

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

const int N = 1e5 + 100;
const int inf = 0x3f3f3f3f;

int n, m, op, a[N << 1];
int mx[N << 3], tr[N << 3];

#define ls x << 1
#define rs x << 1 | 1
#define mid ((l + r) >> 1)

int qry(int l, int r, int c, int x) {
	if (l == r) return mx[x] <= c ? inf : c + l + 1;
	if (mx[rs] < c) return qry(l, mid, c, ls);
	return min(tr[x], qry(mid + 1, r, c, rs));
}

void pup(int l, int r, int x) {
	mx[x] = max(mx[ls], mx[rs]);
	tr[x] = qry(l, mid, mx[rs], ls);
}

void upd(int l, int r, int p, int c, int x) {
	if (l == r) return mx[x] = c, void();
	if (p <= mid) upd(l, mid, p, c, ls);
	else upd(mid + 1, r, p, c, rs);
	pup(l, r, x);
}

void solve() {
	cin >> n >> m >> op;
	for (int i = 1; i <= n; i++) 
		cin >> a[i], a[i + n] = a[i];
	for (int i = 1; i <= (n << 1); i++)
		upd(1, n << 1, i, a[i] - i, 1);
	int lst = 0;
	cout << (lst = min(1 + mx[1], tr[1]) + n - 1) << '\n';
	while (m--) {
		int x, y; cin >> x >> y;
		x ^= op * lst, y ^= op * lst;
		upd(1, n << 1, x, y - x, 1), upd(1, n << 1, x + n, y - n - x, 1);
		cout << (lst = min(1 + mx[1], tr[1]) + n - 1) << '\n';
	}
}

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

标签:typedef,le,limits,AHOI2018,int,HNOI,op,P4425,define
From: https://www.cnblogs.com/Ender32k/p/17727395.html

相关文章

  • P3200 [HNOI2009] 有趣的数列
    原题这题我\(O(n^2)\)的做法竟然没有想出来,反思QwQ首先\(O(n^2)\)的做法很好想,我们考虑从小到大往数组里填数,显然我们要求任何时刻编号为奇数的位置要填的比编号为偶数的位置要不少才行于是我们设\(dp_{i,j,k}\)表示填了前\(i\)个数,奇数位填的个数为\(j\),偶数位填的个数为\(k\)......
  • P3214 [HNOI2011] 卡农
    原题首先我们先简化一下题意。为什么呢?因为这个题如果不简化题意是不太好做的我们考虑用二进制表示集合,这样题意为:有\(2^n-1\)个数,我们要从中选一个大小为\(m\)的无序子集,满足以下条件:集合中所有数的异或和为\(0\)集合中元素不可重复首先无序子集是吓人的,因为我们可......
  • P3201 [HNOI2009] 梦幻布丁 启发式合并,时间复杂度
    [HNOI2009]梦幻布丁一种很暴力,很容易想到,但时间复杂度不对的做法:既然每一次修改是以颜色作为单位的,那就用set或者链表(vector)维护每一个颜色出现的位置。将颜色\(x\)改为\(y\)的时候,遍历\(list_x\)的每一个点,判断其左右是否为\(y\),更新ans(不同颜色块数量)时间复杂度最大为......
  • P4729 [HNOI2009] 积木游戏
    P4729[HNOI2009]积木游戏Solution2023.09.06。八个月前做这个题调了六个小时。现在看来,除开欧拉定理的部分,整道题的思路极其清晰易懂,虽然码量大,但并不难码。尽管如此,融合了数据结构、图论(模型构建+三元环计数)、拓扑论(欧拉定理)多方面知识点,而且还有四面共角的细节问题,它仍然......
  • P6604 [HNOI2016] 序列 加强版
    链接:P6604[HNOI2016]序列加强版首先,像这种题可以转化为计算贡献,即计算每一个元素成为最小值的次数。这个次数怎么求呢?显然单调栈模板,对于每一个数计算左边和右边第一个比它小的数\(l[i]\)和\(r[i]\)。CODE1:for(inti=1;i<=n;i++){ while(k&&a[i]<a[sta[k]]){ k--; ......
  • 例题两则(不无聊的子序列,HNOI2016序列)
    分享例题两则主要是分享一种\(\text{trick}\)。\(\text{UVA1608}\)题目描述给定一个长度为\(n\)的序列\(a\),如果\(a\)的每一个子串都存在至少一个元素只出现了一次,输出\(\text{Non-boring}\)。反之,输出\(\text{Boring}\)。\(n\leqslant2\times10^5\)。思路点......
  • [刷题笔记] Luogu P2285 [HNOI2004] 打鼹鼠
    ProblemAnalysis我们初始可以任意决定机器人的位置,状态很多,暴力显然会寄掉。不妨先贪心的思考一下。我们肯定希望机器人初始在最先出现鼹鼠的洞,因为出现在没有鼹鼠的洞是无效的。题目保证输入数据是严格按照出现时间递增顺序给出。定义\(f_i\)表示前\(i\)只鼹鼠最多能打到......
  • [DS记录] P3203 [HNOI2010] 弹飞绵羊
    (题目传送门)虽然是\(\rmLCT\)板子,但用来做分块入门如果没有修改操作,可以\(O(n)\)求出每个点的答案对于每个块里的点,预处理出它跳出这个块的步数,那么查询时就可以\(O(1)\)跳过这些块,查询的复杂度\(O(\sqrt{n})\)修改一个点时,也就是\(O(B)\)暴力修改即可令\(B=\sqrt{......
  • P4426 [HNOI/AHOI2018] 毒瘤 题解
    P4426[HNOI/AHOI2018]毒瘤题解非常好虚树题目,融合了容斥的内容。简化题意给定一张\(n\)个点、\(m\)条边的图,求图的独立集个数。其中\(n\leq10^5\),\(n-1\leqm\leqn+10\)。独立集:对于图\(G(U,E)\)的一个点集\(S\),\(\forall(u,v)\inE\),不存在\(u\inS\)且......
  • 洛谷 P3243 [HNOI2015] 菜肴制作 - toposort 需自己理解翻译题面
    P3243[HNOI2015]菜肴制作题目描述知名美食家小A被邀请至ATM大酒店,为其品评菜肴。ATM酒店为小A准备了\(n\)道菜肴,酒店按照为菜肴预估的质量从高到低给予\(1\)到\(n\)的顺序编号,预估质量最高的菜肴编号为\(1\)。由于菜肴之间口味搭配的问题,某些菜肴必须在另一些......