ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022.7.28 模拟赛

2022-07-30 13:34:28  阅读:197  来源: 互联网

标签:ch int text 28 while qwq 2022.7 模拟 getchar


2022.7.28 模拟赛

\(\to link\leftarrow\)

目录

计算器

嗯,显然是个爆搜

算一下复杂度

设第 \(i\) 个部位装备总数为 \(cnt_i\),那么总共可能搜到的情况共有 \(\prod \max(cnt_i,1)\)

显然最坏情况下所有 \(cnt_i\) 相同

我们令它们都等于 \(t\),那么复杂度就是 \(t^{\frac nt}\)

\(t=3\) 时,\(t^{\frac nt}\) 最大为 \(3^{\frac n3}\)

值得注意的是,如果一个地方没有装备需要搞链表跳过去,不然复杂度会多乘一个 \(k\)

由于 \(k\le 50\) 这样会 \(\text{TLE}\)

这就是为什么开了 \(\text {O3}\) 还是挂了 \(10pts\) 啊

去了 \(\text {O3}\) 的 code

#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

struct node{
	int a,b,c,d;
};

int n,k,s;
long long ans;
int nxt[55];
vector <node> p[55];
bitset <55> vis;

inline void dfs(int x,int a,int b,int c,int d){
	if(x==k+1){
		ans=max(ans,1ll*(100+a)*(100+b)*(100+c)*(100+d));
		return;
	}
	for(int i=0;i<(int)p[x].size();++i){
		node y=p[x][i];
		dfs(nxt[x],a+y.a,b+y.b,c+y.c,d+y.d);
	}
}

signed main(){
	n=read(),k=read();
	for(int i=1;i<=n;++i){
		int op=read(),a=read(),b=read(),c=read(),d=read();
		p[op].push_back({a,b,c,d});
		vis[op]=1;
	}
	int pre=0;
	for(int i=1;i<=k;++i){
		if(!vis[i]) continue;
		if(!pre) s=i;
		nxt[pre]=i;
		pre=i;
	}
	nxt[pre]=k+1;
	dfs(s,0,0,0,0);
	printf("%lld\n",ans);
}

对称轴

这是一道人类智慧题

顺时针或者逆时针转一圈,将 \(n\) 个点的多边形的角和边的值连在一起就得到了一个环,环长为 \(2n\)

我们只需要判断对应的边和角相等

具体地,我们用边长表示每条边,用两条邻边的叉积和点积代表以这个点为顶点的角的大小

这样可以把多边形序列化,设序列为 \(\text S\)

用字符串匹配的那一套理论,对称轴的数量就是拿 翻转后的 \(\text S\) 到 \(\text{SS}\) 中去匹配

最后结果就是匹配点的数量,这可以用 \(kmp\) 解决

或是可以利用 \(manacher\) 的那一套理论,在 \(\text{SS}\) 中找长度 \(\ge|\text S|\) 的回文子串个数

时间复杂度 \(\text O(n)\)

好的,正解叙述完了

然而我用的并非正解,而是乱搞加随机化

然后过了……

思路大概就是只有每个点或每条边的中点才可能作为答案,并且其他所有的点到这些点距离相等

然后随机枚举 \(70000\) 个点判断即可

对了,还要加个小优化

由于点都是整点,显然不会有超过 \(4\) 个对称轴

时间复杂度 \(\text O(\frac{70000n}{life\times luck})\)

看上去很慢对不对,那你就错了

有阳寿优化+运气优化怎么会慢

这是没加火车头在 \(\text{AC coder}\) 上的速度:

随机化code

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

struct pt{
	double x,y;
}a[N*2];

int n;
//ad-bc
inline double dis(pt A,pt B){
	//printf("%lf %lf %lf %lf\n",A.x,A.y,B.x,B.y);
	return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
}

inline int rnd(int x){
	return 1ll*rand()%x*rand()%x+1;
}

bitset <N> v;

int s[N];

inline int check(int x){
	int k=(x%2)^1;
	pt qwq={0,0};
	for(int i=1;i<=70000;++i){
		int j=s[i];
		if(i>n/4) break;
		int p=(x+j*2-k),q=(x-2*j+k);
		if(q<1) q+=n;
		if(p>n) p-=n; 
		if(p==q) continue;
		if(fabs(dis(a[x],a[p])-dis(a[x],a[q]))>1e-8) return 0;
		if(i==1) qwq.x=(a[p].x+a[q].x)/2,qwq.y=(a[p].y+a[q].y)/2;
		if(i>1&&fabs(dis(qwq,a[p])-dis(qwq,a[q]))>1e-8) return 0;
	}
	return 1;
}

int p[N];

signed main(){
	srand(114514);
	int T=read();
	while(T--){
		n=read();
		for(int i=0;i<n;++i){
			scanf("%lf%lf",&a[i*2+1].x,&a[i*2+1].y);
		}
		a[n*2].x=(a[1].x+a[2*n-1].x)/2;
		a[n*2].y=(a[1].y+a[2*n-1].y)/2;
		for(int i=1;i<n;++i){
			a[i*2].x=(a[i*2-1].x+a[i*2+1].x)/2.0;
			a[i*2].y=(a[i*2-1].y+a[i*2+1].y)/2.0;
		}
		n*=2;
		int ans=0;
		for(int i=1;i*2<=n;++i) p[i]=i;
		for(int i=1;i*4<=n;++i)s[i]=i;
		random_shuffle(p+1,p+n/2+1);
		random_shuffle(s+1,s+n/4+1);
		for(int i=1;i*2<=n;++i){
			ans+=check(p[i]);
			if(ans>=4) break;
		}
		printf("%d\n",ans);
	}
}

互质

额这是一道神仙题

然后还是不会啊 \(qwq\)

签到题

随便猜了一个结论,\(4\) 个样例全过

那么我过了

什么,怎么证?

我也不会

放个图吧

code

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int N=1e6+5;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

struct E{
	int a,b;
}e[N];

int n,m,k,c;
int col[2][N],d[N];
int sum,ans=N;

inline void dfs(int x){
	if(x==k+1){
		ans=min(ans,sum);
		return;
	}
	int a=e[x].a,b=e[x].b;
	for(int i=0;i<2;++i){
		int presum=sum;
		sum-=abs(col[i][a]-col[i^1][a])+abs(col[i][b]-col[i^1][b]);
		++col[i][a],++col[i][b];
		sum+=abs(col[i][a]-col[i^1][a])+abs(col[i][b]-col[i^1][b]);
		dfs(x+1);
		--col[i][a],--col[i][b];
		sum=presum;
	}
}

signed main(){
	n=read(),m=read(),k=read(),c=read();
	for(int i=1;i<=k;++i){
		e[i].a=read(),e[i].b=read()+n;
		++d[e[i].a],++d[e[i].b];
	}
	if(c==1){
		puts("0");
		return 0;
	}
	if(k<=20&&c==2){
		dfs(1);
		printf("%d\n",ans);
		return 0;
	}
	ans=0;
	for(int i=1;i<=n+m;++i)
		if(d[i]%c!=0)
			++ans;
	printf("%d\n",ans);
}

标签:ch,int,text,28,while,qwq,2022.7,模拟,getchar
来源: https://www.cnblogs.com/into-qwq/p/16534789.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有