首页 > 其他分享 >9.15 比赛总结

9.15 比赛总结

时间:2024-09-16 08:55:05浏览次数:10  
标签:总结 const 比赛 int 9.15 long num mp 哈希

突然想起来自己把比赛总结的好习惯忘掉了,所以现在重新拾起,故名曰《朝花夕拾》。

T1 出了个大阴间题

看数据范围明显状压。很明显,\(a,b\) 分成两部分处理。

\(f_{s,i}\) 表示状态为 \(s\),\(a=i\) 时的所有情况之和,还要计算 \(num_{s,i}\) 表示此时情况数。

\(b\) 直接递推模拟即可,时间复杂度 \(O(2^nn^2)\),拿下最劣解。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=1<<18,p=1e9+7;
int n,m,k,s,a[20],b[100];
int f[M][100],num[M][100];
unordered_map<int,int>mp;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>k;int ans=0,bb=0;
	for(int i=1;i<n;i++)
		ans=(ans+bb)%p,bb=(2*bb+1)%p;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(!mp[a[i]])
			mp[a[i]]=1,b[++m]=a[i];
		if(!mp[a[i]+1])
			mp[a[i]+1]=1,b[++m]=a[i]+1;
	}sort(b+1,b+m+1);
	for(int i=1;i<=m;i++) mp[b[i]]=i;
	for(int i=1;i<=n;i++) a[i]=mp[a[i]];
	for(int i=1;i<=n;i++)
		num[(1<<i)>>1][a[i]]=1;
	int mx=(1<<n)-1;
	for(int i=1;i<=mx;i++)
		for(int j=1;j<=m;j++){
			if(!num[i][j]) continue;
			for(int l=1;l<=n;l++)
				if(!(((1<<l)>>1)&i)){
					int S=i|((1<<l)>>1);
					int r=(a[l]==j)?j+1:max(a[l],j);
					f[S][r]=(f[S][r]+f[i][j]+k*b[r]%p*num[i][j])%p;
					num[S][r]=(num[S][r]+num[i][j])%p;
				}
		}
	s=(!num[mx][m])?m-1:m;
	cout<<b[s]<<" "<<(f[mx][s]+ans*num[mx][s])%p;
	return 0;
} 

T2 最简单辣快来做

T3 是我的你不要抢

很容易想到用哈希进行判断,同时为了避免不必要的重复计算,我们用 \(unordered\_map\) 存储已经计算过的答案。写得好可以拿 \(99pts\)。

实际上99分做法挂的原因不是因为做法正确性,而是因为哈希冲突。

我们都知道,哈希冲突是指不一样的字符串,哈希值相同。通常我们用 \(unsigned\ long\ long\) 就可以了,但这道题卡这种哈希,所以我们就可以用 \(998244353\) 作为模数也验证一遍即可。

\(unsigned\ long\ long\) 时间复杂度比较小,所以要放在前面,防止大量问题堆积在 \(get\) 中的第二个 \(if\) 中,导致常数爆炸。(实测,\(ull\ WA,998244353\ TLE\))

下面证明 \(hash\) 时间复杂度正确:

设有 \(x\) 个字符串,\(n=\sum |a_i|\),则时间复杂度为 \(O(nx)(x^2\le q)\) 或 \(O(\frac{nq}{x})(x^2>q)\)

两个式子最大值都是 \(O(n\sqrt q)\),常数很小,可以卡过。

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define uint unsigned int
using namespace std;
const int M=6e5+5;
const int p=998244353;
const ull q=1145141;
const int qq=19198101;
int z(char c){
	return c-'a';
}vector<ull>hs[M];
vector<int>hh[M];
string s;ull qp[M];
int n,m,l[M],pq[M];
unordered_map<int,int>mp[M];
int get(int i,int j){
	for(int k=min(l[i],l[j]);k;k--)
		if(hs[i][l[i]]-hs[i][l[i]-k]*qp[k]==hs[j][k])
			if((hh[i][l[i]]-(ll)hh[i][l[i]-k]*pq[k]%p+p)%p==hh[j][k]) return k;
	return 0;
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m,qp[0]=pq[0]=1;
	for(int i=1;i<=n;i++){
		cin>>s,s=" "+s;
		l[i]=s.size()-1;
		hs[i].push_back(0);
		for(int j=1;j<=l[i];j++)
			hs[i].push_back(hs[i][j-1]*q+z(s[j]));
		hh[i].push_back(0);
		for(int j=1;j<=l[i];j++)
			hh[i].push_back(((ll)hh[i][j-1]*qq%p+z(s[j]))%p);
	}for(int i=1;i<M;i++)
		qp[i]=qp[i-1]*q,pq[i]=(ll)pq[i-1]*qq%p;
	while(m--){
		int x,y;cin>>x>>y;
		if(!mp[x].count(y))
			mp[x][y]=get(x,y);
		cout<<mp[x][y]<<"\n";
	}return 0;
}

T4 显然也是我整的

标签:总结,const,比赛,int,9.15,long,num,mp,哈希
From: https://www.cnblogs.com/chang-an-22-lyh/p/18415936/20240915-bszj

相关文章

  • 9.15
    写不动了,所以来摆一会总结一下吧菜完了啊开学前跟着学校训练,RED实力,然后发现dbyc除了我大抵是没什么人了罢,zty有水平但是天天PUBG,有点可惜啊,颓完了。话说回来第一场模拟赛就爆丸辣,一定是没给大样例的原因!!!一定不是我都原因!!!(bushi然后就还比较顺利,第二次模拟赛D爆他们。......
  • STL-vector容器总结
    vector(向量)是C++标准模板库(STL)中最常用的容器之一,它提供了动态数组的功能,可以存储任意类型的元素。vector具有自动管理内存、支持随机访问、动态调整大小等优点,非常适合用于需要频繁增删元素或未知大小的数组场景。下面是对vector的总结和常见用法。先复习一下c++中常用的......
  • 20240915 总结
    这周VP了两场Div.2。均获得较高名次,可能之后需要VPARC这种有点强度的比赛更好一点。联考:20240909T1又是数学。T2唐氏了。注意到有结论,一个合法路径必定可以调整到经过一个在时间上正好能走的边。然后就简单了。正着反着dij,然后\(O(m)\)合并。T3更为唐氏,场上好像......
  • 2024.9.15
    DATE#:202409015ITEM#:DOCWEEK#:SUNDAYDAIL#:捌月拾叁TAGS<BGM="阿尔茨海默症-盼钰"><theme=oi-contest><[NULL]><[空]><[空]>鱼不畏水鸟不惧高猫不怕鱼你不爱我A.夕景昨日时间限制:1s 内存限制:500MB 测评类型:传统型......
  • 9月15日总结
    今天呢,将剩余的码题集的习题搞完了,在这几个题中,虽然大部分是一些暴力是可以解决的,但是,几乎所有的题都需要你考虑时间复杂度,将具体的代码进行优化,例如今天我学会了一个名为线性筛(欧拉筛)的一个为素数寻找计算的算法知识具体的代码实现如下:for(inti=2;i<=x;i++){if(!judge[i......
  • 正睿OI 24noip十连测day3总结
    A.茵蒂克丝题意:给定两个序列\(a,b\),每次询问\([l,r]\)内选出一个长度不小于\(k\)的子区间\([l',r']\),使得\(\frac{\sum_{i=l'}^{r'}a_i}{\sum_{i=l'}^{r'}b_i}\)尽可能大。其中\(k\)为定值。\(n,q≤1e6,k≤20\)题解:有结论,区间长度一定小于\(2\timesk\),这是......
  • 9.9 ~ 9.15 总结
    正在完成对做过略有难度的题目写题解的计划。这是四次联考的题解(当然还是和前面所有联考在一起的老链接)。做题包括以下几道:AGC032F,这是对P6130结论的拓展运用。P11023一道新的CO/CETS题目。选的点一定在原凸包上,然后分上下凸壳考虑;接下来的dp满足四边形不等式,可以决策......
  • 总结:1037 - CSP 2021 提高级第一轮
    我的提交记录与结果以比较为基本运算,对于\(2n\)个数,同时找到最大值和最小值,最坏情况下需要的最小的比较次数为()。\(\textttA\).4n-2\(\textttB\).3n+1\(\color{#5eb95e}\texttt{C}\).3n-2\(\color{#e74c3c}\textttD\).2n+1【解析】:首先先将原数组两两分组。每组......
  • chapter08 面向对象编程高级 知识点总结Note
    文章目录static修饰符单例设计模式main()方法类的成员代码块实例变量赋值位置顺序final关键字abstract关键字使用抽象应用模板方法设计接口语法应用(多态匿名实现类)jdk8jdk9接口新特性类的成员内部类枚举类(自定义enum方法实现接口)注解常用注解与JUnit单元测试......
  • 线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型
    文章目录1.二次型1.1二次型、标准型、规范型、正负惯性指数、二次型的秩1.2坐标变换1.3合同1.4正交变换化为标准型2.二次型的主要定理3.正定二次型与正定矩阵4.重难点题型总结4.1配方法将二次型化为标准型4.2正交变换法将二次型化为标准型4.3规范型确定取值范围......