首页 > 其他分享 >[CF2353D] Refined Product Optimality 题解

[CF2353D] Refined Product Optimality 题解

时间:2025-01-01 21:19:54浏览次数:1  
标签:pii int 题解 rev CF2353D mul Refined first define

首先让我们输出的是不操作的值。不定序,一看就很贪心。经过分类分类分类可证,\(a,b\) 都是升序(降序)的时候是最优的。
再看加操作的。相当于要维护这两个升序序列。我们发现,每次操作影响的值很少,最多两个值。在一个连续段中,修改的值相当于和末尾值交换,再加一。

唐点:
找这个末尾没必要维护一堆下标然后写挂,用个二分足以。反正用了排序,都是带 \(\log\) 的。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int>
#define int long long 
#define all(v) v.begin(), v.end()
using namespace std;

//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)


namespace Traveller {
	const int N = 4e5+2, mod = 998244353;
	void mul(int &a, int b, int p = mod) { a = (a * b % p + p) % p; }
	int qpow(int a, int b, int p = mod) {
		int res = 1;
		a %= p;
		while(b) {
			if(b & 1) mul(res, a, p);
			b >>= 1;
			mul(a, a, p);
		}
		return res;
	} 
	int inv(int a) { return qpow(a, mod-2); }
	
	int n, q;
	pii a[N], b[N];
	int c[N], d[N];
	int rev1[N], rev2[N];
	
	int ans;
	void work(pii *a, pii *b, int *c, int *rev, int x) {
		x = c[x];
		int y = upper_bound(a+1, a+n+1, pii(a[x].first, inf)) - a - 1;
		int p = rev[x], q = rev[y];
		
		//swap
		c[p] = y, c[q] = x;
		rev[x] = q, rev[y] = p;
		swap(x, y);
		
		mul(ans, inv(min(a[x].first, b[x].first)));
		mul(ans, min(++a[x].first, b[x].first));
	}
	
	void main() {
		cin >> n >> q;
		for(int i = 1, x; i <= n; ++i) {
			scanf("%lld", &x);
			a[i] = pii(x, i);
		}
		for(int i = 1, x; i <= n; ++i) {
			scanf("%lld", &x);
			b[i] = pii(x, i);
		}
		sort(a+1, a+n+1);
		sort(b+1, b+n+1);
		for(int i = 1; i <= n; ++i) c[a[i].second] = i, rev1[i] = a[i].second;
		for(int i = 1; i <= n; ++i) d[b[i].second] = i, rev2[i] = b[i].second;
		
		ans = 1;
		for(int i = 1; i <= n; ++i) mul(ans, min(a[i].first, b[i].first));
		printf("%lld ", ans);
		for(int i = 1, opt, x; i <= q; ++i) {
			scanf("%lld%lld", &opt, &x);
			if(opt == 1) work(a, b, c, rev1, x);
			else work(b, a, d, rev2, x);
			printf("%lld ", ans);
		}
		puts("");
	}
}

signed main() {
	#ifdef filename
		FileOperations();
	#endif
	
	int _;
	cin >> _;
	while(_--) Traveller::main();
	return 0;
}


标签:pii,int,题解,rev,CF2353D,mul,Refined,first,define
From: https://www.cnblogs.com/wfc284/p/18646313

相关文章

  • CF848E Days of Floral Colours 题解
    Problem-848E-Codeforces首先,由于整个图是对称的,所以我们将其沿直径分为两半,在算一半答案时把每一段的贡献平方再相加即可。(因为对面也有一段相同长度的也要计入贡献)现在我们的问题转化为了对于一个长为\(n\)的环,你可以给一个点连出一个线头(即在原图中连向对面的边)将其余......
  • Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [
    Paper-cutting:思维很好,但代码很构式的manacher题。蒟蒻2025年切的第一道题,是个紫,并且基本独立想出的,特此纪念。判断能否折叠我们先考虑一部分能折叠需要满足什么条件。显然,这一部分需要是一个长度为偶数的回文串。那么横向和纵向会不会影响呢?答案是不会,因为横向折了之后,折......
  • CF601E A Museum Robbery 题解
    题目传送门前置知识线段树与离线询问解法普通的回退背包无法处理本题中的删除操作,考虑线段树分治后转化为只进行添加的背包。具体实现时可以对每个深度开一个背包的转移数组,时间复杂度为\(O(nk\logq+qk)\),可以接受。代码#include<bits/stdc++.h>usingnamespacestd;#......
  • 洛谷 P11487 「Cfz Round 5」Gnirts 10——题解
    洛谷P11487「CfzRound5」Gnirts10传送锚点摸鱼环节「CfzRound5」Gnirts10题目背景Englishstatement.YoumustsubmityourcodeattheChineseversionofthestatement.InMemoryof\(\text{F}\rule{66.8px}{6.8px}\).题目描述题面还是简单一点好。给定......
  • 题解:AT_abc386_d [ABC386D] Diagonal Separation
    分析题面,发现题目求的是是否存在一个白点被\((1,1)\)和任意一个黑点围成的矩形内。先将所有黑点按\(x\)坐标排序。枚举所有的白点。找到所有横坐标不比该白点横坐标小的所有黑点的纵坐标的最大值所属点。如果该点的纵坐标小于该白点的纵坐标:(蓝点代表题目中的白点,红点......
  • 百丽宫24年春季真题题解——回型字符的打印
    不妨参考之前的一道选做题思路(虽然楼主自己之前也没找到时间做)但当时瞟过一眼题目,个人认为可以一起做,都是你中有我的关系,思路很相似。选做题摘录——晕:看着这样的"回”形图案你晕吗?让我们不用数组,来做出它。输入格式:n。正方形的边长输出格式:"%3d"   边长为n的数字回......
  • 百丽宫22年真题题解——最短路径(排列组合法)
    #include<stdio.h>unsignedlonglonghigh;unsignedlonglonglow;unsignedlonglongfac(intn,intm){unsignedlonglongi,f=1;if(m!=1){for(i=n;i>=n-m+1;i--){f=f*i;}returnf;}elseif(m......
  • 自动推理与规划:让机器具备智能决策与问题解决能力
    随着人工智能技术的不断进步,自动推理与规划(AutomatedReasoningandPlanning)已经成为使机器具备高效决策和问题解决能力的核心技术之一。它涉及如何通过逻辑推理、任务规划和约束求解,使机器能够自主地解决复杂问题、制定行动策略,并在不断变化的环境中做出最优决策。自动推理......
  • 题解:CF727F Polycarp's problems
    link。贪心做法。本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数。如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做。例如当前遍历到了\(50\),此时序列如下:\[\dots,50,-50,-10,-20\]易得我们\(50\)应该抵消的是\(-10,-20\),而不是前面的\(-50\),因为......
  • Web 前端面试指南与高频考题解析
    Web前端面试指南与高频考题解析准备:简历编写和面试前准备一般来说,跳槽找工作要经历投递简历、准备面试、面试和谈offer四个阶段。其中面试题目会因你的等级和职位而异,从入门级到专家级,广度和深度都会有所增加。不过,不管什么级别和职位,面试题目一般都可以分类为理论知识、算法......