P3644 [APIO2015]八邻旁之桥(中位数、堆)

前言

卡了很长时间的一个题。
一开始 k=1 的关键性质把握就跑偏了,后面基本在硬做…
关键就是一直把每个人当成一条线段作为整体在看,使问题很复杂…
最后用 three-pointers 磕磕绊绊搞出来了。
但是根本不用!

解析

这题关键就在于:k=1k=1k=1 怎么做?
我直接暴力枚举桥的位置,因此 k=2k=2k=2 就没了
这个贡献可以拆分为 家-桥-公司。
所以问题转化成:给出 2n 个点,求一个点使所有点到其距离和最小。
显然是中位数。

接下来考虑 k=2k=2k=2 怎么做?
我们尝试维护两座桥对应的集合,一开始A为空、B为全集,不断把B集合的元素扔到A里,动态维护代价和取min即可。
手玩一下,不难发现按照左右端点坐标和为关键字排序扔即可。
然后就是动态维护中位数了。维护两个堆即可轻松实现动态添加元素维护中位数,B集合的删除也可以反着做化删为加。
然而懒得写了,还是贴的 three pointers

代码

#include<bits/stdc++.h>
#include<string>
using namespace std;
#define ll long long
#define ull unsigned ll
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}const int N=2e5+100;
const int mod=998244353;
const int inf=1e9;bool mem1;inline ll ksm(ll x,ll k){ll res=1;while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}int n,m;int q[N],cnt;
int x[N],y[N];
char c1[N],c2[N];ll bas,ans=1e18;
struct seg{int l,r,id;
}p[N];
bool operator < (const seg &x,const seg &y){return q[x.l]+q[x.r]<q[y.l]+q[y.r];
}
int num;
vector<seg>l[N],r[N];
int num0l[N],num0r[N],num1l[N],num1r[N];
bool tag[N];
void work1(){ll sl(0),sr(0),nl(0),nr(0);for(int i=1;i<=cnt;i++){nr+=num0l[i];for(seg o:l[i]){sr+=q[o.l];}}for(int i=1;i<=cnt;i++){nr-=num0l[i-1];for(seg o:l[i-1]){sr-=q[o.l];}nl+=num0r[i];for(seg o:r[i]){sl+=q[o.r];}    ans=min(ans,sr-nr*q[i]+nl*q[i]-sl);//printf("i=%d nl=%lld sl=%lld nr=%lld sr=%lld ans=%lld\n",q[i],nl,sl,nr,sr,ans);}printf("%lld\n",ans*2+bas);
}
void work2(){ll sxl(0),nxl(0),sxr(0),nxr(0),syl(0),nyl(0),syr(0),nyr(0),x=1,y=1;sort(p+1,p+1+num);for(int i=1;i<=num;i++){if(p[i].l>1){syr+=q[p[i].l];nyr++;}    }while(y<cnt&&nyl+num0r[y]<nyr){for(seg o:r[y]){syl+=q[o.r];nyl++;}++y;for(seg o:l[y]){syr-=q[o.l];nyr--;}}for(int i=1;i<=num;i++){tag[p[i].id]=1;if(p[i].r<y){syl-=q[p[i].r];nyl--;}if(p[i].l>y){syr-=q[p[i].l];nyr--;}if(p[i].l>x){sxr+=q[p[i].l];nxr++;}if(p[i].r<x){sxl+=q[p[i].r];nxr--;}num0r[p[i].r]--;num1r[p[i].r]++;num0l[p[i].l]--;num1l[p[i].l]++;//printf("  (%lld %lld) (%lld %lld)\n",nyl,syl,nyr,syr);while(y<cnt&&nyl+num0r[y]<nyr){for(seg o:r[y]){if(tag[o.id]) continue;syl+=q[o.r];nyl++;}++y;for(seg o:l[y]){if(tag[o.id]) continue;syr-=q[o.l];nyr--;}}while(x<cnt&&nxl+num1r[x]<nxr){      for(seg o:r[x]){if(!tag[o.id]) continue;sxl+=q[o.r];nxl++;}++x;for(seg o:l[x]){if(!tag[o.id]) continue;sxr-=q[o.l];nxr--;}//printf("")}ans=min(ans,syr-nyr*q[y]+nyl*q[y]-syl+sxr-nxr*q[x]+nxl*q[x]-sxl);//printf("(%d %d) x=%d y=%d %lld %lld\n",q[p[i].l],q[p[i].r],q[x],q[y],syr-nyr*q[y]+nyl*q[y]-syl,sxr-nxr*q[x]+nxl*q[x]-sxl);//printf("  (%lld %lld) (%lld %lld) ans=%lld\n",nxl,sxl,nxr,sxr,ans);    //puts("");}debug("ans=%lld\n",ans);printf("%lld\n",ans*2+bas);
}bool mem2;
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endif//debug("mem=%.4lf\n",abs(&mem2-&mem1)/1024./1024);m=read();n=read();for(int i=1;i<=n;i++){scanf(" %c%d %c%d",&c1[i],&x[i],&c2[i],&y[i]);if(x[i]>y[i]) swap(x[i],y[i]);q[++cnt]=x[i];q[++cnt]=y[i];}sort(q+1,q+1+cnt);cnt=unique(q+1,q+1+cnt)-q-1;  for(int i=1;i<=n;i++){x[i]=lower_bound(q+1,q+1+cnt,x[i])-q;y[i]=lower_bound(q+1,q+1+cnt,y[i])-q;bas+=q[y[i]]-q[x[i]];if(c1[i]!=c2[i]){++bas;num0l[x[i]]++;num0r[y[i]]++;++num;l[x[i]].emplace_back((seg){x[i],y[i],num});r[y[i]].emplace_back((seg){x[i],y[i],num});p[num]=(seg){x[i],y[i],num};}}if(m==1) work1();else work2();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尝试:Script Lab,开发模式之知识储备//SL02

前期00&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具 //SL01本期02&#xff1a;尝试&#xff1a;Script Lab&#xff0c;开发模式之知识储备 //SL02项目特点适…

【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

TOC 素性测试是检验一个给定的整数是否为素数的测试。 最简单的就是用 n\sqrt{n}n​ 以内的数去试除。这是确定性的算法&#xff0c;即能准确知道 nnn 是否为质数。 但今天学习的是一种随机算法。 Fermat 小定理 如果 ppp 是一个质数&#xff0c;且 a%p≠0a\%p≠0a%p​0…

Hash Function

Hash Function 文章目录题意&#xff1a;题解&#xff1a;代码NTT代码FFT代码题意&#xff1a; 给定n个互不相同的数&#xff0c;找一个最小的模域&#xff0c;使得它们在这个模域下互不相同。n<5e5 题解&#xff1a; 考虑两个数a和b&#xff0c;a与b模m余数相同&#xf…

P5321 [BJOI2019]送别(LCT)

Foreword\text{Foreword}Foreword 肝了一下午一晚上的码农题… &#xff08;主要就是在 debug&#xff0c;LCT 太难 de 了…&#xff09; 感谢 M_sea&#xff0c;在调无可调认为LCT会不会不可做时&#xff0c;我看到了他的题解&#xff0c;几乎一样的思路&#xff0c;给了我继…

WebApi网关之Bumblebee和Ocelot性能对比

Bumblebee是基于.net core 2.1开发的WebApi网关组件&#xff0c;由于Bumblebee所追求的轻量化和性能&#xff0c;所以它并没有像Ocelot那样从asp.net core上进行扩展&#xff1b;而是构建在BeetleX.FastHttpApi之上&#xff0c;主要原因BeetleX.FastHttpApi有着更轻量化和高性能…

【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)

本题已自我实现。但仍归于无码专区 problem 求 ∑i1n−1i⨁(n−i)\sum_{i1}^{n-1}i\bigoplus (n-i)∑i1n−1​i⨁(n−i)。 20%,n≤1e6;;50%,n≤1e9;;70%,n≤1e18;;100%,n≤1050020\%,n\le 1e6;;50\%,n\le 1e9;;70\%,n\le 1e18;;100\%,n\le 10^{500}20%,n≤1e6;;50%,n≤1e9;;7…

模板:常系数齐次线性递推(线性代数、多项式)

所谓常系数齐次线性递推&#xff0c;就是系数为常数的齐次线性递推。 &#xff08;逃&#xff09; 前言 sto Asta orz&#xff01; 又是一个名字高大上&#xff0c;实则小清新的算法&#xff01; 解析 考虑一个 k 次的线性递推&#xff1a; an∑i1kfian−ia_n\sum_{i1}^kf_…

2021牛客暑期多校训练营1

2021牛客暑期多校训练营1 题号题目知识点难度AAlice and Bob博弈论BBall Dropping计算几何签到CCut the TreeDDetermine the Photo Position签到EEscape along Water PipeFFind 3-friendly Integers真签到GGame of Swapping Numbers思维题&#xff0c;推导HHash FunctionFFT&a…

【无码专区12】子集和(背包dp)

此题已自我实现&#xff0c;但仍归于无码专区 本题在考场上就过了&#xff0c;所以难度并不高&#xff0c;发现性质即可。 problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​&#xff0c;他们的和为 mmm。你想对于其每一个子集 SSS&#xff0c;求出他…

Penguins

Penguins 题意&#xff1a; 有两个20*20的地图&#xff0c;有障碍物&#xff0c;两个地图各有一个小人&#xff0c;左侧地图的小人要从右下角走到右上角&#xff0c;右侧地图的小人要从左下角走到左上角&#xff0c;这两个小人是镜像移动的&#xff0c; 左侧小人右侧小人左移…

盲盒(随机概率 + 最大公约数)

盲盒problemsolutioncodeproblem 有 2n2n2n 个盲盒&#xff0c;每个盲盒有一个惊喜值 aia_iai​。 打开恰好 nnn 个盲盒&#xff0c;获得的惊喜值为这些盲盒惊喜值的最大公约数。 求能获得的最大惊喜值。 n≤1e5,ai≤1e12n\le 1e5,a_i\le 1e12n≤1e5,ai​≤1e12。 solution…

P5354 [Ynoi2017] 由乃的 OJ(树剖、位运算)

前言 当暴力思路与题解中的“暴力”不同时&#xff0c;继续想优化往往就渐行渐远了… 所以当没有头绪时&#xff0c;要勇于跳出原有的转化&#xff01; 这种位运算类型的优化似乎始终不在我的寄存器中…需要加强&#xff01; 解析 不难想到按位考虑的 O(nklog⁡2n)O(nk\log…

在 .NET Core 中运行 JavaScript

一.前言在 .NET Framework 时&#xff0c;我们可以通过V8.NET等组件来运行 JavaScript&#xff0c;不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core &#xff0c;我们如何在 .NET Core 中运行 JavaScript 呢&#xff0c;答案是使用 NodeServices。关于为何有在 .N…

I love exam HDU - 6968

I love exam HDU - 6968 题意&#xff1a; 有n个考试科目&#xff0c;现在有m套复习资料&#xff0c;每套复习资料需要花费wi天使用&#xff0c;用完提升ci的分数&#xff0c;现在还有t天复习时间&#xff0c;挂科数目不能超过p&#xff0c;问所有达到的最大分数 题解&#…

[CF1442 D] Sum(分治优化dp + 结论)

CF1442D Sumproblemsolutioncodeproblem luogu翻译 solution 部分分做法&#xff0c;预处理每组前缀和&#xff0c;暴力背包 dpdpdp 转移&#xff1a;dpi,jmax⁡{dpi−1,j−ksumi(k)∣0≤k≤l[i]}dp_{i,j}\max\Big\{dp_{i-1,j-k}sum_i(k)\ \Big|\ 0\le k\le l[i]\Big\}dpi,j…

P4338 [ZJOI2018]历史(树剖)(暴力)

前言 有点懊恼的一个题… 并没有其他那些ZJOI那么毒瘤&#xff0c;看出了关键结论&#xff0c;但最后维护卡在log条虚边的伞兵性质上了。 解析 第一眼&#xff1a;感觉根本不可做啊。 冷静一下&#xff0c;既然它还变态的带修&#xff0c;一定是可以转化成比较形式化的东西的…

Named Volume 在 MySQL 数据持久化上的基本应用

原文作者&#xff1a;春哥非常感谢春哥的投稿&#xff0c;同时也有一些感慨。初识春哥时&#xff0c;春哥是美术设计大咖。后不久&#xff0c;创业并致力于游戏开发&#xff0c;已有3年。从Unity3D到IOS&#xff08;Swift&#xff09;开发&#xff0c;从前端开发到后端以及容器…

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2) 题号题目知识点AMean Inequality签到BI Hate 1111思维CPotions (Easy Version)思维C1Potions (Hard Version)思维DKill Anton思维逆序对EOolimry and Suffix ArrayFMedian Queries CF1526A Mean Inequality 题意&#xff1a; 给你一个序列a&…

[AtCoder Regular Contest 060] E - Tak and Hotels

AT2039 [ARC060C] 高橋君とホテル / Tak and Hotelsproblemsolution - 分块code - 分块solution - 倍增code - 倍增problem luogu翻译 solution - 分块 肯定刚开始&#xff0c;我们很想暴力跳过去。事件复杂度取决于数据。 肯定不做把头拿给别人砍的事 这种跳法&#xff0…

模板:珂朵莉树

所谓珂朵莉树&#xff0c;就是珂朵莉发明的树。 &#xff08;逃 前言 在数据随机且带区间推平操作时适用&#xff0c;此时所有操作的期望颜色段数都是 O(log⁡n)O(\log n)O(logn) 的&#xff0c;可以使用暴力解决即可。 暴力即优雅。 解析 利用 set 维护颜色段&#xff1a;…