首页 > 其他分享 >LGR-171

LGR-171

时间:2024-01-14 19:55:21浏览次数:18  
标签:int 翻转 tp 极差 LGR 移动 171 size

2024 首个 AK 的比赛,祭。

Water

分析

注意到答案一定是 \(b\) 的倍数,那么究竟是多少倍呢?如果 \(\lfloor\frac{a}{b}\rfloor<n\) 那么可以达到的就是比 \(a\) 小的最大 \(b\) 的倍数,否则是 \(n\times b\)。

Line

分析

注意到本题答案 \(ans \in\{0,1,2\}\),且如果 \(x_c\in\{x_a,x_b\}\),把 \(CD\) 向上平移就可以相交,平移 \(AB\) 同理。

如果两个条件,即 \(x_c\in\{x_a,x_b\}\) 与 \(y_a\in\{y_c,y_d\}\),都成立,两线段相交,答案为 \(0\)。

假如都不成立,需要移动两次,直到两条线段都过同一个点。

代码就不放了。

Reverse and Rotate

分析

2024 第一场 AK 的比赛,祭。

不难发现一点,不管如何操作,最终得到的串一定可以表示为原串翻转或不翻转后向右移动若干位。考虑维护是否翻转,与最后移动多少位。

是否翻转直接用 rev 的数量统计。移动的位数也好分析,我们提出以下几个结论:

  • 向右移动 \(m\) 位相当于向右移动 \(m \bmod |S|\) 位。
  • 向左移动 \(m\) 位(\(0\le m\le |S|\))相当于向右移动 \(m-|S|\) 位。
  • 翻转后向右移动 \(m\) 位相当于向左移动 \(m\) 位再翻转。

前两个非常好证,至于最后一个,我们考虑把 \(S\) 扩展为一个无限长的串,以 abcde 为例,那么把它看成串 ...abcdeabcdeabcde... 中间的 \(5\) 个字母,如果你翻转后再向右移动 \(m\) 位,其实你从背面(感性理解一下)看就是向左移动了 \(m\) 位,从背面看本质上是翻转操作,因此结论 \(3\) 是成立的。

那么这就非常好办了,引入变量 \(p\) 表示向右移动多少位,遇到 rev 就 \(p\leftarrow |S|-p\),否则按照结论 \(1,2\) 的来做。

AC Code

#include <bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	int n,flag=0,p=0;
	cin>>s>>n;
	while(n--)
	{
		string opt;
		cin>>opt;
		if(opt=="rev") flag^=1,p=s.size()-p;
		else if(opt=="<")
		{
			int m;
			cin>>m;
			m%=s.size();
			p+=s.size()-m;
			p%=s.size();
		}
		else
		{
			int m;
			cin>>m;
			m%=s.size();
			p+=m;
			p%=s.size();
		}
	}
	if(flag) for(int i=0;i<s.size()/2;i++) swap(s[i],s[s.size()-1-i]);
	if(!p) cout<<s;
	else
	cout<<s.substr(s.size()-p,p)+s.substr(0,s.size()-p);
	return 0;
} 

Choose

分析

2024 第一场 AK 的比赛,祭。

我们首先很容易发现一点,当子段长度为 \(L_0\) 时,必定不比长度小于 \(L_0\) 时的最小极差小,因此如果我们想最大化这个最小极差 \(X\),我们需要找到最大子段长度 \(L_0\),由于有子段数量限制 \(k\),因此 \(L_0=n+1-k\)。所以,取每一个长度为 \(L_0\) 的子段的极差的最小值,就是我们要求的最大 \(X\)。实现的话,可以使用 \(O(1)\) 查询的 ST 表。

下一步考虑如何求 \(L\)。由于求的是最小的 \(L\),且没有什么好的线性求法(至少我没想到),所以应该是二分。二分(不加 check)的复杂度为 \(O(\log n)\)(最大的长度仅有 \(L_0=n+1-k\)),因此 \(O(n)\) 的 check 是可以的。枚举所有长为 \(L\) 的子段,判断是否有 \(k\) 个子段的极差大于等于 \(X\) 即可。

赛时代码比较乱,加点注释。

AC Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
int lg[100010],st[100010][22],st2[100010][22],n,k,x;
int check(int len,int jc)
{
	int tp=0;
	for(int i=1;i+len-1<=n;i++)
	{
		if(max(st[i][lg[len]],st[i+len-1-(1<<lg[len])+1][lg[len]])-min(st2[i][lg[len]],st2[i+len-1-(1<<lg[len])+1][lg[len]])>=jc) tp++;
        	//ST表求出最大值减去最小值,tp是极差大于X的子段数量
	}
	if(tp>=k) return 1;
	return 0;
}
void solve()
{
	mp.clear();
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>st[i][0],st2[i][0]=st[i][0];
	for(int j=1;j<=21;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
			st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
	for(int j=1;j<=21;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
			st2[i][j]=min(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);
        //ST表预处理
	x=2e9;
	for(int i=1;i<=k;i++) x=min(x,max(st[i][lg[n-k+1]],st[i+n-k-(1<<lg[n-k+1])+1][lg[n-k+1]])-min(st2[i][lg[n-k+1]],st2[i+n-k-(1<<lg[n-k+1])+1][lg[n-k+1]]));
    	//X为每个长度为L0=n-k+1的子段的极差最小值
	cout<<x<<' ';
	int l=1,r=n+1-k,mid;
	while(l<r)
	{
		mid=(l+r)>>1;
		if(check(mid,x))
		{
			r=mid;
		}
		else l=mid+1;
	}//二分
	cout<<l<<endl;
}
signed main()
{
	lg[1]=0;lg[2]=1;
	for(int i=3;i<=1e5;i++) lg[i]=lg[i/2]+1;
    	//ST表预处理
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
}

标签:int,翻转,tp,极差,LGR,移动,171,size
From: https://www.cnblogs.com/Crazyouth/p/17964096

相关文章

  • 【LGR-170-Div.3】洛谷基础赛 #6 & Cfz Round 3 & Caféforces #2
    这套题感觉质量很高A.Battle\[x\equivr(\bmodP)\]\[P\midx-r\]因此只有第一次操作是有效的voidsolve(){ intn,m,p; cin>>n>>m>>p; m-=m%p; if(!m)puts("Alice"); else{ n-=n%p; if(!n)puts("Bob"); else......
  • openGauss学习笔记-171 openGauss 数据库运维-备份与恢复-导入数据-深层复制
    openGauss学习笔记-171openGauss数据库运维-备份与恢复-导入数据-深层复制171.1使用CREATETABLE执行深层复制该方法使用CREATETABLE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。在创建新表时,可以指定表以及列属性,比如主键。171.1.1操作......
  • dept emp bonus SALGRADE salgrade
    CREATETABLEDEPT(DEPTNONUMBER(2)CONSTRAINTPK_DEPTPRIMARYKEY, DNAMEVARCHAR2(14), LOCVARCHAR2(13));DROPTABLEEMP;CREATETABLEEMP(EMPNONUMBER(4)CONSTRAINTPK_EMPPRIMARYKEY, ENAMEVARCHAR2(10), JOBVARCHAR2(9), MGRNUMBER(4), H......
  • dgl AttributeError: Can't get attribute 'DGLGraph' on <module 'dgl.heterograp
    由于服务器重装了系统,因此cuda版本和ubuntu系统版本也换了,不得不重装系统,导致以前可以正常运行的代码出了各种故障(注:现在的ubuntu版本是18.04,cuda版本是11.3)AttributeError:Can'tgetattribute'DGLGraph'on<module'dgl.heterograph'from'/home/user/anaconda3/envs/mymod......
  • 【LGR-168-Div.4】洛谷入门赛 #18
    打表过样例题目描述很不幸,你遇到了不负责任的出题人。在某道试题里,共有\(N\)个测试点,组成了\(k\)个Subtask,第\(i\)个Subtask包含\(p_i\)个测试点,第\(j\)个测试点的编号为\(w_{i,j}\)。请注意,一个测试点可能属于多个Subtask。Subtask每个Subtask包含多个测......
  • SP1716 GSS3 - Can you answer these queries III 题解
    题意:给定一个长度为$n$的序列$a$,$q$次操作,每次操作为以下之一:\(0\)\(x\)\(y\):将\(a_x\)修改为\(y\)\(1\)\(l\)\(r\):询问区间\([l,r]\)的最大连续子序列和思路:考虑线段树维护区间最大连续子序列和:线段树每个节点需要维护的信息:区间左端点$l$,区......
  • [Codeforces] CF1717C Madoka and Formal Statement
    时间限制\(1s\)|空间限制\(250M\)题目大意题目描述给定一个数列\(a_{1…n}\),如果满足下面条件,你可以使\(a_i=a_i+1\):\(i<n\)且\(a_i\leqa_{i+1}\)\(i=n\)且\(a_i\leqa_{1}\)再给定一个数列\(b_{1…n}\),问\(a\)是否可以通过上述操作变......
  • [Codeforces] CF1714E Add Modulo 10
    题目传送门代码一遍AC真的很爽,样例都是一遍过题意每个测试点含多组测试数据。对于每组测试数据第1行一个整数\(n\),表示该数据个数第2行\(n\)个整数,你需要判断是否符合题意的数据对每组数据,你可以对其作若干次(可以为零)如下操作:选取数据中的一个数\(a_i\)将其替换......
  • [Codeforces] CF1719C Fighting Tournament
    题目传送门另:多测不清空,WA两行泪题意Burenka正准备去观看一年中最有趣的体育活动——她朋友Tonya组织的格斗锦标赛。有n名运动员参加了大赛,标号分别为为1,2,...,n。第i名运动员的实力是\(a_i(1\lea_i\len)\)。每个运动员的实力是不同的,也就是说,数组a是n的一种......
  • HTB Pilgrimage
     nmap扫一下发现80和22端口开放。 改hosts文件访问域名pilgrimage.htb 直接就是一个文件上传,尝试有没有文件上传漏洞。发现无论任何类型的文件,会将所有文件重命名并加上png或jpg后缀,但从从文件上传这个点突破是有点困难的。尝试其他的方法,扫一下这个网站,看看有没有敏感......