首页 > 其他分享 >暑假集训CSP提高模拟3

暑假集训CSP提高模拟3

时间:2024-07-20 19:39:57浏览次数:12  
标签:ll limits min bmod sum 集训 暑假 ans CSP

暑假集训CSP提高模拟3

\(T1\) P117. abc猜想 \(100pts\)

  • 原题: [ARC111A] Simple Math 2

  • 由题,有 \(\dfrac{(a^{b}-a^{b} \bmod c) \bmod c^{2}}{c}\) 即为所求。

    • 证明
      • 设 \(\left\lfloor \dfrac{a^{b}}{c} \right\rfloor= \dfrac{a^{b}-a^{b} \bmod c}{c}=kc+r\) ,其中 \(r \in [0,c)\) 。
      • 移项有 \(a^{b}-a^{b} \bmod c=kc^{2}+rc\) ,且 \(rc \in [0,c^{2})\) 。
      • 将 \(rc\) 试作 \(a^{b}-a^{b} \bmod c\) 除以 \(kc^{2}\) 的余数,即 \(rc=(a^{b}-a^{b} \bmod c) \bmod c^{2}\) 。
      • 将系数 \(c\) 移项,有 \(r=\dfrac{(a^{b}-a^{b} \bmod c) \bmod c^{2}}{c}\) 。
    点击查看代码
    ll qpow(ll a,ll b,ll p)
    {
    	ll ans=1;
    	while(b)
    	{
    		if(b&1)
    		{
    			ans=ans*a%p;
    		}
    		b>>=1;
    		a=a*a%p;
    	}
    	return ans;
    }
    int main()
    {
    	ll a,b,c,ans,r;
    	scanf("%lld%lld%lld",&a,&b,&c);
    	r=qpow(a,b,c);
    	ans=(qpow(a,b,c*c)-r+c*c)%(c*c)/c;
    	printf("%lld\n",ans);
    	return 0;
    }
    

\(T2\) T118. 简单的排列最优化题 \(0pts\)

  • 原题: CF819B Mister B and PR Shifts

  • 等价于求 \(\min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}|a_{i}-(i+k)|+ \sum\limits_{i=n-k+1}^{n}|a_{i}-(i-(n-k))| \}\) 。

  • 部分分

    • \(45pts\) :暴力 \(O(n^{2})\) 枚举所有的 \(k,i\) 并进行判断,及时进行剪枝来减小常数。
  • 正解

    • [ABC351F] Double Sum 的套路,尝试展开绝对值及 \(\min,\max\) 。
    • 将式子拆开有 \(\begin{aligned} & \min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}|a_{i}-(i+k)|+ \sum\limits_{i=n-k+1}^{n}|a_{i}-(i-(n-k))| \} \\ &=\min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}( \max(a_{i},i+k)- \min(a_{i},i+k))+ \sum\limits_{i=n-k+1}^{n}( \max(a_{i},i+k-n)- \min(a_{i},i+k-n)) \} \\ &=\min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}(a_{i}+i+k-2 \min(a_{i},i+k))+ \sum\limits_{i=n-k+1}^{n}(a_{i}+i+k-n-2 \min(a_{i},i+k-n)) \} \\ &=\sum\limits_{i=1}^{n}(a_{i}+i)+\min\limits_{k=0}^{n-1}\{- \sum\limits_{i=1}^{n-k}2 \min(a_{i},i+k)- \sum\limits_{i=n-k+1}^{n}2 \min(a_{i},i+k-n) \} \\ &=\sum\limits_{i=1}^{n}(a_{i}+i)-2 \max\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k} \min(a_{i},i+k)+\sum\limits_{i=n-k+1}^{n} \min(a_{i},i+k-n) \} \end{aligned}\) 。
      • 好像式子推多了,懒得改了,只是常数大点。
    • 现在问题来到了怎么求 \(\max\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k} \min(a_{i},i+k)+\sum\limits_{i=n-k+1}^{n} \min(a_{i},i+k-n) \}\) 。
    • 令 \(\begin{cases} x_{i}=a_{i}-i \\ y_{i}=a_{i}+n-i \end{cases}\) ,由于是排列所以 \(\{ x \},\{ y \}\) 均满足内部两两不同,则转化为求 \(\max\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k}([k \ge x_{i}] \times a_{i}+[k<x_{i}] \times (i+k))+\sum\limits_{i=n-k+1}^{n}([k \ge y_{i}] \times a_{i}+ [k<y_{i}] \times (i+k-n)) \}\) ,前半部分将其拆成 \(\begin{cases} [k \ge x_{i}] \times a_{i} \\ [k<x_{i}] \times i \\ [k<x_{i}] \times k \end{cases}\) 三部分,后半部分同理。
    • 将 \(\{ x \},\{ y \}\) 分别插入到权值树状数组里,分别维护 \(\begin{cases} [k \ge x_{i}] \times a_{i}/[k \ge y_{i}] \times a_{i} \\ [k<x_{i}] \times i/[k<y_{i}] \times (i-n) \\ [k<x_{i}]/[k<y_{i}] \end{cases}\) 即可,注意及时消除影响。
    • 对于负数整体向右移来处理。
    点击查看代码
    ll a[3000010],x[3000010],y[3000010],c[6][3000010];
    ll lowbit(ll x)
    {
    	return (x&(-x));
    }
    void add(ll n,ll x,ll val,ll c[])
    {
    	x+=1000001;
    	n+=1000001;
    	for(ll i=x;i<=n;i+=lowbit(i))
    	{
    		c[i]+=val;
    	}
    }
    ll ask(ll x,ll c[])
    {
    	ll ans=0;
    	x+=1000001;
    	for(ll i=x;i>=1;i-=lowbit(i))
    	{
    		ans+=c[i];
    	}
    	return ans;
    }
    int main()
    {
    	ll n,ans=0,pos=0,sum=0,i,k;
    	scanf("%lld",&n);
    	for(i=1;i<=n;i++)
    	{
    		scanf("%lld",&a[i]);
    		x[i]=a[i]-i;
    		y[i]=a[i]+n-i;
    		add(2*n,x[i],a[i],c[0]);
    		add(2*n,x[i],i,c[2]);
    		add(2*n,x[i],1,c[4]);  
    	}
    	for(k=0;k<=n-1;k++)
    	{
    		sum=0;
    		sum+=ask(k,c[0]);
    		sum+=ask(2*n,c[2])-ask(k,c[2]);
    		sum+=(ask(2*n,c[4])-ask(k,c[4]))*k;
    		sum+=ask(k,c[1]);
    		sum+=ask(2*n,c[3])-ask(k,c[3]);
    		sum+=(ask(2*n,c[5])-ask(k,c[5]))*k;
    		if(sum>ans)
    		{
    			ans=sum;
    			pos=k;
    		}
    		add(2*n,x[n-k],-a[n-k],c[0]);
    		add(2*n,x[n-k],-(n-k),c[2]);
    		add(2*n,x[n-k],-1,c[4]);
    		add(2*n,y[n-k],a[n-k],c[1]);
    		add(2*n,y[n-k],n-k-n,c[3]);
    		add(2*n,y[n-k],1,c[5]);
    	}
    	ans*=-2;
    	for(i=1;i<=n;i++)
    	{
    		ans+=a[i]+i;
    	}
    	printf("%lld %lld\n",pos,ans);
    	return 0;
    }
    

\(T3\) P119. 简单的线性做法题 \(5pts\)

  • 原题: luogu P4062 [Code+#1] Yazid 的新生舞会

  • 部分分

    • \(1\) :输出样例 \(1\)
    • \(2 \sim 4\) :分块/莫队/主席树处理出所有区间的众数出现次数,依次判断。
  • 正解

    点击查看代码
    
    

\(T4\) P120. 简单的线段树题 \(100pts\)

总结

  • \(T2\)
    • 处理 \(k\) 与 \(\{ x \},\{ y \}\) 时将两者搞反了,说明对权值树状数组的认识仍不够。
    • 赛时式子推多了。
    • 空间开大加上不会算空间,挂了 \(100pts\) 。

后记

  • \(T2\) 下发文件里的大样例造假了,中途才换,导致写的暴力对着假数据拍了半天没拍出来。
  • \(T3\) 下发文件里的大样例造假了,中途才换,还换了两次。最后发现贺的 \(std\) 造的数据假了(换大样例时顺带换了数据),结果发现第一组数据是真的。

标签:ll,limits,min,bmod,sum,集训,暑假,ans,CSP
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18313664

相关文章

  • 集训第二天
    ABCD HI题A-闰年展示Description输入x,y,输出[x,y] 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。Input输入两个正整数 ......
  • 2024 暑假友谊赛 2
    B.TilingChallenge1.我的方法是按顺序遍历,遇到'.'时就检查一下它的上下左右是不是都是点,如果都是点的话,标记这个点,把这个点和他上下左右都标记为‘?’,但是要加一个条件,如果‘.’的个数不是5的倍数就不符合题意,不加这个会wa37,我也不知道为什么#include<bits/stdc++.h>#defin......
  • P1407 [国家集训队] 稳定婚姻
    原题链接题解二分图,分为两类,一类是指向,一类是被指向在这里,只需要建立情人之间的边就行,因为找情人能否成功code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;vector<int>G[10000];intmatch[10000]={0};boolvis[10000]={0};booldfs(intnow)//......
  • 暑假集训CSP提高模拟2
    T1看到这时限和内存,连一个数组都开不下,更别说离散化了,考试的时候我用了一个栈来模拟,相同留、进,不同退,可以说是很接近正解了,但还是没继续往下想,也是爆零了。正解的思路很简单,这里引出一个概念,摩尔投票法,适用于超过半数(不能等于)的众数,可以在常数的空间下、\(O(n)\)的时间复杂度下......
  • 2024暑假集训测试6
    前言比赛链接。挂分挂的最多的一集。T1不知道摩尔投票,被2M内存限制卡死。T2赛时打了个很像正解的莫队,赛时出题人发现了之后现往里加hack,还一个捆绑里加一个,直接爆零了,我真的谢了,求求以后不要一个捆绑放一个hack了,给条活路吧。T3一眼看出线段树优化建图,但是不会打......
  • 「模拟赛」暑期集训CSP提高模拟2(7.19)
    学长组题+预告:题会有点难雀氏。。。题目列表A.活动投票B.序列C.LegacyD.DP搬运工1A.活动投票题意:衡中活动很多,人也很多,一次活动有$n$个学生参与投票,现已知一名参赛选手票数超过半数,求其参赛号$ai$​(参赛号随机,$0≤ai≤21474836470≤ai​≤2147483647)$。很......
  • 大一升大二暑假 NJU暑期课程 Linux系统基础(1) 20240720
    一.操作系统操作系统OperatingSystem简称OS,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。操作系统会控制其他程序运行,管理系统资源,提供最基本的计算功能,如管理及配置内存、决定系统资源供需的优先次序等,同时还提供一些基本的服务程序。Q1:什么是文件......
  • 2024/07/19(暑假学习hadoop第二周总结)
    本周的学习任务主要是完成Hadoop中有关的组件的配置。有关于此配置的过程严格按照黑马程序员大数据入门到实战教程,大数据开发必会的Hadoop、Hive,云平台实战项目全套一网打尽_哔哩哔哩_bilibili来进行配置。首先就是HDFS的配置,这是Hadoop分布式文件系统,用于在多个服务器上构建存储......
  • 暑假集训CSP提高模拟2
    暑假集训CSP提高模拟2\(T1\)T2745.活动投票\(30pts\)原题:luoguP2397yyylovesMathsVI(mode)懒得再复制一遍了,直接挂当时的题解得了。点击查看代码intmain(){lln,a,sum=0,ans=-0x7f7f7f7f,i;scanf("%lld",&n);for(i=1;i<=n;i++){......
  • 多校联合暑假训练赛第一场
    B.对数组的最小操作次数Code:#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;intdp[N][8],n,k,a[N];intmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>k;for(inti=1;i......