ARC149C (构造)
1.CF1656E(构造思想)2.P10178(构造思想)3.P10179(构造思想+实现)4.P3963 (平衡树思想)5.P10156(dp思想)6.P3939 (ds实现)7.CF776D(并查集思想)8.CF243A (拆位思想)9.ABC283E (dp思想)10.AT_joi2015ho_b (dp思想)11.P9588 (ds思想)12.CF482B (拆位思想+实现)13.U332154 carbon 题解(期望)14.U329011 trie pi 题解15.[ARC128D](计数dp)16.P1081 (倍增+代码实现技巧)17.CF1537D (博弈论+找规律)18.CF1557D (dx)(dp技巧)19.P3165/P2596(文艺平衡树套路)20.吉司机大杂烩
21.ARC149C (构造)
22.CF19D(树套树)23.网络流大杂烩24.U417376题解25.CF1748E(笛卡尔树)26.[CERC2019] Be Geeks!27.「Cfz Round 2」Binary28.CF1833G29.P1028230.CF1939C31.2024省选OIFC模拟T132.P140733.P10218 魔法手杖34.P165335.取模二题36.CF1699C37.ABC35238.P6627 [省选联考 2020 B 卷] 幸运数字39.P6619 [省选联考 2020 A/B 卷] 冰火战士40.2024PKUSC游记比较有意思的构造题,首先想到要使两个数相加为合数,可以让奇数加上奇数,偶数加上偶数,那么这样我们可以使一个数组的上半边全部为奇数,下半边全部为偶数。然后考虑临界。构造题我虽然不是特别会做,但我觉得一个很重要的就是避免过多的讨论,这样的话我们可以在这行枚举相邻两个数的和,然后上面递增排,相邻差为2,下面递减排,相邻差为2。然后对于奇偶分开判断。
对于边长为偶数的情况:然后枚举一个合数,然后枚举一个奇数和一个偶数,递增填即可,剩下随便填。
对于边长为奇数的情况:和上面一样,但是这样如果边长为奇数的时候中间会出现一个阶梯,所以还要枚举这个阶梯是否合法。
放下代码,有点细节,但实现起来花的时间好像没这么多
#include<bits/stdc++.h>
using namespace std;
long long n,gg,gg1,a[1005][1005],cnt1=1,cnt2=2;
bool vis[1000005];
bool check(long long x){
for(long long i=2;i*i<=x;i++){
if(x%i==0) return false;
}
return true;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
if(n%2==0){
for(long long i=2*n+1;;i+=2){
if(!check(i)){
gg=i;
break;
}
}
gg-=(2*n-2);
for(long long i=1;i+2*n-2<=n*n;i+=2){
if((gg-i)+2*n-2<=n*n){
gg1=gg-i;
gg=i;
break;
}
}
for(long long i=1;i<=n;i++){
a[n/2][i]=gg+i*2-2;//odd
a[n/2+1][n-i+1]=gg1+i*2-2;//even
vis[gg+i*2-2]=vis[gg1+(n-i)*2]=true;
}
for(long long i=1;i<=n/2-1;i++){
for(long long j=1;j<=n;j++){
while(vis[cnt1]){
cnt1+=2;
}
vis[cnt1]=true;
a[i][j]=cnt1;
}
}
for(long long i=n/2+2;i<=n;i++){
for(long long j=1;j<=n;j++){
while(vis[cnt2]){
cnt2+=2;
}
vis[cnt2]=true;
a[i][j]=cnt2;
}
}
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
}else if(n==3){
cout<<"1 3 9\n8 7 5\n6 2 4\n";
}else{
for(long long i=3;;i+=2){
if(!check(i+2*n-2)&&!check(i+2*n)){
gg=i;
break;
}
}//gg
//cout<<gg<<endl;
for(long long i=1;i+2*n-2<=n*n;i+=2){
if((gg-i)+2*n-2<=n*n){
gg1=gg-i;
gg=i;
break;
}
}
//cout<<gg<<" "<<gg1<<endl;
for(long long i=1;i<=n/2;i++){
a[n/2][i]=gg+2*i-2;
vis[gg+2*i-2]=true;
}for(long long i=n/2+1;i<=n;i++){
a[n/2+1][i]=gg+2*i-2;
vis[gg+2*i-2]=true;
}for(long long i=1;i<=n/2+1;i++){
a[n/2+2][n-i+1]=gg1+2*i-2;
vis[gg1+2*i-2]=true;
}for(long long i=n/2+2;i<=n;i++){
a[n/2+1][n-i+1]=gg1+2*i-2;
vis[gg1+2*i-2]=true;
}
for(long long i=1;i<=n/2;i++){
for(long long j=1;j<=n;j++){
if(a[i][j]==0){
while(vis[cnt1]){
cnt1+=2;
}
vis[cnt1]=true;
a[i][j]=cnt1;
}
}
}
for(long long i=n/2+2;i<=n;i++){
for(long long j=1;j<=n;j++){
if(a[i][j]==0){
while(vis[cnt2]){
cnt2+=2;
}
vis[cnt2]=true;
a[i][j]=cnt2;
}
}
}
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?