首页 > 其他分享 >P6638 「JYLOI Round 1」常规 题解

P6638 「JYLOI Round 1」常规 题解

时间:2024-09-06 20:36:07浏览次数:1  
标签:P6638 JYLOI limits 题解 bmod pos sum ans ll

题目传送门

前置知识

可持久化线段树 | 前缀和 & 差分

解法

进行差分,区间查询转化成前缀和相减。

先将 \(\{ a \}\) 升序排序。

设当前询问的区间为 \([1,r]\),在 \(\{ a \}\) 中找到一个最大的 \(pos\) 使得 \(a_{pos} \le r\),则 \([1,r]\) 中所做常规的次数为 \(\sum\limits_{i=1}^{pos}\left\lfloor \dfrac{r-a_{i}}{k} \right\rfloor\)。

考虑拆开向下取整,有 \(\begin{aligned} &\sum\limits_{i=1}^{pos}\left\lfloor \dfrac{r-a_{i}}{k} \right\rfloor \\ &=\sum\limits_{i=1}^{pos} \dfrac{r-a_{i}-(r-a_{i}) \bmod k}{k} \\ &=\dfrac{1}{k} \times \sum\limits_{i=1}^{pos}r-a_{i}-(r-a_{i}) \bmod k \\ &=\dfrac{1}{k} \times (r \times pos-\sum\limits_{i=1}^{pos}a_{i}-\sum\limits_{i=1}^{pos}(r-a_{i}) \bmod k) \end{aligned}\)。

难点在于怎么求 \(\sum\limits_{i=1}^{pos}(r-a_{i}) \bmod k\)。考虑按照取模运算的性质拆开并适当补上 \(+k\),有 \(\begin{aligned} (r-a_{i}) \bmod k=r \bmod k-a_{i} \bmod k+[r \bmod k<a_{i} \bmod k] \times k \end{aligned}\)。

以 \(a_{i} \bmod k\) 为权值建立一棵主席树然后主席树上查询 \([1,pos]\) 内满足 \(a_{i} \bmod k \in (r \bmod k,k)\) 即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
ll a[100010],sum1[100010],sum2[100010];
struct PDS_SMT
{
	ll root[100010],rt_sum=0;
	struct SegmentTree
	{
		ll ls,rs,sum;
	}tree[100010<<5];
	#define lson(rt) tree[rt].ls
	#define rson(rt) tree[rt].rs
	ll build_rt()
	{
		rt_sum++;
		return rt_sum;
	}
	void update(ll pre,ll &rt,ll l,ll r,ll pos)
	{
		rt=build_rt();
		tree[rt]=tree[pre];
		tree[rt].sum++;
		if(l==r)
		{
			return;
		}
		ll mid=(l+r)/2;
		if(pos<=mid)
		{
			update(lson(pre),lson(rt),l,mid,pos);
		}
		else
		{
			update(rson(pre),rson(rt),mid+1,r,pos);
		}
	}
	ll query(ll rt,ll l,ll r,ll x,ll y)
	{
		if(x<=l&&r<=y)
		{
			return tree[rt].sum;
		}
		ll mid=(l+r)/2,ans=0;
		if(x<=mid)
		{
			ans+=query(lson(rt),l,mid,x,y);
		}
		if(y>mid)
		{
			ans+=query(rson(rt),mid+1,r,x,y);
		}
		return ans;
	}
}T;
ll ask(ll r,ll n,ll k)
{
	ll ans=0,pos=upper_bound(a+1,a+1+n,r)-a-1;
	ans+=r*pos;
	ans-=sum1[pos];
	ans-=(r%k)*pos;
	ans+=sum2[pos];
	ans-=T.query(T.root[pos],0,k-1,r%k+1,k-1)*k;
	return ans/k;
}
int main()
{
	ll type,n,m,k,mod,l,r,ans=0,i;
	cin>>type>>n>>m>>k;
	if(type==1)
	{
		cin>>mod;
	}
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	for(i=1;i<=n;i++)
	{
		sum1[i]=sum1[i-1]+a[i];
		sum2[i]=sum2[i-1]+a[i]%k;
		T.update(T.root[i-1],T.root[i],0,k-1,a[i]%k);
	}
	cin>>l>>r;
	ans=ask(r,n,k)-ask(l-1,n,k);
	cout<<ans<<endl;
	for(i=2;i<=m;i++)
	{
		cin>>l>>r;
		if(type==1)
		{
			l=(l+ans-1)%mod+1;
			r=(r+ans-1)%mod+1;
			if(l>r)
			{
				swap(l,r);
			}
		}
		ans=ask(r,n,k)-ask(l-1,n,k);
		cout<<ans<<endl;
	}
	return 0;
}

标签:P6638,JYLOI,limits,题解,bmod,pos,sum,ans,ll
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18400955

相关文章

  • 使用flask进行Mock Server模拟接口操作及问题解决
    1.flask介绍flask是一个轻量级的pythonweb微框架2.MockServer介绍MockServer是一个开源的模拟服务器,它可以定义和记录API交互,支持各种http方法(get、post、put、delete),可以自定义响应内容,例如返回静态文件可以使用flask来搭建一个mock模拟服务3.模拟接口先安装flaskpip......
  • P1928 外星密码题解
    初看这题时,感觉就是一个简简单单的递归,便有了以下代码:#include <bits/stdc++.h>using namespace std;string re(){    string s="",s1="";    char c;    int n;    while(cin>>c){        if(c=='['){            cin>>n;......
  • AT_keyence2019_e Connecting Cities 题解
    B算法萌萌题。题解看到完全图求最小生成树,必然是要考虑一下B算法能不能做的。发现这个题的联通块最小值是可以维护的。我们发现。假如我们钦定\(i\)往前面连。那么前面的最小权值必然是一个固定的值。我们一定会连到\(\min(a_j-j\timesD)\)上。由于不能连到自己......
  • AT_aising2019_e Attack to a Tree 题解
    挺有意思的树型dp。思路发现直接求解很难对限制下手。但我们可以注意到答案最多为\(n\)。考虑将答案记录dp状态。我们可以记\(dp_{i,j}\)为子树\(i\)合法并且断了\(j\)条边的状态。由于合法状态有两种,并且不好一起考虑,所以可以再在dp状态中加一维。令\(dp_{i,......
  • P8139 [ICPC2020 WF] Sweep Stakes 题解
    思路容易发现,题目要求我们动态维护这样一个多项式。\[\prod_{i}(1-p_i+p_ix)\]如何维护。由于精度问题,我们很难去进行一个多项式除法将其暴力求出。考虑\(p_i\le0.2\)。可以得知,我们的多项式的数的增减是比较大的。那么在一定数量后,一些可能有值的系数在当前精度下是可以......
  • ORCLE数据库语言设置原因查询不出数据的问题解决
    问题现象:oracle数据库视图中存在数据,但是jdbc查询视图查询不出来,后发现视图中有根据默认语言的过滤,如下图: 客户端查询环境语言为 web服务器查询环境语言为US,所以数据查询不出来。解决方案:修改应用端的NLS_LANG的配置与SQL保持一致linux执行下面代码exportNLS_LANG="......
  • CF1469D Ceil Divisions题解
    CF1469DCeilDivisions感觉是很巧妙的一题?一开始想到,对于任何小于$n$的数$x$,直接对它除以$n$可以得到$1$。那么对$3\simn-1$做完此操作后,还剩下$1$、$2$、$n$。将$n$变成$1$要花费$logn$次,显然总操作次数超过了$n+5$次。进一步地,发现瓶颈在于把$n$变成$1$,于是利用根号,用$\sqr......
  • 9.6 上午 becoder 模拟赛总结&题解
    T1语言水题不多说,很容易发现NP需要满足的只是最后一个单词为N,前面是A或N都可以随意放。所以用两个数组,\(v1_i\)记录以\(i\)结尾的前缀是否可以构成NP,\(v2_i\)记录以\(i\)为开头的后缀是否可以构成NP。最后for循环扫一遍是否有同时满足\(v1_{i-1}=true\)和......
  • CF381B题解
    我们先理解题意,大致意思是:给你一个序列让你组成一个中间有一个数,左侧递增右侧递减的数列。从这道题的题意来看,大概思路是:1.我们要将最大值设为中间的数,然后左右两端尽可能的小。2.跑两遍循环,分别为左边的递增边的递减。3.还有,因为一个数可以出现很多次,我们需要一个vis......
  • 2024 年高教社杯全国大学生数学建模竞赛B题解题思路(第一版)
    原文链接:https://www.cnblogs.com/qimoxuan/articles/18399372赛题:问题1:抽样检测方案设计分析:抽样检测方案需要在保证决策准确性的同时,尽量减少检测成本。需要考虑抽样误差对决策的影响,以及如何设置抽样大小和接受/拒绝标准。解题思路:1.确定抽样方法:采用属性抽样,......