Codeforce 1311 F. Moving Points 解析(思維、離散化、BIT、前綴和)

今天我們來看看CF1311F

題目連結

題目

略,請直接看原題。

前言

最近寫1900的題目更容易不看題解了,不知道是不是較少人\(AC\)的同難度題目會比較簡單。

想法

首先注意到,如果\(x\)座標上的前後兩點\(x_i,x_j\),\(x_i<x_j\),如果\(v[x_i]>v[x_j]\),不管\(v\)是正是負,兩點一定某個時候會重疊。反之,如果\(v[x_i]\le v[x_j]\),那麼我們就需要把答案加上\(x_j-x_i\)。

而我們可能會想到用\(BIT\)來維護\(:\)到某個\(x\)座標為止,小於等於某個速度的點有多少個。但是\(-10^8\le v_i\le10^8\)實在太大了,因此我們需要離散化\(v\),把範圍縮到至少\([1,n]\)。

但是我們可能會發現,我們不只需要維護小於等於某個速度的點有多少個,還需要知道這些點和目前看的點\(x_i\)的距離的和。

因此我們可以這樣做:首先把所有\(x_i\)減去最小的\(x\)值(也就是把\(x\)陣列平移到非負座標)。這樣一來\(BIT\)維護目前有\(r\)個點的速度小於等於\(v\),且這些點的\(x\)座標和為\(p\),那麼當我們考慮\(x_j\)這個點的時候(要去找有多少在\(x_j\)之前的點的速度比\(x_j\)的速度小),只需要把答案加上\(r\times x_j-p\)即可。

注意,本題\(x\)座標沒有排序,要自己先排序過。

且這題我的程式碼中的\(PII\)是\(pair<long\ long,long\ long>\)

程式碼:

const int _n=2e5+10;
int t,n,minn=1e9;
VI vv;
PII s[_n];
namespace BIT{
int nn;PII t[_n];
void update(int x,int val){while(x<=nn)t[x].fi+=val,t[x].se++,x+=(x&-x);}
//這模板是1-base,而且update是把修改量加上去
PII query(int x){PII res={0,0};while(x>0){res.fi+=t[x].fi,res.se+=t[x].se,x-=(x&-x);}return res;}
void init(int n_){nn=n_;}
}
main(void) {cin.tie(0);ios_base::sync_with_stdio(0);
cin>>n;rep(i,1,n+1){cin>>s[i].fi;minn=min(minn,s[i].fi);}rep(i,1,n+1){cin>>s[i].se;vv.pb(s[i].se);}
sort(s+1,s+n+1);sort(all(vv));int nn=unique(all(vv))-vv.begin();
rep(i,1,n+1)s[i].se=lower_bound(vv.begin(),vv.begin()+nn,s[i].se)-vv.begin()+1;
rep(i,1,n+1)s[i].fi-=minn;
BIT::init(nn); ll ans=0;
rep(i,1,n+1){
PII res=BIT::query(s[i].se);
ans+=1ll*s[i].fi*res.se-res.fi;
BIT::update(s[i].se,s[i].fi);
}cout<<ans<<'\n';
return 0;
}

標頭、模板請點Submission看

Submission

F. Moving Points 解析(思維、離散化、BIT、前綴和)的更多相关文章

  1. D. Rescue Nibel! 解析(思維、組合、離散化、差分)

    Codeforce 1420 D. Rescue Nibel! 解析(思維.組合.離散化.差分) 今天我們來看看CF1420D 題目連結 題目 給你\(n\)個區間,求有幾種方法使得\(k\)個區間的 ...

  2. E. Enemy is weak 解析(思維、離散化、BIT、線段樹)

    Codeforce 61 E. Enemy is weak 解析(思維.離散化.BIT.線段樹) 今天我們來看看CF61E 題目連結 題目 給一個數列\(a\),求有多少\((i,j,k)\),\(i ...

  3. F. Make It Connected 解析(思維、MST)

    Codeforce 1095 F. Make It Connected 解析(思維.MST) 今天我們來看看CF1095F 題目連結 題目 給你\(n\)個點,每個點\(u\)還有一個值\(a[u]\ ...

  4. A. Peter and Snow Blower 解析(思維、幾何)

    Codeforce 613 A. Peter and Snow Blower 解析(思維.幾何) 今天我們來看看CF613A 題目連結 題目 給你一個點\(P\)和\(n\)個點形成的多邊形(照順或逆 ...

  5. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

  6. E. Tree Queries 解析(思維、LCA)

    Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...

  7. E. Xenia and Tree 解析(思維、重心剖分)

    Codeforce 342 E. Xenia and Tree 解析(思維.重心剖分) 今天我們來看看CF342E 題目連結 題目 給你一棵樹,有兩種操作,把某點標成紅色或者查詢離某點最近的紅點有多遠 ...

  8. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

  9. B. Game of the Rows 解析(思維)

    Codeforce 839 B. Game of the Rows 解析(思維) 今天我們來看看CF839B 題目連結 題目 有如下圖片所示的飛機座位\(n\)排,和\(k\)隊士兵,每隊數量不一定. ...

随机推荐

  1. 【JAVA】校招面过的信息量最大的一面

    这是我校招中面过的信息量最大的一面,本来是一个小时,最后面完一个半小时,面试官最后反馈还不错. 自我介绍 设计模式有了解吗?如何理解"宁用组合,不用继承",什么时候用组合,什么时候 ...

  2. javaweb修改表单参数---使用过滤器

    需求: 所有的字段要将空字符串转成null: 问题: 我们知道表单如果不写值的时候,传递到后台的不是null,而且是空字符串.那么怎么改成null呢? 解决: 使用过滤器,将请求的参数修改过后继续,再 ...

  3. 总结一下,selenium 自动化流程如下

    自动化程序调用Selenium 客户端库函数(比如点击按钮元素) 客户端库会发送Selenium 命令 给浏览器的驱动程序 浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令 浏览器执行命令 浏览器驱 ...

  4. Win10安装Ubuntu子系统

    相信我,这是最后一次折腾系统了qaq,以后一定开始认真用Linux编程 跟的一个博客安装,传送门:Win10安装Ubuntu子系统及图形化界面详细教程 文章是2019的,加上我装的是Ubuntu 20 ...

  5. python中浅拷贝和深拷贝的区别

    浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...

  6. Layman CSS3+H5实现上下垂直居中的几种主要方法

    方法1:通过 translate 移位来实现 H5+CSS3: <div style="width: 100%; height: 100%; margin:0; padding: 0; ...

  7. 【题解】[CEOI2004]锯木厂选址

    Link \(\text{Solution:}\) 注意到题目中的编号是倒着的,于是我们的距离要预处理的是后缀和. 考虑如何\(n^2\)搞: 设\(dp[i]\)表示选择\(i\)为第二个中转点的最 ...

  8. 查杀进程小工具——WPF和MVVM初体验

    最近因为工作需要,研究了一下桌面应用程序.在winform.WPF.Electron等几种技术里,最终选择了WPF作为最后的选型.WPF最吸引我的地方,就是MVVM模式了.MVVM模式完全把界面和业务 ...

  9. JavaScript innerTHML和createElement效率对比

    前言: 在DOM节点操作中,innerTHML和createElement都可以实现创建元素.它们实现的功能类似,但是效率却相差很大.本文分别统计用innerTHML字符串拼接方式.innerTHML ...

  10. Tensorflow学习笔记No.1

    使用tf.keras.Sequential()建立网络模型 整个过程可分为五步:1创建Sequential模型,2添加所需要的神经层,3使用.compile方法确定模型训练结构,4使用.fit方法 使 ...