「10.12」木板(数学)·打扫卫生(神仙DP)

A. 木板



一个很简单的数学题,简单推一下就好,路丽姐姐教你学数学。

将式子化出我们发现只需求出$i\times i/n$的个数

那么我们将$n$质因数分解,可知因子个数

为了整除$n$,令$i==\sqrt{n\times k} $,我们需要让$k$含有$n$中奇数个数的因子

然后同时还可以有其他的平方因子,直接爆求即可。

思路积累:

1.对于求$i\times i/n$可以从$n$的因子上下手

B. 打扫卫生



一个$DP$的大神题,考场被各种剪枝cao过

$ \%\%\%\%\%kx,Duanyue $线段树$AC$

$n^2$DP显然不说了

正解:

首先记清几个数组的定义:

$pre_{i}$表示当前遍历情况下权值为$i$的点的最近出现的位置

$pos_{j}$表示当前从$pos_{j}+1$到$i$之间不同的数字小于等于$j$的位置

$cnt_{j}$表示当前从$pos_{j}+1$到$i$之间不同的数字个数

然后分析题意,因为最坏情况下,我们分$n$段权值为$n$

所以对于每段的数字个数我们不能取过$\sqrt{n}$;

那么我们考虑转移:

但我们添加一个新的数时

假如他的$pre_{a_{i}}$大于当前枚举的$pos_{j}$,那么$a_{i}$已经不是第一次出现了

所以对$cnt_{j}$没有贡献

但是假如小于等于的话....显然此时$cnt_{j}++$可能大于$j$,所以此时$pos_{j}$要移动

那么在移动时我们要让$cnt_{j}--$,所以我们应该找到第一个$pre_{a_{pos_{j}}}$等于$pos_{j}$的

因为这样意味着我们将$pos_{j}$移到此处时,正好减去了一个元素,使元素不在$pos_{j}+1$到$i$出现

复杂度证明:

每个指针即每个$j$有$\sqrt{n}$个且最多移动$n$次。

#include<bits/stdc++.h>
#define MAXN 41000
using namespace std;
int read(){
    int x=0;char c=getchar();int ff=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)ff=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return x*ff;
}
int pre[MAXN],cnt[MAXN],pos[MAXN],f[MAXN];int n,m;
int a[MAXN];
signed main(){
    memset(f,0x3f3f3f,sizeof(f));
    f[0]=0;
    n=read();m=read();
    for(int i=1;i<=n;++i)a[i]=read();
    for(int i=1;i<=n;++i){
        for(int j=1;j<=sqrt(n);++j){
            //printf("pre[%d]=%d\n",a[i],pre[a[i]]);
            if(pre[a[i]]<=pos[j]){
                cnt[j]++;
                if(cnt[j]>j){
                    pos[j]++;
                    while(pre[a[pos[j]]]>pos[j]){
                        pos[j]++;
                    }
                    cnt[j]=j;
                }
            }
            f[i]=min(f[pos[j]]+cnt[j]*cnt[j],f[i]);
            //printf("f[%d]=%d pos[%d]=%d\n",i,f[i],j,pos[j]);
        }
        pre[a[i]]=i;
    }
    printf("%d\n",f[n]);
}

思路积累

1.考场能减的枝一定要减,万一A了呢.....

2.对于题意性质转化,因为有很多区间的值的贡献是一样的,因为题中答案是$cnt^2$,考虑枚举$\sqrt{n}$的值

原文地址:https://www.cnblogs.com/Wwb123/p/11664069.html

时间: 2024-10-10 13:33:32

「10.12」木板(数学)·打扫卫生(神仙DP)的相关文章

[模拟赛10.12] 老大 (二分/树的直径/树形dp)

[模拟赛10.12] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n ? 1 条边的无向连通图),由于新建的办公室太大以至于要将奖杯要分放在两个不同的地方以便同学们丢硬币进去开光,OB 想请你帮帮他看看奖杯放在哪两个办公室使得在任意一个在劳模办公室做题的小朋友能最快地找到奖杯来开光. 一句话题意:给出一个 n 个点的树,在两个合适且不同的点放上奖杯,使得每个点到最近的奖杯距离最大值最小. 输入

「10.13」毛一琛(meet in the middle)&#183;毛二琛(DP)&#183;毛三琛(二分+随机化???)

A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其他算法统计,保证两边互不影响 今天的题我们考虑枚举先枚举左半部分,然后每个物品有三种取值情况 选入A集合,选入B集合,不选,系数不同 考虑完左半部分再去考虑右半部分,那么我们可以用哈系表先从将左半部分的答案统计出来 然后右半部分查询他的相反数注意去重 也可以用将两边状态都用结构体存下来 注意去重 思

「10.28」Dove 打扑克(链表)&#183;Cicada 与排序(概率)&#183;Cicada 拿衣服(各种数据结构)

A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法 打完暴力后突然想到此题用链表实现会很快. 因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n$, 所以链表中最多有$\sqrt{n}$个元素, 所以可以用一个$set$维护当前的出现元素,每次$upper\_bound$找到合适位置插入链表, 因为当前元素有序所以可以统计链表后缀来求答案 知识点: 不要在T1花太长时间,数据结构题可能只用到一些简单数据结构 B. Cicada 与排序 很好

[BZOJ1584] [Usaco2009 Mar]Cleaning Up 打扫卫生(DP)

传送门 不会啊,看了好久的题解才看懂 TT 因为可以直接分成n段,所以就得到一个答案n,求解最小的答案,肯定是 <= n 的, 所以每一段中的不同数的个数都必须 <= sqrt(n),不然就不是最小的答案 那么 f[i]表示前i个数的最有解 g[i]表示从当前位置开始,有i个不同的数,最多能往前延伸到哪里 pre[i]表示上一个数为i的位置 cnt[i]表示g[i] + 1 ~ 当前位置 中的不同数的个数 所以 f[i] = min(f[i], f[g[j]] + j * j) 那么问题就是g

「AHOI2014/JSOI2014」骑士游戏

「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i = \min(K_i, S_i + \sum_{j = 1}^{R_i} dp_{v_j})\] 但是我们会发现这个东西是有后效性的... 所以我们会想要用建图然后跑一个最短路什么的来搞... 于是我们观察到上面那个 \(\text{DP}\) 式子中,\(dp_i\) 如果用后面那一项来转移,显然

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

T1 木板 求\sqrt{n}-n间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数除二,向上取整,这个数一定是大于\sqrt{n}的最小的符合条件的数 \sqrt{n}将n分解质因数后求出首项,(n-1)/首项就是小于n里有几个,即答案 积累:papa大神教我,打表之前先猜规律,用小点看看猜的对不对,然后再用大点验证,想不出来的数学题就打打表,找找规律 T2 打扫卫生 首先肯定是dp 考

【转】具透 | 你可能不知道,iOS 10 有一个中国「特供」的联网权限功能

9 月底,苹果正式在北京成立了苹果中国研发中心.近几年,我们也在每年更新的 iOS 系统中不断看到,苹果对中国市场的关照.从早前的九宫格输入法,到最近的骚扰电话拦截,都照顾了国内用户的需求. 在 iOS 10 中,除了 骚扰电话识别和拦截 功能的加入,苹果其实还专为国行 iPhone 制定了一个「联网权限」功能1. 它是什么 相信已有不少人早就注意到这个功能.毕竟在 iOS 10 中,每当你打开一个新安装的 App 时,应用除了可能会弹出请求授权访问相册.推送通知.获取定位这些熟悉的权限之外,还

「专题总结」LCT 2

差不多理解板子之后,写了一些奇怪的题. 但是还是那个问题:树剖真好使. 魔法森林:mikufun说这个是傻逼题. 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐士. 魔法森林可以被看成一个包含n个节点m条边的无向图,节点标号为1-n,边标号为1-m. 初始时小 E 同学在号节点 ,隐士则住在n号节点.小 E 需要通过这一片魔法森林,才能够拜访到隐士. 魔法森林中居住了一些妖怪.每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击. 幸运的是,在1号节点住着两种守护精灵:

Mac OS 10.12使用U盘重装(转)

OS X Capitan和macOS Sierra的安装方式和下载系统的方法都是一致的,下面是OS X Capitan的安装方法: 一.准备工作: 准备一个8GB或者8G以上容量的U盘 确保里面的数据已经妥善备份好(该过程会抹掉U盘全部数据)最好使用3.0的U盘.速度快. 打开App store下载OS X El Capitan系统. 1.搜索系统 2.点击下载 3.点击继续 4.当你下载完成以后, 打开你的launchpad 5.找到刚才下载的这OS X El Capitan 二.格式化U盘