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

暑假集训CSP提高模拟8

时间:2024-07-26 21:09:02浏览次数:7  
标签:__ le int long 集训 a2 暑假 ans CSP

一看见题目列表就吓晕了,还好我是体育生,后面忘了

唉这场比赛没啥好写的,要不就是太难要不就是太简单要不就是拉出去写在专题里了

A. 基础的生成函数练习题

考虑到只有奇偶性相同才能尝试加二,因此先用加一调平奇偶性,再直接加而就行了.

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long a,b,c;long long ans=0;
	cin>>a>>b>>c;
	int a2=a&1,b2=b&1,c2=c&1;
	if(a2==c2 and a2==b2);
	else if(a2==c2 and a2!=b2){
		ans++;a++,c++;
	}
	else if(a2==b2 and a2!=c2){
		ans++;a++,b++;
	}
	else if(b2==c2 and a2!=b2){
		ans++;b++,c++;
	}
	ans+=(3ll*max({a,b,c})-a-b-c)/2;
	cout<<ans<<endl;
}

B.简单的拉格朗日反演练习题

我:学长你卡线段树有什么深意吗
学长:没卡线段树,那是你常数写大了

但是线段树把原题过了,详见 这个专题

C.容易的多元拉格朗日反演练习题

记 \(S = \sum_{1\le i\le n} a_i\),\(S_A\) 为 Alice 擦掉的数之和,\(S_B\) 为 Bob 擦掉的数之和。
记一个长为 \(m\) 序列 \(b_i\) 的邻项差分 \(\text{diff }b = (b_2 - b_1) + (b_4 - b_3) + \cdots + (b_m - b_{m-1})\)。

首先转化题意。条件 \(l \le S_A \le r\) 可以通过整体乘 \(2\) 减 \(S\) 转化为 \(2L - S \le S_A - S_B \le 2R - S\)。随后设 \(x = S - (l + r)\),整体加 \(x\) 后变为 \(l - r \le x + S_A - S_B \le r - l\),即 \(|x + S_A - S_B| \le r - l\)。

因此有转化后的问题:
给定整数 \(x\)。两人轮流操作,每次选择一个没有选过的数字 \(a_i\)。在 Alice 的回合,置 \(x=x + a_i\),而在 Bob 的回合置 \(x=x - a_i\)。最终的分数即为 \(x\) 的绝对值。Alice 的目标是最小化这个值,而 Bob 的目标是最大化它。求当两方都采取最优策略情况下的赢家。

不妨假设 \(a_i\) 升序排列。我们断言,最终的分数可以通过如下方式求得:

  • 选择整数 \(p\),将 \(p, p + x, a_1, a_2,\cdots, a_n\) 升序排列得到 \(A_i\)。令 \(p\) 的答案为 \(\text{diff }A\) 的值。
  • 最终的分数即为所有可能的 \(p\) 的答案中的最小值。

容易发现 \(p\) 所有对答案有贡献的取值为 \(p = a_i\)。对于 \(p\) 的某一确定取值可以在 \(O(n)\) 的时间复杂度内计算答案,取其中最小值作为最终分数即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[5001];
vector<int>ans;
signed main(){
	int cases;cin>>cases;while(cases--){
		int l,r;
		cin>>n>>l>>r;
		int sum=0;
		for(int i=1;i<=n;++i){
			cin>>a[i];
			sum+=a[i];
		}
		sum-=l+r;
		sort(a+1,a+n+1);
		int ret=LLONG_MAX,now;
		for(int i=1;i<=n;++i){
			ans.clear();
			now=0;
			for(int j=1;j<=n;++j){
				if(i!=j){
					ans.push_back(a[j]);
				}
			}
			ans.insert(lower_bound(ans.begin(),ans.end(),a[i]+sum),a[i]+sum);
			for(int j=0;j<=(int)ans.size()-1;j+=2){
				now+=ans[j+1]-ans[j];
			}
			ret=min(ret,now);
		}
		cout<<(abs(ret)<=r-l?"Alice":"Bob")<<endl;
	}
} 

D. 朴素的抽象代数题

不是,你们怎么都不打暴力的啊

放一个暴力辅助理解题面吧

#include<bits/stdc++.h>
using namespace std;
unsigned long long l;
class _function{
	private:
		int a[26];
	public:
		int&operator[](int id){
			return a[id];
		}
		inline void equal_func(){
			for(int i=0;i<(int)l;++i){
				a[i]=i;
			}
		}
		_function operator+(_function A){
			_function ans;
			for(int i=0;i<(int)l;++i){
				ans[i]=A[this->operator[](i)];
			}
			return ans;
		}
		void operator+=(_function A){
			*this=*this+A;
		}
		void print(){
			for(int i=0;i<(int)l;++i){
				cout<<a[i]<<" ";
			}
			cout<<endl;
		}
		string func(string x){
			string ans;
			for(char i:x){
				ans.push_back(this->a[i-'a']+'a');
			}
			return ans;
		}
		void operator =(std::vector<int>x){
			for(int i=0;i<=(int)x.size()-1;++i){
				a[i]=x[i];
			}
		}
}fu[3001];
typedef unsigned long long ull;
ull n,m,q,STR_LEN,seed1,seed2,FREQ,MAX_X;
int f[26],LEN;
ull xorShift128Plus(){
    ull k3=seed1,k4=seed2;
    seed1=k4;
    k3^=(k3<<23);
    seed2=k3^k4^(k3>>17)^(k4>>26);
    return seed2+k4;
}
template<typename T>
void my_shuffle(T __first,T __last){
    if(__first==__last) return;
    for(T __i=__first+1;__i!=__last;++__i)
        std::iter_swap(__i,__first+xorShift128Plus()%(int(__i-__first)+1));
}
vector<int>fun;
struct act{
	bool type;
	int a;
	string b;
}ac[3001];
string ans[100001];
ull getHash(string ch){
    ull hsh=0;
    for (int i=0;i<=(int)ch.length()-1;i++){
		hsh=hsh*131+ch[i];
	}
    return hsh;
}
signed main(){
    scanf("%llu %llu %llu %llu %llu %llu %llu %llu %llu",
            &n,&m,&q,&l,&seed1,&seed2,&STR_LEN,&FREQ,&MAX_X);
	fu[0].equal_func();
    for(int i=0;i<(int)l;i++) f[i]=i;
    for(int i=1;i<=(int)m;i++){
        my_shuffle(f,f+l);
        fun.clear();
        for(int i=0;i<(int)l;i++){
        	fun.push_back(f[i]);
        }
        fu[i]=fun;
    }
    for(int i=1;i<=(int)n;i++){
        if(xorShift128Plus()%FREQ<=1){
        	ac[i]={0,(int)(xorShift128Plus()%m+1),};
        }
		else{
            LEN=STR_LEN-(xorShift128Plus()&7);
            ac[i].type=1;
            for(int j=1;j<=LEN;j++){
            	ac[i].b.push_back(xorShift128Plus()%l+'a');
            }
        }
    }
    unsigned long long xcnt=0,nowact=1;
    while(1){
    	if(ac[nowact].type==0){
	   		fu[0]+=fu[ac[nowact].a];
		}
		else{
			ans[++xcnt]=fu[0].func(ac[nowact].b);
			if(xcnt==MAX_X) break;
		}
		nowact++;
		if(nowact>n) nowact-=n;
	}
	unsigned long long anss=0;
    for(int i=1;i<=(int)q;i++){
    	unsigned long long res=getHash(ans[xorShift128Plus()%MAX_X+1])-i;
        anss^=res;
    }
    cout<<anss<<endl;
}

后记

$\large\text{老婆可爱捏}$

标签:__,le,int,long,集训,a2,暑假,ans,CSP
From: https://www.cnblogs.com/HaneDaCafe/p/18326208

相关文章

  • 2024年暑假ACM集训第1场
    A:小青蛙跳台阶题目描述想必你应该做过这么一道题:一只小青蛙一次可以跳1级台阶,也可以一次跳2级台阶。求该青蛙跳上第N级台阶总共有多少种跳法?(假设小青蛙的初始位置是第0级台阶)现在小青蛙遇到了一点麻烦,因为其中有一级台阶是坏的,小青蛙不能跳到这一级。假设坏掉的这一级台阶......
  • [赛记] 暑假集训CSP提高模拟7, 8
    学长出题规律:T1签到题,T2套路题(但没见过),T3神奇题(赛时想的做法几乎都是错的),T4peppapig题学长:今天T3防AKpeppapig:今天比赛防爆零A.Permutations&Primes20pts签到题,可惜没有签到;显然,我们要让经过1的区间最多,所以将1放在序列中间;除了1,就是2和3,所以我们把2和3放在两边,这......
  • 2024暑假集训测试12
    前言比赛链接。T2其实和货车运输这题差不多但是由于给定图为树的部分分都没想出来压根没想到重构树,感觉不太应该,思路还是不清晰,赛时没有拿到那个部分分的,因为拿到的都顺着推出正解了;T3是道黑,赛时\(A,B\)循环输出能拿到\(40\)分,赛后重测了;T4题都看不懂。没挂分因为根......
  • 暑假集训CSP提高模拟8
    T1点击查看代码#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lla[5];intmain(){ cin>>a[1]>>a[2]>>a[3]; sort(a+1,a+3+1); llans=(a[3]-a[1])/2+(a[3]-a[2])/2; a[1]+=(a[3]-a[1])/2*2;a[2]+=(a[3]-a[2])/2*2; if(a......
  • 『模拟赛』暑假集训CSP提高模拟8
    Rank诶好像把7咕了,那就咕吧。膜拜博弈论带我上Rank1。A.基础的生成函数练习题(gf)原[ABC093C]SameIntegers先给\(a\),\(b\),\(c\)按升序排个序,求出相邻两数之差。若较小的两数之差(\(a\)和\(b\))为奇数,先操作\(\lfloor{\frac{b-a}{2}}\rfloor\)次使\(a=b-1\),再操......
  • 暑假集训CSP提高模拟8
    暑假集训CSP提高模拟8\(T1\)P155.基础的生成函数练习题(gf)\(100pts\)原题:[ABC093C]SameIntegers设通过操作\(a,b,c\)所能达到的最小整数为\(x\)。观察到对同两个数进行操作\(2\)等价于分别对这两个数各进行操作\(1\),在\(a,b,c\)达到\(x\)的过程中优先......
  • 【题解】「CSP模拟赛」雨天 rain
    雨天rain考场上打了一个动态开点线段树,但是被卡空间了......
  • VP CSP-J2019 江西
    不是很理解为什么江西CSP单列一年,题目难度吊打CSP-J2024T1P5681[CSP-J2019江西]面积签到题,但需要注意面积相等情况#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;lla,b,c;intmain(){ cin>>a>>b>>c; if(a*a>b*c){ cout<<"Alice......
  • 暑假集训CSP提高模拟7
    这个T1的\(n^{3}\)的SPJ效率还是太慢了,膜拜SPJ大神学长,还会画画A.Permutations&Primes这题感觉挺水的但是感觉有不是那么水,主要还是因为我赛时没想出正解,在打的表里找了一组好看的规律,打上了然后就过了.对偶数来说,我的规律正好是正解的特化,但是对奇数来说,我的规律就......
  • 「模拟赛」暑期集训CSP提高模拟6(7.23)
    \(140pts,Rank23\)题目列表A.花间叔祖B.合并rC.回收波特D.斗篷花间叔祖\(98pts\)题意:给定一个数组,选择一个大于等于2的模数,然后把数组中的数变成\(mod\)该模数后的数。只能操作一次,问操作后最少有几种不同的数。赛事分析:开始5分钟想到了算\(a_i\)中所有......