这套题比较烂。。。

上来看到T2是原题,一想上一次考试遇到原题就不换,这次应该也是,于是直接开始码,码了一半然后换题了

T1打表找规律或者推式子都不难。。。

T2水的一匹暴力剪枝即可,但是我并不知道数据那么那么水所以还花了很多时间优化

T3神奇的大模拟,挺有意思但是考场上不可能有人能拿到20+

所以因为题比较烂,所以我就上去了?

隔了一场之后RP守恒又恢复了?

啊啊不要乱说啊再过十几分钟就又要考一场了啊。。。

T1:木板

具体化式子也就是个初中数学,结论就是(最大平方因子的平方根-1)<<3,打个100的表就出来了

 #include<cstdio>
int main(){
long long n,mx;scanf("%lld",&n);
while(n){
for(long long i=;i*i<=n;++i)if(n%(i*i)==)mx=i;
printf("%lld\n",(mx-)<<);scanf("%lld",&n);
}
}

183B

T2:打扫卫生

看到数据范围,直接上根号。

dp[i]表示以i为某一段的结尾,到i为止的最优dp值。

几个比较明显的性质:

0)$dp[i]<=i$

1)颜色数超过$\sqrt{i}$时不必再考虑从前面转移。否则转移来的值不满足上一条

2)任意$i<j$有$dp[i]<=dp[j]$

运用第二条打一个暴力,及时跳出。

 #include<cstdio>
#include<iostream>
using namespace std;
int dp[],n,m,a[],al[],cal;
int min(int a,int b){return a<b?a:b;}
int main(){//freopen("2.in","r",stdin);freopen("bl.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){scanf("%d",&a[i]);if(a[i]==a[i-])i--,n--;}
for(int i=;i<=n;++i)dp[i]=i;
for(int i=;i<=n;++i){
int knd=;
for(int j=i-;~j;--j){cal++;
knd+=al[a[j+]]==i?:;
if(knd*knd>=dp[i])break;
al[a[j+]]=i;
dp[i]=min(dp[i],dp[j]+knd*knd);
}
}printf("%d\n",dp[n]);std:cerr<<cal<<endl;
}

800ms

然后你就AC了。

显然复杂度还是$O(n^2)$的。对拍随机数据,其最内层循环进入了900000000次。

可见题目的数据还不如随机数据。

优化,上述做法的复杂度瓶颈在于你只保证了你扫了$\sqrt{i}$个颜色,但不一定是$\sqrt{i}$个位置。

那么其实可以发现,从i往前扫,到连续的一段区间上的颜色数都相等,根据那第2条性质,那么你直接从这个区间的左端点转移即可。

那么现在的问题是:你要O(1)找到从位置i往前最远到哪里有恰好k种颜色。

考虑位置i,它的颜色为p,那么你找到上一次p出现的位置,这个位置以后再也不会贡献颜色数了,以后不会从它转移。

那么很自然的想法就是一个链表,把上一个p跳过,这一个p加入。

这样沿着链表往前跳,每次必然遇到一个新颜色,颜色数+1。

根据性质1,你最多跳$\sqrt{i}$种颜色。

总复杂度$n\sqrt{n}$。

 #include<cstdio>
int dp[],n,m,a[],lp[],lst[],nxt[];
int min(int a,int b){return a<b?a:b;}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){scanf("%d",&a[i]);if(a[i]==a[i-])i--,n--;}
for(int i=;i<=n;++i)dp[i]=i;
lst[]=;nxt[]=;
for(int i=;i<=n;++i){
int knd=,l=lp[a[i]];
lp[a[i]]=i;
if(l)lst[nxt[l]]=lst[l],nxt[lst[l]]=nxt[l];
nxt[lst[]]=i,lst[i]=lst[],lst[]=i,nxt[i]=;
for(int j=lst[];j;j=lst[j]){
knd++;
if(knd*knd>=dp[i])break;
dp[i]=min(dp[i],dp[lst[j]]+knd*knd);
}
}printf("%d\n",dp[n]);
}

T3:骆驼

大模拟。

结论是5*5的网格任意选取起点终点都有解。

所以把这些5*5网格拼接一下就好了。

分奇偶讨论,有些人需要特判5和15的点。

最好好好利用关键位置(3,3),能简单不少(但是我用的不是。。所以特别麻烦)

大网格的拼接也可以搜索,不一定要执迷于for循环自行讨论。。。

终于打出来了!

 #include<cstdio>
int n,s[][][][][][],ans[][],sx,sy,ex,ey,ord[][];
const int xx[]={,,,-,,,-,-};
const int yy[]={,-,,,,-,,-};
#define tx x+xx[i]
#define ty y+yy[i]
bool sch(int stp,int x,int y){
if(stp==)return x==ex&&y==ey;
if(x==ex&&y==ey)return false;
for(int i=;i<=;++i)if(tx>&&ty>&&tx<=&&ty<=&&!s[sx][sy][ex][ey][tx][ty]){
s[sx][sy][ex][ey][tx][ty]=stp+;
if(sch(stp+,tx,ty))return true;
s[sx][sy][ex][ey][tx][ty]=;
}return false;
}
void fill(int x,int y,int sx,int sy,int ex,int ey){
for(int i=;i<=;++i)for(int j=;j<=;++j)ans[x*-+i][y*-+j]=s[sx][sy][ex][ey][i][j]++*ord[x][y];
}
int main(){scanf("%d",&n);
for(int i=;i<=;++i)for(int j=;j<=;++j)for(int k=;k<=;++k)for(int l=;l<=;++l)
s[sx=i][sy=j][ex=k][ey=l][i][j]=,sch(,i,j);
int bl=n/;
if(bl==)for(int i=;i<=;++i)for(int j=;j<=;++j)ans[i][j]=s[][][][][i][j];
else if(bl==){
for(int i=;i<=;++i)for(int j=;j<=;++j)ans[i][j]=s[][][][][i][j]>?n*n-+s[][][][][i][j]:s[][][][][i][j];//(1,1)
ord[][]=;ord[][]=;ord[][]=;
ord[][]=;ord[][]=;ord[][]=;ord[][]=;
fill(,,,,,);fill(,,,,,);fill(,,,,,);fill(,,,,,);fill(,,,,,);
fill(,,,,,);fill(,,,,,);fill(,,,,,);
}
else if(bl&){int alc=-;
for(int i=;i<=bl;++i)ord[i][]=++alc;
for(int i=bl;i>;--i)if(i&)for(int j=;j<=bl;++j)ord[i][j]=++alc;
else for(int j=bl;j>;--j)ord[i][j]=++alc;
ord[][bl]=++alc;ord[][bl]=++alc;
for(int i=bl-;i>;--i)if(i&)ord[][i]=++alc,ord[][i]=++alc;
else ord[][i]=++alc,ord[][i]=++alc;
for(int i=;i<bl;++i)fill(i,,,,,);
fill(bl,,,,,);
for(int i=;i<=;++i)for(int j=;j<=;++j)ans[i][j]=s[][][][][i][j]>?n*n-+s[][][][][i][j]:s[][][][][i][j];//(1,1)
for(int i=;i<=bl;i+=)for(int j=;j<=bl;++j)fill(i,j,,,,);
for(int i=;i<=bl;i+=)for(int j=;j<=bl;++j)fill(i,j,,,,);
for(int i=;i<bl-;i+=)fill(,i,,,,),fill(,i,,,,);
for(int i=;i<bl;i+=)fill(,i,,,,),fill(,i,,,,);
fill(,bl,,,,);fill(,bl,,,,);fill(,bl-,,,,);fill(,,,,,);fill(,bl-,,,,);
}else{int alc=-;
for(int i=;i<=bl;++i)ord[i][]=++alc;
for(int i=bl;i;--i)if(i&)for(int j=bl;j>;--j)ord[i][j]=++alc;
else for(int j=;j<=bl;++j)ord[i][j]=++alc;
for(int i=;i<bl;++i)fill(i,,,,,);
fill(bl,,,,,);
for(int i=;i<=;++i)for(int j=;j<=;++j)ans[i][j]=s[][][][][i][j]>?n*n-+s[][][][][i][j]:s[][][][][i][j];//(1,1)
for(int i=;i<=bl;i+=)for(int j=;j<=bl;++j)fill(i,j,,,,);
for(int i=;i<=bl;i+=)for(int j=;j<=bl;++j)fill(i,j,,,,);
}
for(int i=;i<=n;++i,puts(""))for(int j=;j<=n;++j)printf("%3d ",ans[i][j]);
}

[考试反思]1012csp-s模拟测试70:盘旋的更多相关文章

  1. [考试反思]0718 NOIP模拟测试5

    最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...

  2. csps模拟测试70

    又炸了,T1没开$long long$,炸掉$50pts$,昨天因为SB错误挂掉$100pts$. 我kuku了,以后细心点吧.

  3. 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼

    T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...

  4. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  5. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  6. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  7. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  8. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

  9. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

随机推荐

  1. Spring源码分析之IOC的三种常见用法及源码实现(二)

    Spring源码分析之IOC的三种常见用法及源码实现(二) 回顾上文 我们研究的是 AnnotationConfigApplicationContext annotationConfigApplica ...

  2. 重新整理django中Auth模块

    0907自我总结 重新整理django中Auth模块 from django.contrib import auth 一.设置 默认Auth表单 auth默认是使用自带的user表单 自定义Auth表 ...

  3. SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇

    前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...

  4. PowerShell渗透--Empire

    0x00 简介 Empire是一款针对Windows平台的,使用PowerShell脚本作为攻击载荷的渗透攻击框架代码具有从stager生成,提权到渗透维持的一系列功能,无需powershell.ex ...

  5. opencv::Mat属性

    OpenCV支持JPG.PNG.TIFF等常见格式图像文件加载 加载图像 Mat imread( const String& filename, int flags = IMREAD_COLO ...

  6. 13.多级代理下Nginx透传真实IP

    1.基于代理(七层负载均衡)情况下 透传客户端的真实IP 环境: 10.0.0.5 proxy_node1 一级代理 10.0.0.6 proxy_node2 二级代理 10.0.0.7 proxy_ ...

  7. git jenkins 基本部署 jenkins持续集成

    1.什么是持续集成?  持续集成来简化我们的工作 还能让产品可以快速迭代,同时还能保持代码高质量产出.2.Jenkins的安装配置:        [root@jenkins ~]# yum inst ...

  8. C语言文件输入/输出 ACM改进版(用freopen函数方便检验)

    这次用到的文件打开函数不再是fopen,而是stdio.h中包含的另一个函数freopen FILE * freopen ( const char * filename,const char * mo ...

  9. Java基础(43)Queue队列

    Collection接口的第三个子接口是Queue接口,而Queue接口的子接口又是Deque接口和BlockingQueue接口. 实现了Deque接口的类有:ArrayDeque类.Concurr ...

  10. Andriod Studio设置代码字体大小