[考试反思]1012csp-s模拟测试70:盘旋
这套题比较烂。。。
上来看到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:盘旋的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- csps模拟测试70
又炸了,T1没开$long long$,炸掉$50pts$,昨天因为SB错误挂掉$100pts$. 我kuku了,以后细心点吧.
- 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼
T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
随机推荐
- [JavaScript] 《JavaScript高级程序设计》笔记
1.|| 和 && 这两个逻辑运算符和c#是类似的,都是惰性的计算 a() || b() 若a()为真返回a()的结果,此时b()不计算: a()为假则返回b() a() &am ...
- MySQL 复制已存在的表生成新表
从已有的表创建一个新的空表 CREATE TABLE new_table LIKE old_table; 注意: create table ... like 创建的表会保留原有表的字段.索引的定义,但 ...
- Java基础学习(七) - 异常处理
1.异常概念 异常指的是程序在执行过程中出现的非正常的情况,导致JVM的非正常停止.在Java中,异常是一个类,产生异常就是创建异常对象并抛出一个异常对象. 异常指的并不是语法错误,语法错误,编译不会 ...
- MongoDB 走马观花(全面解读篇)
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
- 模拟telnet协议C语言客户端程序
首先要了解telnet协议,一下两篇blog给了我初步的思路 https://www.cnblogs.com/liang-ling/p/5833489.html 这篇有比较基础的介绍 以及IAC命令含 ...
- 微信小程序中事件
微信小程序中事件 一.常见的事件有 类型 触发条件 最低版本 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 ...
- msf后门之persistence
在获取得了meterpreter shell后 使用Persistence建立持续性后门 run persistence -h meterpreter > run persistence -h ...
- PHP compact
1.函数的作用:将变量转成数组 2.函数的参数: @params string $varname1 @params string $varname2 ... @params array $varnam ...
- HTML 元素居中的方法
网址:http://www.cnblogs.com/asqq/archive/2012/04/09/2438745.html 1. 元素的定位的方法选择 :absolute . 2. 给定元素的宽和高 ...
- [JZOJ5866]【NOIP2018模拟9.13】指引
Description