【2011集训队出题】拆迁队

每日一道算法题:输出和为n的连续正整数序列 题目:输入一个正数n,输出所有和为n连续正数序列。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 解题思路:我们以正数21为例,由于21=1+2+3+4+5+6=6+7+8=10+11,那么题目要求输出的连续序列为1-6、6-8和10-11。假设计算出的某个序列为m-n,那么这个序列中正数的个数为(n-m+1),这里,可以参照高斯 阅读详情

Description:

lanxisi带领着他的拆迁队来整治一个街道。这个街道由N个旧房子组成,从左到右编号为1..N。每个旧房子i有一个正整数的美观度Ai。
  lanxisi希望整个街道从左到右美观度严格递增,也就是保证Ai<Aj(i<j)。但是旧的街道明显不符合这个要求,于是lanxisi希望拆迁一些旧房子并在原地建立新房子来满足这一要求。但是与很多拆迁队一样,很多钉子户拒绝拆迁。所以lanxisi希望能保留最多的旧房子来满足某些钉子户,当然,保留一个旧房子需要给房子主人Bi的赔偿金。最后,总花费=整治好以后所有房子美观度之和+赔偿金之和。新的美观值也都必须是正整数。
  现在,请你求出lanxisi最多能保留多少旧房子和整治这个街道所需要的最少总花费(当然是在保留旧房子最多这个前提下的)。
 1<=N<=100000,0<=Ai,Bi<=100000000。

:题解:

先思考最朴素的O(n^2)dp是如何运作的。

fi是以i结尾最长不下降子序列的长度。
si是以i结尾的最小总花费。

fi=max(fi+1)j<i,a[j]<a[i],a[j]−j<=a[i]−i)
si=min(sj+…)(j<i,a[j]<a[i],a[j]−j<=a[i]−i,f[i]=f[j]+1)

如果有:
j<k,a[j]−j<=a[k]−k
那么一定有:
a[j]<a[k]

所以可以去掉一个条件。

这样就可以可以用O(n log n)的时间按照a[i]-i为关键字dp出f。

接着按f分层dp。

打省略号的部分可以化成三部分:
1.和j有关的部分
2.和i有关的部分
3.(a[j]-j)*i

在同一层中,如果序号j递增,则a[j]-j递减,不然它们就不会在同一层。

所以满足斜率优化形式。

但是并没有这么简单。

注意条件除了a[j]-j<=a[i]-i,还有j<i。

在分层后,序号并不是递增,高层的序号可能比低层小,而且a[j]-j同样只是在同一层内有序,不同层的大小关系无法判断。

简化问题后可以看作对一层的连续的一段j求
min(sj+(a[j]−j)∗i)

到这里可以同线段树的分治思想来拆分询问。

对同一层建个线段树,每个点存这个点所代表的区间的j的单调栈。

因为线段树只有log层,每层最多n个,所以总共是O(nlogn)。

接着把询问利用线段树拆成log段,每一段二分又是log,总复杂度是O(nlog2n)。

Code:

#include<cstdio>
#include<algorithm>
#define ll long long
#define ld long double
#define fo(i, x, y) for(ll i = x; i <= y; i ++)
#define fd(i, x, y) for(ll i = x; i >= y; i --)
#define min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;

const ll N = 1e5 + 5;

ll n, a[N], b[N], f[N], l[N], ml;
ll s[N], g[N], h[N];
ll final[N], next[N], to[N], tot;
ll st, en, ans;

ld ji(ll k, ll b, ll l, ll r) {
    return (ld) (r - b) / (ld)(k - l);
}
ld jj(ll x, ll y) {
    return ji(h[x], g[x], h[y], g[y]);
}

int d[N * 30], d0, z[N];
struct tree {
    int l, r;
} t[N * 4];

void Build(int i, int x, int y) {
    t[i].l = d0 + 1; t[i].r = d0;
    fo(j, x, y) {
        while(t[i].l < t[i].r && jj(d[t[i].r - 1], d[t[i].r]) > jj(d[t[i].r], z[j]))
            t[i].r --;
        d[++ t[i].r] = z[j];
    }
    d0 = t[i].r;
    if(x == y) return;
    int m = x + y >> 1;
    Build(i + i, x, m); Build(i + i + 1, m + 1, y);
}

ll xx;

ll find(int i, int x, int y, int l, int r) {
    if(l > r) return 1e18;
    if(x == l && y == r) {
        int as = t[i].l;
        for(int p = t[i].l + 1, q = t[i].r; p <= q; ) {
            int m = p + q >> 1;
            if(jj(d[m - 1], d[m]) <= xx) as = m, p = m + 1; else q = m - 1; 
        }
        return h[d[as]] * xx + g[d[as]];
    }
    int m = x + y >> 1;
    if(r <= m) return find(i + i, x, m, l, r);
    if(l > m) return find(i + i + 1, m + 1, y, l, r);
    ll p = find(i + i, x, m, l, m), q = find(i + i + 1, m + 1, y, m + 1, r);
    return min(p, q);
}

int main() {
    scanf("%lld", &n);
    fo(i, 1, n) scanf("%lld", &a[i]);
    fo(i, 1, n) scanf("%lld", &b[i]);
    ml = 0; l[0] = 0;
    fo(i, 1, n) {
        if(a[i] - i < 0) {
            f[i] = 0; continue;
        }
        for(ll L = 1, r = ml; L <= r; ) {
            ll m = L + r >> 1;
            if(l[m] <= a[i] - i) f[i] = m, L = m + 1; else r = m - 1;
        }
        f[i] ++;
        if(f[i] > ml) l[++ ml] = a[i] - i;
        l[f[i]] = min(l[f[i]], a[i] - i);
    }
    fd(i, n, 1) next[++ tot] = final[f[i]], to[tot] = i, final[f[i]] = tot;
    fo(l, 1, ml) {
        z[0] = 0; d0 = 0;
        for(ll y = final[l - 1]; y; y = next[y])
            z[++ z[0]] = to[y];
        if(z[0]) Build(1, 1, z[0]);
        int st = 1, en = 0;
        for(ll ii = final[l]; ii; ii = next[ii]) {
            ll x = to[ii]; xx = x;
            while(en < z[0] && z[en + 1] < x) en ++;
            while(st <= en && a[z[st]] - z[st] > a[x] - x) st ++;
            s[x] = (a[x] - x >= 0 && l == 1) ? (b[x] + x * (x - 1) / 2) : 1e18;
            ll p = find(1, 1, z[0], st, en) + x * (x - 1) / 2 + b[x];
            s[x] = min(s[x], p);
            g[x] = s[x] - a[x] * x + (x + 1) * x / 2;
            h[x] = a[x] - x;
        }
    }
    ans = 1e18;
    fo(i, 1, n) if(f[i] == ml)
        ans = min(ans, s[i] + (n - i + 1) * a[i] + (n - i) * (n - i + 1) / 2);
    printf("%lld %lld", ml, ans);
}
【QMIX】一种基于Value-Based多智能体算法 文章目录1. QMIX 解决了什么问题(Motivation)2. QMIX 怎样解决团队收益最大化问题(Method)2.1 算法大框架 —— 基于 AC 框架的 CTDE(Centralized Training Distributed Execution) 模式 QMIX 是一种基于 Value-Based 的多智能体强化学习算法(MARL),其基本思想来源于 Actor-Critic 与 DQN 的结合。使用中心式学习(Centralized Learning)分布式执行(Distributed 阅读详情

相关推荐

航空机载总线网络概述

1.机载总线网络概述 现代战斗机的航空电子系统是航空电子技术经历了半个多世纪的漫长演变和不断进步的结果。航空电子系统结构的每次变化,其核心的机载总线网络技术也不断跨上新台阶,而且每次变革都能使飞机性能得到大幅提升。现代飞机的飞行与作战任务包括起飞、巡航、飞行控制、目标搜索、识别跟踪、火控计算、武器投射、制导、电子战、通信等,都需要航空电子系统承担,航空电子系统是现代战斗机的“大脑”和“神经中枢”,机载总线网络则是其关键的“神经网络”。在机载通讯领域发展过程中,具有代表性的典型总线有ARINC429、1553

qq_41854911的博客 1万+

[国家集训队2011]拆迁队 解题报告

题目: http://cojs.tk/cogs/problem/problem.php?pid=1859 lanxisi带领着他的拆迁队来整治一个街道。这个街道由N个旧房子组成,从左到右编号为1..N。每个旧房子i有一个正整数的美观度Ai。 lanxisi希望整个街道从左到右美观度严格递增,也就是保证Aij(i 现在,请你求出lanxisi最多能保留多少旧房子和整治这个街道所需要的最少总

uKJLThHU$(eQ 922

VH6501实战:手把手教你用CANoe脚本精准触发CAN总线干扰(附避坑点)

本文详细介绍了使用VH6501和CANoe脚本精准触发CAN总线干扰的实战技巧,包括触发位置控制、ValidityMask配置和干扰序列设置等关键步骤。通过具体代码示例和常见问题排查指南,帮助工程师避开实际应用中的常见陷阱,提升CAN总线干扰测试的准确性和效率。

weixin_33709219的博客 370

【bzoj2149】拆迁队

似乎又是一道cdq维护dp 这题首先要按照d[i]=a[i]-i的值分层dp。 在cdq分治中,相当于前一层dp为修改,当前层为询问。 考虑如何维护[l,mid]的修改对于[mid+1,r]的询问的影响。 列出dp方程发现只要寻找最小值即可。 然后就在维护的凸包上三分最小值的位置就好。 #include #define gc getchar() #define N 120009 #d

wzf_2000的博客 510

【速通版!语义通信基础与前沿学习计划】

🧠语义通信基础与前沿学习计划

dally2的博客 1413

告别专业软件!用QGIS+GDAL免费搞定S-57电子海图,附全套符号库和样式文件

本文详细介绍了如何利用免费开源工具QGIS和GDAL处理S-57电子海图,包括数据转换、符号库配置和专业可视化方案。通过实战指南,用户无需依赖昂贵的商业软件,即可实现从S-57到SHP的转换及专业级海图制作,特别适合预算有限的个人和小型机构。

weixin_33701294的博客 391

【2011集训队出题】Construct

Description:   随着改革开放的深入推进……   小T家要拆迁了……   当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户。   由于小T的家位于市中心,拆迁工作又难以进行,有关部门决定先把小T家用围栏围起来,以免影响市容。考虑到要建设资源节约型社会,他们希望所用的围栏长度越短越好,由于市中心寸土寸金,在围栏长度最短的情况下,围

Cold_Chair的博客 421

YOLO模型使用jupyterlab的方式进行预测/推理(示例)

首先相信很多使用过python的人都或多或少地了解过这个应用。是一个开源Web应用程序,可让用户创建和共享包含实时代码、公式、可视化和叙述文本的文档。用途包括:数据清理和转换、数值模拟、统计建模、等等。而Jupyter Lab则是Jupyter的下一代笔记本界面。是一个基于Web的交互式开发环境,用于Jupyter notebook、代码和数据。非常灵活,可支持数据科学、科学计算和机器学习领域的广泛工作。是可扩展和模块化的,其可编写插件来添加新组件并与现有组件相集成。

ocean00008899的博客 902

【2011集训队出题】Digit

Description:   在数学课上,小T又被老师发现上课睡觉了。为了向全班同学证明小T刚才没有好好听课,数学老师决定出一道题目刁难一下小T,如果小T答不出,那么……   情节就按照俗套的路线发展下去了,小T显然无法解决这么复杂的问题,可怜的小T只能向你求助:   题目是这样的:   求一个满足条件的n位数A(不能有前导0),满足它的数字和为s1,并且,A*d的数字和为s2.   1

Cold_Chair的博客 771

网络安全面试题

在当今社会网络安全行业越来越发达,也有越来越多的人去学习,为了更好地进行工作,除了学好知识外还要应对企业的面试。 所以在这里我归总了一些网络安全方面的常见面试题,希望对大家有所帮助。 windows常见 1:描述tcp/udp的区别及优劣,及其发展前景 TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能...

fzx_hsaj的博客 6万+

GPT Researcher 的win docker安装攻略

github网址是:https://github.com/assafelovic/gpt-researcher/blob/master/README-zh_CN.md。使用 Docker 运行 AI-Researcher 项目的。因为docker安装方法不够清晰,因此写一个使用方法。打开设置——docker engine ,增加代码。如有其他问题,可提供错误截图或日志进一步排查!

weixin_43818488的博客 1125

【2011集训队出题】happiness

Description  高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。   作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。Input  第一行两个正整数n,m。   接下来是六个矩

Jacky35 694

链接文件及功能安全:英飞凌官方文档摘录 - 基于Tasking与AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解

Data区域是用来存放带初始化值的全局变量,在link文件中,这个区域有两种类型,预先定义的区域和默认区域。预先定义的Data区域,例如.data.Ifx_Ssw_Tc1和.data.Cpu1_Main.*,在cpu1_main.c中如果定义了一个带初始化值的变量,则它会放在DSRAM1中的.data.Cpu1_Main.*段中。

梦想技术家 539

JZOJ 1980. 【2011集训队出题】Construct

JZOJ 1980. 【2011集训队出题】Construct Description  随着改革开放的深入推进……   小T家要拆迁了……   当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户。   由于小T的家位于市中心,拆迁工作又难以进行,有关部门决定先把小T家用围栏围起来,以免影响市容。考虑到要建设资源节约型社会,他们希望所用的围的情况下,围出的多边

Felix-Lee的博客 351

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

输入一个正整数n,输出所有和为n的连续正整数序列

public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (true) { System.out.println("please input a positive integer: "); int n = sc.nextInt(); getSubInteger...

archimedes123的专栏 8158

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

1.数列求和3

Description 正整数序列是指从1开始的序列,例如{1,2,3,4,......} 给定一个整数 n,现在请你求出正整数序列 1 - n 的和。 Input 输入一个整数 n 。(1 <= n <= 1000) Output 输出一个整数,即为正确答案。 Sample Input 2 Output 3 #include<stdio.h> int main() { int n,i=1,sum=0; scanf("%d",&amp..

m0_56703229的博客 355

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C 数列求和3 SDUT

Description 正整数序列是指从1开始的序列,例如{1,2,3,4,…} 给定一个整数 n,现在请你求出正整数序列 1 - n 的和。 Input 输入一个整数 n 。(1 <= n <= 1000) Output 输出一个整数,即为正确答案。 Sample Input 2 Output 3 **方法一:公式:^_^ ^_^ ^_^ ^_^ 偷个懒 #includ...

zhangzhaolin12的博客 2274

NOIP2017 Day2_T3 列队

题目大意:众人皆知。题解:考场时打SBT打傻了,被卡爆了。这就是个傻逼线段树能过的东西,不要问我问为什么能跑这么快?每一行用线段树维护前m-1个。最后一列独立开来。查询用线段树二分。可以直接预开6e5。完。Code:#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define fo(i, x,

Cold_Chair的博客 1425

小喵喵的新家

JZOJ3441 小喵喵的新家Description小喵喵和小聪聪从小就是好朋友 ,他们经常在一起玩耍 。如今小喵已经厌倦了自己居住的环境,想请小聪聪为她建一个新家。小喵喵天生多才多艺,对多种乐器颇有研究。对于生活中常见的图形,她对圆形很感兴趣,因此小聪聪决定为她建一个圆形的新家。我们设新家在一个平面直角坐标系上,其中新家的圆心为平面直角坐标系的原点。小聪聪有一把神奇的剪刀,他定义了一个值m,以等分

Cold_Chair的博客 1353

GDKOI 2016 魔卡少女

GDKOI2016 魔卡少女 Description 君君是中山大学的四年级学生。有一天在家不小心开启了放置在爸爸书房中的一本古书。于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地。这时一只看上去四不像的可爱生物“封印之兽”可鲁贝洛斯从书中钻了出来,它告诉君君书中的牌叫“库洛牌”,现在散落各地已实体化,要君君将它们全部再次封印起来,以免危害世界

Cold_Chair的博客 1207

【NOI2014模拟】数列

Description:给定一个长度为n的正整数数列a[i]。定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|。你需要写一个程序支持2种操作(k都是正整数):Modify x k:将第x个数的值修改为k。Query x k:询问有几个i满足f(x,i)<=k。询问不仅要考虑当前数列,还要考虑任意历史版本,即统计任意位置上出现过的任意数值与当前的a[x]的

Cold_Chair的博客 1188

【NOI2018】你的名字

题目大意: 一开始给出字符串S。 Q次询问,每次给出l,r和字符串T。 问T有多少不同子串不是S[l…r]的子串。 ∑∣T∣&amp;lt;=1e6,∣S∣,∣T∣&amp;lt;=5e5\sum|T|&amp;lt;=1e6,|S|,|T|&amp;lt;=5e5∑∣T∣&lt;=1e6,∣S∣,∣T∣&lt;=5e5 题解: 不同子串一类问题优先考虑SAM。 感觉这题考的更多是对SAM的理解。...

Cold_Chair的博客 1083

线段树合并——hdu 5709 Claris Loves Painting

前言: 清冬上不会线段树合并又没想到启发式合并亏了50+…… 题目大意: 题目链接. 给出一个一棵以1为根的树。 每个点有一个颜色。 每次询问给出x,d,为以x为根的子树中,到x距离小于等于d的点有多少种不同的颜色。 题解: 感觉这题还是个线段树合并的裸题吧(也没有这么裸)。 先谈谈自己对线段树合并的感受。 线段树应该都得是动态开点的线段树,不然合并不就是O(n)的吗? 给出

Cold_Chair的博客 866

【NOIP2017提高A组模拟7.13】好数

题目大意:我们定义一个非负整数是“好数”,当且仅当它符合以下条件之一: 1.这个数是0或1 2.所有小于这个数且与它互质的正整数可以排成一个等差数列例如,8就是一个好数,因为1,3,5,7排成了等差数列。 给出N个非负整数,然后进行如下三个操作: 1.询问区间[L,R]有多少个好数 2.将区间[L,R]内所有数对S取余(S≤1000000) 3.将第C个数更改为X 题解:首先我们打个表

Cold_Chair的博客 862

JZOJ 100019【NOI2017模拟6.26】A

题目大意: 1<=n<=10^5题解:假设有两点u,v其中v = i *u(2<=i<=n/u) 如果有一路径a,b经过了它们两,那么a,b就是不合法的路径。我们可以尝试找出这样的路径。先求出树的dfs序,设为dfn[x] end[x]为x的子树中最大的dfn[x’]使dfn[u] < dfn[v]:1.u是v的祖先:设g为u到v的路径中距离u最近的那个点。 则跨过u,v的路径a,b(dfn

Cold_Chair的博客 809

【NOIP2013模拟联考7】最长上升子序列

Description:维护一个序列,使它可以进行下面两种操作: 1.在末尾添加一个数字x 2.将整个序列变成第x次操作后的样子 在每次操作后,输出当前序列的最长上升子序列的长度 序列初始时为空. n<=500000且所有输入的数字都是长整型范围内的非负整数题解:显然可以离散一下数字直接套用可持久化线段树,区间查询,单点修改。 也可以设fif_i表示长度为i的最小结尾,接着强行可持久化线

Cold_Chair的博客 744
上一篇: 【2011集训队出题】信号塔
下一篇: 【中山市选2011】辽哥游戏
Cold_Chair
博客等级 码龄11年 158粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值