Greedy Termite

不是很难,就是写着有点费劲。

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
typedef long double lf;
typedef pair<int,int>P;
const int inf = 0x7f7f7f7f;
const int N = 1e5+10;
const ll mod = 2012;
const double PI = 3.14;int read(){char ch=getchar();int x=0,f=1;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int random(int n){return(ll)rand()*rand()%n;}ll x[N],h[N];
ll tree1[N<<5],tree2[N<<5];
ll lazy1[N<<5],lazy2[N<<5];
ll x1,x2;void pushup(int rt){if(tree1[2*rt] > tree1[2*rt+1]){tree1[rt] = tree1[2*rt];lazy1[rt] = lazy1[2*rt];}if(tree1[2*rt] < tree1[2*rt+1]){tree1[rt] = tree1[2*rt+1];lazy1[rt] = lazy1[2*rt+1];}if(tree1[2*rt] == tree1[2*rt+1]){tree1[rt] = tree1[2*rt];lazy1[rt] = lazy1[2*rt+1];}if(tree2[2*rt] > tree2[2*rt+1]){tree2[rt] = tree2[2*rt];lazy2[rt] = lazy2[2*rt];}if(tree2[2*rt] < tree2[2*rt+1]){tree2[rt] = tree2[2*rt+1];lazy2[rt] = lazy2[2*rt+1];}if(tree2[2*rt] == tree2[2*rt+1]){tree2[rt] = tree2[2*rt];lazy2[rt] = lazy2[2*rt];}
}
void build(int rt,int left,int right){if(left == right){tree1[rt] = h[left]+x[left];lazy1[rt] = x[left];tree2[rt] = h[left]-x[left];lazy2[rt] = x[left];return;}int mid = (left+right)/2;build(2*rt,left,mid);build(2*rt+1,mid+1,right);pushup(rt);
}
void update(int rt,int left,int right,int k){if(left == right){tree1[rt] = tree2[rt] = -1e18;return;}int mid = (left+right)/2;if(k <= mid) update(2*rt,left,mid,k);else update(2*rt+1,mid+1,right,k);pushup(rt);
}
ll querytree1(int rt,int left,int right,int l,int r){if(left >= l && right <= r){return tree1[rt];}ll cnt = -1e18;int mid = (left+right)/2;if(l <= mid) cnt = max(cnt,querytree1(2*rt,left,mid,l,r));if(r > mid) cnt = max(cnt,querytree1(2*rt+1,mid+1,right,l,r));return cnt;
}
ll querytree2(int rt,int left,int right,int l,int r){if(left >= l && right <= r){return tree2[rt];}ll cnt = -1e18;int mid = (left+right)/2;if(l <= mid) cnt = max(cnt,querytree2(2*rt,left,mid,l,r));if(r > mid) cnt = max(cnt,querytree2(2*rt+1,mid+1,right,l,r));return cnt;
}
void querylazy1(int rt,int left,int right,int l,int r,ll t){if(left >= l && right <= r){if(tree1[rt] == t){x1 = max(x1,lazy1[rt]);}return;}int mid = (left+right)/2;if(l <= mid) querylazy1(2*rt,left,mid,l,r,t);if(r > mid) querylazy1(2*rt+1,mid+1,right,l,r,t);
}
void querylazy2(int rt,int left,int right,int l,int r,ll t){if(left >= l && right <= r){if(tree2[rt] == t){x2 = min(x2,lazy2[rt]);}return;}int mid = (left+right)/2;if(l <= mid) querylazy2(2*rt,left,mid,l,r,t);if(r > mid) querylazy2(2*rt+1,mid+1,right,l,r,t);
}
int main(){/*/and((unsigned)time(0));//freopen("out.txt","w",stdout);//freopen("in.txt","r",stdin);\*/int n = read(),root = read();for(int i = 1;i <= n;i++){x[i] = read();h[i] = read();}build(1,1,n);ll ans = 0;for(int i = 1;i < n;i++){ll ma1 = -1e18,ma2 = -1e18;x1 = -1e18;x2 = 1e18;if(root-1 >= 1){ma1 = querytree1(1,1,n,1,root-1);querylazy1(1,1,n,1,root-1,ma1);ma1 -= x[root];}if(root+1 <= n){ma2 = querytree2(1,1,n,root+1,n);querylazy2(1,1,n,root+1,n,ma2);ma2 += x[root];}update(1,1,n,root);if(ma1 > ma2){ans += abs(x[root]-x1);root = lower_bound(x+1,x+1+n,x1)-x;//  cout<<root<<endl;}if(ma1 < ma2){ans += abs(x[root]-x2);root = lower_bound(x+1,x+1+n,x2)-x;}if(ma1 == ma2){if(abs(x[root]-x1) <= abs(x[root]-x2)){ans += abs(x[root]-x1);root = lower_bound(x+1,x+1+n,x1)-x;}else {ans += abs(x[root]-x2);root = lower_bound(x+1,x+1+n,x2)-x;}}//    cout<<root<<endl;}cout<<ans<<endl;return 0;
}

问题 J: Greedy Termite相关推荐

  1. 【upc】2020年秋季组队训练赛第十二场J Greedy Termite | 删点线段树

    状态 题目描述 There are n wooden rods vertically placed over a horizontal line. The rods are numbered 1 th ...

  2. 石油大--2020年秋季组队训练赛第十二场----J、Greedy Termite(线段树)

    题面: 题意: 给定正整数 nnn 和起始位置 sss. nnn 表示有 nnn 个杆子,每个杆子由属性 (xi,hi)(x_i,h_i)(xi​,hi​) 构成,表示在 xix_ixi​ 处有一根高 ...

  3. Arithmetic_Thinking -- greedy algorithm

    贪心算法--就是一种寻找局部最优解的情况,然后整合成整体最优解的情况 简单的例子:买菜的找钱,现在有1元,5角,1角的硬币,要找给别人2元7角,现在是怎么才能以最少的硬币量找给别人,肯定是先来两个1元 ...

  4. c2java Greedy 之任务调度

    近期调试一个javaproject的时候,我遇到不是期望的输出结果时.是这么干的: A1凝视掉抛出的异常: A2加打印对照异常输入和正常输入. A3进一步加打印缩小范围. 事实上仅仅需:B1静下心来细 ...

  5. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

    文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...

  6. Greedy is Good

    作者:supernova 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=greedyAlg Joh ...

  7. USACO题解——Section 1.2——Greedy Gift Givers

    题目地址:https://train.usaco.org/usacoprob2?a=BGOMbIJsisd&S=gift1. 或者我的OJ网站,http://47.110.135.197/pr ...

  8. greedy策略求解活动选择问题 ActivitySelectProblem

    活动选择问题:有N个活动,仅安排一个人去完成,求一个人在不限时的情况下最多能完成几个活动,要求:活动包含开始时间和结束时间,活动的时间点不能变,就是说到时了,到点的活动必须开始. 这个问题为什么能够用 ...

  9. 贪心算法(Greedy Algorithms)

    1.贪心法的设计思想 贪心算法在解决问题的策略上目光短浅, 只根据当前已有的信息就做出选择,而且 一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的 ...

最新文章

  1. OpenCvSharp用掩膜来实现圆形的ROI区域
  2. 记今日访问网页总是报nginx 403的解决
  3. java 集合类源码分析--collections
  4. 替换弹窗中字段显示的值
  5. session实现验证码功能
  6. VB实现6大排序算法---动态过程展示(建议收藏)
  7. 自定义指令监听多个div_Vue 3 | 自定义指令的新玩法
  8. 常见的网页布局(HTML、CSS)
  9. CentOS 6.5忘记root密码,怎么办?
  10. multisim扩大工作区_利用Multisim 10仿真软件对共射投放大电路进行了计算机辅助设计和仿真...
  11. BMP(DIB)图片格式
  12. python课程计算bmi_Python第十一课 计算体脂率1.0
  13. Android 防火墙 知乎,知乎客户端下午瘫痪,都是第三方防火墙变更害的
  14. 【Wordpress主题】Sakuraio主题的使用与优化
  15. 父母不会用智能机?这几个功能可要教会他们
  16. VS2013 简单MFC应用以及teechart使用方法
  17. randon变换(拉东变换)
  18. 【学习笔记15】JavaScript的函数
  19. 基于ResNet50网络的简单垃圾分类网络
  20. Faiss 相似度搜索使用余弦相似性

热门文章

  1. 清华魏少军:人工智能时代中国芯片设计的应对之道
  2. Tiled有java版本吗_java - TMX Tiled Andengine Android-致命意外- - 堆栈内存溢出
  3. 使用 Fiddler 抓包PC微信小程序
  4. 蜘蛛牌窗口-游戏规则和说明
  5. React条件渲染、列表渲染和组件传值
  6. 这是我的错吗/????
  7. 360 电脑重装系统服务器,360!系统重装大师重装完后C盘空间不足解决方法
  8. Kali xfce 安装主题
  9. java毕业设计人职匹配推荐系统(附源码、数据库)
  10. 适用于 Windows 电脑的 6 款最佳视频转换器