[考试反思]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:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
随机推荐
- ELK 学习笔记之 Logstash之inputs配置
Logstash之inputs配置: input plugin doc: https://www.elastic.co/guide/en/logstash/current/index.html 插件很 ...
- ELK 学习笔记之 elasticsearch Bulk操作
Bulk操作: Bulk操作用于批量插入数据: 请求体格式: 编辑一个文件:(插入2个新的文档) curl -XPOST 'http://192.168.1.151:9200/library/book ...
- jq方法写选项卡的基本原理以及三种方法
使用jq写选项卡,告别了繁琐的循环以及命名规范 基本原理: 1.当某一个btn被选中时,将这个btn的背景颜色设为橘色,其余兄弟btn背景颜色设为空(none) 2.如果子div与btn的索引相同,就 ...
- ef core实现无感知软删除
很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...
- parse_args(argsparse):python和命令行之间的交互
初始化 假设我们创建一个“argp.py”的文件. import argparse # 引入模块 # 建立解析对象 parser = argparse.ArgumentParser() parser. ...
- COGS 2510. 拯救紫萱学姐
[题目描述] 其实在开考前半个小时题面并不是这样的. 由于明天要考试,同学们要把抽屉里的书都搬空,书很多而且办了走读不能回寝室的学长一眼就看到了回班撩他的学姐,于是就把学姐当学长用♂了:“帮我把这摞书 ...
- Jenkins邮件收发(qq邮箱)
首先确认QQ邮箱SMTP服务器的地址和端口号.如下图所示,请谨记,JENKINS全局邮箱配置需要使用: 步骤1:开启QQ邮箱的smtp服务:登陆QQ邮箱-设置-账户-开启POP3/SMTP服务-完成“ ...
- PowUp渗透脚本基本模块
PowUp脚本也位于PowerSploit下Privesc模块下 通常,在 Windows 下面我们可以通过内核漏洞来提升权限,但是,我们常常会碰到所处服务器通过内核漏洞提权是行不通的,这个时候,我们 ...
- PHP会话机制---session的基本使用
登录网站后,在每个网页都能拿到用户信息 (1) 使用超链接传递用户名,这样太繁琐了,不建议使用 . (2) 使用数据库,每打开一个页面都查询一次用户信息表,这样网页加载速度变慢,用户体验变差. (3) ...
- [Luogu3554] Poi2013 Triumphal arch
Description Foreseeable和拿破仑的御用建筑师让·夏格伦在玩游戏 让·夏格伦会玩一个叫“凯旋门”的游戏:现在有一棵n个节点的树,表示一个国家 1号点代表这个国家的首都 这个游戏由两 ...