【UOJ#386】【UNR#3】鸽子固定器(贪心)

【UOJ#386】【UNR#3】鸽子固定器(贪心)

题面

UOJ

题解

一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那\(m\)个东西。
考虑优化这个过程,我们枚举右端点,左端点向左移动,每次插入一个元素,用堆来维护选择的过程。这样子复杂度可以做到\(O(n^2logn)\)。

考虑继续优化这个过程,首先如果右端点一旦被弹出堆这个过程就可以终止了,这个很显然。
通过这个过程,我们也可以明白如果选择的个数不超过\(m\)个则必定是一段连续的区间。
接下来一定要选择恰好\(m\)个,如果区间内没有被选满,不难知道没有被选的一定是较小的值。
那么拿一个链表来维护剩下的元素,每次把最小值删掉,这样子每次选择的区间就是连续的了。然后我们在删的时候统计强制包含最小值的最大区间。
于是综上复杂度是\(O(nm)\)。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 200200
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
struct Node{int s,v;}p[MAX];
bool operator<(Node a,Node b){return a.s<b.s;}
bool cmp(int a,int b){return p[a].v<p[b].v;}
int n,m,ds,dv,id[MAX],lt[MAX],nt[MAX];
ll ans,s[MAX];
ll CalcS(ll x){return ds==1?x:x*x;}
ll CalcV(ll x){return dv==1?x:x*x;}
int St[MAX],tot;
int main()
{
    n=read();m=read();ds=read();dv=read();
    for(int i=1;i<=n;++i)p[i].s=read(),p[i].v=read();
    sort(&p[1],&p[n+1]);
    for(int i=1;i<=n;++i)s[i]=s[i-1]+p[i].v;
    for(int l=1;l<m;++l)
        for(int i=1;i+l-1<=n;++i)
            ans=max(ans,CalcV(s[i+l-1]-s[i-1])-CalcS(p[i+l-1].s-p[i].s));
    for(int i=1;i<n;++i)nt[i]=i+1,lt[i+1]=i;
    for(int i=1;i<=n;++i)id[i]=i;
    sort(&id[1],&id[n+1],cmp);
    for(int i=1;i<=n;++i)
    {
        int u=id[i];tot=0;
        for(int j=1,p=lt[u];j<m&&p;++j,p=lt[p])St[++tot]=p;
        reverse(&St[1],&St[tot+1]);St[++tot]=u;
        for(int j=1,p=nt[u];j<m&&p;++j,p=nt[p])St[++tot]=p;
        for(int j=1;j<=tot;++j)s[j]=s[j-1]+p[St[j]].v;
        for(int j=1;j+m-1<=tot;++j)
            ans=max(ans,CalcV(s[j+m-1]-s[j-1])-CalcS(p[St[j+m-1]].s-p[St[j]].s));
        nt[lt[u]]=nt[u];lt[nt[u]]=lt[u];
    }
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/11123649.html

时间: 2024-11-07 20:29:34

【UOJ#386】【UNR#3】鸽子固定器(贪心)的相关文章

UOJ——【UNR #1】争夺圣杯

1.题意:给一个序列,枚举长度x,然后在这个序列中所有长度为x的区间,我们求出这些区间的最大值之和并取模,最后将所有的异或起来就好啦 2.分析:听说好多人写的O(nlogn) ,特来写一发O(n) 的算法骗访问量 话说这个东西,我们对于每一个点,设这个点的值是max,我们可以求出他影响的所有区间,这个用单调栈解决即可,也就是说求出左边和右边第一个比这个点大的值的位置,设左边那个哪个位置是i,右边那个位置是j,那么我们就能得到这些区间啦,然后我们就可以随便写写就A了 ,这明显是不能AC的,那我们考

省选前的做题记录(Round2)

[CF1109B] Sasha and One More Name 先把无解情况aaabaaa.aaaaaa判掉,然后我们可以证明答案不会超过2. 对于一个回文串,两个指针从两端向内移动直到字符发生变化,在这里看一刀然后交换左右两端即为一种合法方案. 所以我们只需要判断答案是否能为\(1\),暴力判即可. [CF1109C] Sasha and a Patient Friend 假设我们有一个序列数据结构,那么先考虑每个结点需要维护哪些值才能支持合并左右儿子. 维护: 当前点时刻\(time\)

【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)

http://uoj.ac/problem/31 纪念伟大的没有调出来的splay... 竟然那个find那里写错了!!!!!!!!!!!!! 以后要记住:一定要好好想过! (正解的话我就不写了,太简单了.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #

uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Description 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT.仙人掌之类

uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心

#139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Description 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁,于是它来拜托你给自己染上一些颜色. 我们可以把它描述为一棵 n 个节点的有根树(默认树的根为 1

UOJ #390. 【UNR #3】百鸽笼

UOJ #390. [UNR #3]百鸽笼 题目链接 看这道题之前先看一道相似的题目 [PKUWC2018]猎人杀. 考虑类似的容斥: 我们不妨设处理\(1\)的概率. 我们另集合\(T\)中的所有鸽笼都在\(1\)变空之前不为空的,其它的鸽笼随便.要做到这一点,我们只需要令每个\(T\)集合中的鸽笼容量\(--\)就行了.然后我们用背包背出所有序列的方案数(不包括\(1\)),然后在将\(1\)插入序列中.插入时,将\(w_i-1\)个随便插入,然后再将一个放在序列末尾. 具体实现时,我们可以

【UOJ#308】【UNR#2】UOJ拯救计划

[UOJ#308][UNR#2]UOJ拯救计划 题面 UOJ 题解 如果模数很奇怪,我们可以插值一下,设\(f[i]\)表示用了\(i\)种颜色的方案数. 然而模\(6\)这个东西很有意思,\(6=2*3\),所以我们只需要考虑其模\(2\)和模\(3\)的结果了. 而最终答案的贡献是\(\sum_{i=1}^k A_{k}^i f[i]\),当\(i\ge 3\)的时候\(6|A_k^i\),所以我们只需要知道\(f[0],f[1],f[2]\)的值. \(f[0]\)的值?当然是\(0\)啊

uoj308 【UNR #2】UOJ拯救计划

传送门:http://uoj.ac/problem/308 [题解] 考虑枚举用了$i$所学校,那么贡献为${k \choose i} * cnt * i!$ 意思是从$k$所选$i$所出来染色,$cnt$为固定颜色顺序的染色方案,$i!$为可以交换学校位置. 考虑当$i \geq 3$的时候,贡献含有模数因子6,所以模6为0,相当于没有贡献. 当$i = 1$,显然只有$m = 0$有贡献. 对于$m = 0$我们特判,答案显然是$K^n$. 剩下$i = 2$的情况,也就是我们要判断答案是不

[BZOJ 3668&amp;UOJ #2][Noi2014]起床困难综合症(贪心)

Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因:在深邃的太平洋海底中,出现了一条名为 drd 的巨龙,它掌握着睡眠之精髓,能随意延长大家的睡眠时间.正是由于 drd 的活动,起床困难综合症愈演愈烈,以惊人的速度在世界上传播.为了彻底消灭这种病,atm 决定前往海底,消灭这条恶龙.历经千辛万苦,atm 终于来到了 drd 所在的