这算不算泄题啊。。。被kkk发现会咕咕咕吧。

题目大意:给定一个数列a,与常数n,m,k然后有m个询问,每个询问给定l,r。问在a[l]到a[r]中最少分成几段,使每段的和不超过k,如果无解,输出Chtholly

样例:

input:

5 5 7
2 3 2 3 4
3 3
4 4
5 5
1 5
2 4

output:

1
1
1
2
2

解答:

首先观察数据范围,n<=1e+6 可能的复杂度为O(mlogn).暴力能搞30分吧。

其实这题还是很妙的。我们先考虑暴力:对于[L,R],设个res,对[l,r]从左往右扫描,将res累加,当res大于k,ans++;当扫描到一个数大于k输出无解

我们可以发现这题是基于贪心的思想,使一个连续子段和尽量大。然后就有点难想了。

您觉得,这道题与树有关系吗?

还真有关系!!记得树的父亲表示法吗?对于n个节点,只要一个序列an即可表示这棵树。

先不考虑无解

对于a[x]我们设ax加到a(y-1)<=k 且ax加到a(y)>k 那么,我们将y当作x的父亲这样就可以弄一颗树

举个栗子:

样例:2 3 2 3 4

k=7 a4是a1的父亲

a4是a2的父亲

a5是a2的父亲

同时设一个root

root是a4的父亲

root是a5的父亲

我们发现,一个点从一个节点转移的另一个节点,等价于在原数列上直接跳过它的最有连续子段。

树上父亲节点的元素编号总是大于儿子

问题转化成:给定树上两点

求较低的点向上走到点p使p的元素编号大于顶一个点需要走几条边。

纯模拟跟暴力复杂度一样O(mn)

其实可以用倍增优化,有点类似于倍增求lca我们设anc[u][i]为u上方2^i个节点

有anc[u][i]=anc[anc[u][i-1]][i-1]

然后再加一个dis数组来存每个点的深度,答案就是一个点跳完后与跳之前的dis之差——差分思想

然后我们再来看如何判无解:

无解是由一种情况有a[i]>k(l<=i<=r)产生的

我们再建树时如果发现a[p]大于k那么就舍弃这个点

最后的树不止有一颗,是个森林。

第一次写博客,不懂可在下方提问。。。。

code:

// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 1000010
];
bool jg[maxn];
],head[maxn],pos;
void add(int u,int v){e[++pos]=(edge){v,head[u]},head[u]=pos;e[++pos]=(edge){u,head[v]},head[v]=pos;}
 ? x:-x;}
void dfs(int u,int ft){
    int i;
    for(i=head[u];i;i=e[i].nxt){
        int v=e[i].to;if(v==ft)continue;
        dis[v]=dis[u]+;
        gf[v]=gf[u];
        fa[v]=u;
        anc[v][]=u;dfs(v,u);
    }
}
void init(){
    int j,i;
    ;i<=n;++i)anc[i][]=anc[anc[i][]][];
    ;j<=;++j)
        ;i<=n;++i)anc[i][j]=anc[anc[i][j-]][j-];
}
int slove(int x,int y){
    ,i;if(x>y)swap(x,y);
    ;i>=;--i)
    if(anc[x][i]<=y && anc[x][i])
    ans+=dis[x]-dis[anc[x][i]],x=anc[x][i];
    return ans;
}
int main(){//freopen("in.txt","r",stdin);freopen("o1.txt","w",stdout);
    scanf("%d%d%d",&n,&m,&k);int i,j;
    ;i<=n;++i)scanf(]=<<;
    ;i<n;++i){
        ;if(a[i]>k){
            jg[i]=;continue;
        }
        ;++j){
            if(a[j]>k){
                --j;break;
            }
            res+=a[j];if(res>k){
                --j;break;
            }
        }
        add(i,j+);
    }add(n,n+);
    ;i>;--i)
        if(!gf[i]){
            gf[i]=i;dfs(i,-);
        }
        init();
    while(m--){
        int x,y;scanf("%d%d",&x,&y);
        if(gf[x]!=gf[y] || jg[x] || jg[y])printf("Chtholly\n");
        else {
            printf("%d\n",slove(x,y));
        }
    }
}
/*
5 1 10
2 5 5 2 5
1 5
*/

洛谷2018寒假集训tg第二次比赛第二题Princess Principal题解的更多相关文章

  1. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  2. 洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)

    洛谷题面传送门 题解里一堆密密麻麻的 Raney 引理--蒟蒻表示看不懂,因此决定写一篇题解提供一个像我这样的蒟蒻能理解的思路,或者说,理解方式. 首先我们考虑什么样的牌堆顺序符合条件.显然,在摸牌任 ...

  3. 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人

    蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...

  4. 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)

    垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...

  5. 【2018寒假集训 Day2】【动态规划】维修栅栏

    维修栅栏 问题描述: 小z最近当上了农场主!不过,还没有来得及庆祝,一件棘手的问题就摆在了小z的面前.农场的栅栏,由于年久失修,出现了多处破损.栅栏是由n块木板组成的,每块木板可能已经损坏也可能没有损 ...

  6. 【2018寒假集训 Day1】【位运算】桐桐的运输方案

    桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...

  7. 洛谷P3899 [湖南集训]谈笑风生(线段树合并)

    题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...

  8. 洛谷 P2717 寒假作业

    https://www.luogu.org/problemnew/show/P2717 $n \le 1004枚举区间,挨个计算,判断,时间复杂度$O(n^3)$. $n \le 5000$,预处理出 ...

  9. 洛谷 P2260 [清华集训2012]模积和 || bzoj2956

    https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...

随机推荐

  1. 1147. Heaps (30)

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  2. 4445: [Scoi2015]小凸想跑步 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...

  3. [转]HTTP中cache-control的应用及说明

    网页的缓存是由http消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为private.其作用根据 ...

  4. JS上传图片-通过FileReader获取图片的base64

    下面文章,我想要的是: FileReader这个对象,可以借助FileReader来获取上传图片的base64,就可以在客户端显示该图片了.同时,还可以把该图片的base64发送到服务端,保存起来. ...

  5. 洛谷 2822 组合数问题——质因数有关的dp

    题目:https://www.luogu.org/problemnew/show/P2822 发现 k 都是一样的.所以可以设dp[ i ][ j ]表示 n<=i,m<=j 的答案.发现 ...

  6. Spring 学习十五 AOP

    http://www.hongyanliren.com/2014m12/22797.html 1: 通知(advice): 就是你想要的功能,也就是安全.事物.日子等.先定义好,在想用的地方用一下.包 ...

  7. 2440移植内核到uboot上,打印乱码

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/51851368 可能原因: 1. 修改内核 里的晶振大小 arch\arm\mach ...

  8. 【java并发编程艺术学习】(五)第二章 java并发机制的底层实现原理 学习记录(三) 原子操作的实现原理学习

    章节介绍 主要包括 术语定义.处理器如何实现原子操作.Java如何实现原子操作: 原子(atomic)本意是 不能再进一步分割的最小粒子,“原子操作” 意为 不可被中断的一个或一系列操作. 术语定义 ...

  9. grep 不打印本身

    显示java进程的同时还会把“grep java”这个进程打印出来“root 5523 5203 0 10:49 pts/0 00:00:00 grep java”,为了不打印此行,有以下几种方式,大 ...

  10. 2、Spark基本工作原理与RDD

    一.基本工作原理 1.特点 分布式: 主要是基于内存(少数情况基于磁盘): spark与,MapReduce最大的不同在于迭代式计算: MR分为两个阶段,map和reduce,两个阶段完了我们,job ...