T1 木板

求$[\sqrt{n},n)$间有多少个数的平方是n的倍数

通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项

而首项就是将n质因数分解后每个质因数出现次数除二,向上取整,这个数一定是大于$\sqrt{n}$的最小的符合条件的数

$\sqrt{n}$将$n$分解质因数后求出首项,$(n-1)/$首项就是小于$n$里有几个,即答案

积累:$papa$大神教我,打表之前先猜规律,用小点看看猜的对不对,然后再用大点验证,想不出来的数学题就打打表,找找规律

#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll n,ans,z[],cnt,num[];
ll read()
{
ll aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
void devide(ll x)
{
ll xx=sqrt(x);
for(ll i=;i<=xx;i++){
if(x%i==){
z[++cnt]=i;num[cnt]=;
while(x%i==) x/=i,num[cnt]++;
}
}
if(x>) z[++cnt]=x,num[cnt]=;
}
ll quick(ll x,ll p)
{
ll as=;
while(p){
if(p&) as=as*x;
x=x*x;
p>>=;
}
return as;
}
int main()
{
while(){
n=read();ans=;cnt=;
if(!n) break;
devide(n);
for(ll i=;i<=cnt;i++) ans*=quick(z[i],(num[i]+)/);
printf("%lld\n",(n-)/ans*);
}
return ;
}

木板

T2 打扫卫生

首先肯定是$dp$

考场写的是$n^2$的,每次用桶把$a[j]$的贡献减去,更新答案,最后再循环一遍都加回来,$T60$

但我们发现如果不同的数的个数大于了$\sqrt{n}$,那么他一定不优(大于$\sqrt{n}$,那还不如一段就一个,这样就只有$n$)

所以我们可以在往回加的时候特判,如果$cnt$大于$\sqrt{n}$,那就记录下这个位置,然后$break$,下次循环就只从$pos$循环就行了,加上这个减枝可以到$T80$

正解:$cnt$一定小于$\sqrt{n}$,那么我们枚举i前不同的数的个数,复杂度就降到了$O(n\sqrt{n})$

用$pre[a[i]]$记录$a[i]$上次出现的位置,$b[j]$表示从$b[j]+1~i$一共有$j$个不同的数,$c[j]$表示从$b[j]+1~i$有多少个不同的数

$i++$后,如果$pre[a[i]]<=j$,说明$a[i]$在$b[j]+1~i-1$这一段没有出现过,所以$b[j]+1~i$这一段中不同数的个数就变成了$c[j]+1$,更新$c[j]$

如果$c[j]>j$,我们为了维护$c[j]==j$,就需要调整$b[j]$的位置,使$b[j]$合法

设$pos=b[j]+1$(原位置),如果$pre[a[pos]]>pos$说明在后面还有一个$a[pos]$,那么删掉这个对个数没有影响,直到$pre[a[pos]]<=pos$,那么删掉这个数,$pos+1~i$这个区间就正好有$j$个数了,更新$b[j]=pos$,$c[j]=j$,同时更新$f[i]$数组

积累:没有思路想$dp$,优化的时候找$dp$的瓶颈,看是否能用一些数据结构或多记一些东西突破他

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,nn,a[],b[],c[],pre[],f[];
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc>=''&&cc<=''){aa=(aa<<)+(aa<<)+(cc^'');cc=getchar();}
return aa*bb;
}
int main()
{
n=read();m=read();nn=sqrt(n);
for(int i=;i<=n;i++) a[i]=read();
memset(pre,-,sizeof(pre));
for(int i=;i<=n;i++){
f[i]=f[i-]+;
for(int j=;j<=nn;j++)
if(pre[a[i]]<=b[j]) c[j]++;
pre[a[i]]=i;
for(int j=;j<=nn;j++){
if(c[j]>j){
int pos=b[j]+;
while(pre[a[pos]]>pos) pos++;
b[j]=pos;c[j]--;
}
f[i]=min(f[i],f[b[j]]+j*j);
}
}
printf("%d\n",f[n]);
return ;
}

打扫卫生

T3 骆驼

咕咕咕

10.12 csp-s模拟测试70 木板+打扫卫生+骆驼的更多相关文章

  1. csps模拟69chess,array,70木板,打扫卫生题解

    题面:https://www.cnblogs.com/Juve/articles/11663898.html 69: 本以为T2傻逼题结果爆零了...T3原题虽然打的不是正解复杂度但是都不记得做过这道 ...

  2. [考试反思]1012csp-s模拟测试70:盘旋

    这套题比较烂... 上来看到T2是原题,一想上一次考试遇到原题就不换,这次应该也是,于是直接开始码,码了一半然后换题了 T1打表找规律或者推式子都不难... T2水的一匹暴力剪枝即可,但是我并不知道数 ...

  3. csps模拟测试70

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

  4. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

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

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

  6. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  9. 黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试)

    黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试) 2017-03-12 03:46:24 by SemiconductorKING PS:刚刚装好黑苹果,来记录一篇折 ...

随机推荐

  1. golang数据结构之单链表

    实现单链表的增删查改. 目录如下: singleLink.go package link import ( "fmt" ) //HeroNode 链表节点 type HeroNod ...

  2. 修改本地的host文件

    在C:\Windows\System32\drivers\etc下有一个host文件, 在里面可以修改本地的域名,比如我文件里添加一行: 10.0.33.79    devsuite.easthope ...

  3. Java反射简单使用--第一次细致阅读底层代码

    1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...

  4. 03-模板(过滤器,代码复用,表单,CSRF)

    模块代码复用 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有相同的模板代码内容,但是内容中部分值不一样 多个模板中具有完全相同的 html 代码块内容 像遇到这种 ...

  5. 使用pymysql模块进行封装,自动化不可或缺的数据库校验

    import pymysql class HandleMysql: ''' 定义一个mysql处理类 ''' def __init__(self, hostname, username, passwo ...

  6. C#截图操作(几种截图方法)

    公共函数获取屏幕截图private Bitmap GetScreenCapture(){ Rectangle tScreenRect = new Rectangle(0, 0, Screen.Prim ...

  7. Eclipse导入SpringBoot项目pom.xml第一行报错Unknown error

    1.网上搜的都说是将SpringBoot2.1.5版本降级到SpringBoot2.1.4版本,感觉这治标不治本啊,以后想升级不是玩完了. 错误如下所示: 参考:https://ask.csdn.ne ...

  8. LinuxShell脚本——循环结构

    LinuxShell脚本——循环结构 摘要:本文主要学习了Shell脚本中的循环结构. while循环 基本语法 while循环是最简单的一种循环,如果条件满足则执行循环里的语句,如果条件不满足则退出 ...

  9. JS基础语法---函数练习part2---10个综合练习(运用:循环/数组/函数)

    练习1:求2个数中的最大值 function getMax(num1, num2) { return num1 > num2 ? num1 : num2; } console.log(getMa ...

  10. js的运用

    JS数组的4种声明方法: //第一种 ,,,,] console.log(A) //第二种 var B=new Array(); B[]= B[]= B[]= console.log(B)//第三种 ...