一、题目

点此看题

二、解法

其实这道题也不是特别难吧 \(......\) 但树状数组上二分是我第一次见。

我们把冰人和火人都按温度排序,那么考虑一个分界线 \(x\) ,问题就是求冰数组 \(x\) 对应的能量前缀和 \(\tt and\) 火数组 \(x\) 对应的能量后缀和最小值 的最大值,相同答案最大化 \(x\) 。

那么你把前缀和 \(/\) 后缀和看成关于 \(x\) 的函数,那么大概是这个样子的:

找到交点是不现实的,因为这个函数是不连续的。但是我们可以求出满足 \(y_1<y_2\) 的最大的 \(x\) ,那么这个 \(x\) 对应的答案是在取 \(y_1\) 当答案情况下最优的。如果我们再把 \(x\) 移动一点点(前提是要离散化温度),那么有 \(y_1\geq y_2\),这时候是取 \(y_2\) 当作答案的,但是注意我们还要找它对应的最大的 \(x\) 哦,然后取最大的输出即可。

直接二分实现上述过程的话是 \(O(n\log^2n)\) 的,恭喜你被卡成了 \(60\) 分。正解是树状数组上二分(线段树上二分常数太大了),你首先要知道树状数组的原理,节点 \(i\) 管辖的是 \((i-lowbit(i),i]\) 这一段区间。那么我们每次就用倍增的方式来二分,依次跳 \(2^{20},2^{19}......2^0\) ,那么根据树状数组的原理我们可以直接加上 \(a[now+2^?]\) 这个位置上树状数组的值,那么我们就维护了前缀和。

时间复杂度 \(O(n\log n)\) ,常数还很小。

\(\tt by\;the\;way\),我真的不知道为什么省选的时候我 \(60\) 分都可以写挂 \(......\)

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int M = 2000005;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int n,m,sum,op[M],t[M],x[M],y[M],p[M],b[2][M];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int op)
{
for(int i=x;i<=n;i+=lowbit(i))
b[op][i]+=y;
}
int ask(int x,int op)
{
int res=0;
for(int i=x;i>=1;i-=lowbit(i))
res+=b[op][i];
return res;
}
signed main()
{
n=read();
for(int i=1;i<=n;i++)
{
op[i]=read();t[i]=read();
if(op[i]==1)
{
x[i]=read();y[i]=read();
p[++m]=x[i];
}
}
sort(p+1,p+1+m);
m=unique(p+1,p+1+m)-p-1;
for(int i=1;i<=n;i++)
{
if(op[i]==1)
{
x[i]=lower_bound(p+1,p+1+m,x[i])-p;
if(t[i]==0) add(x[i],y[i],0);
else add(x[i]+1,y[i],1),sum+=y[i];
}
else
{
if(t[t[i]]==0) add(x[t[i]],-y[t[i]],0);
else add(x[t[i]]+1,-y[t[i]],1),sum-=y[t[i]];
}
int t1=0,f1=0,t2=0,f2=0,s0=0,s1=0;
for(int i=20;i>=0;i--)
{
int to=t1+(1<<i);
if(to>m) continue;//跳出去了
if(s0+b[0][to]<sum-s1-b[1][to])
{
s0+=b[0][to];s1+=b[1][to];
t1=to;
}
}
f1=min(s0,sum-s1);
if(t1<m)
{
f2=min(ask(t1+1,0),sum-ask(t1+1,1));//计算答案
s0=s1=0;
for(int i=20;i>=0;i--)//这里其实是找f2对应的点
{
int to=t2+(1<<i),c1=s0+b[0][to],c2=sum-s1-b[1][to];
if(to>m) continue;
if(c1<c2)
{
s0+=b[0][to];s1+=b[1][to];
t2=to;
}
else if(min(c1,c2)==f2)
{
s0+=b[0][to];s1+=b[1][to];
t2=to;
}
}
}
if(f1==0 && f2==0) puts("Peace");
else if(f1>f2) printf("%d %d\n",p[t1],2*f1);
else printf("%d %d\n",p[t2],2*f2);
}
}

[省选联考 2020 A/B 卷] 冰火战士的更多相关文章

  1. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

  2. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...

  3. luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)

    luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...

  4. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  7. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  8. [省选联考 2021 A/B 卷] 卡牌游戏

    垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...

  9. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

随机推荐

  1. MySQL 回表查询 & 索引覆盖优化

    回表查询 先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据 建表示例 mysql> create table user( -> id int(10) auto_incre ...

  2. DDL 数据定义语言

    目录 创建数据库(CREATE) 删除数据库(DROP) 修改数据库(ALTER) 创建数据表(CREATE) 数据表的数据属性 数据类型属性(Type) 其他属性(Null,Key,Default, ...

  3. Linux-源码安装及FPM打包

    目录 源码安装 制作RPM包(使用FPM工具) 安装rpm后要执行的脚本(优化版) 源码安装 这里举例Nginx的源码安装,需要前往Nginx官网找到稳定版本源码安装包下载. ## 源码安装nginx ...

  4. Dapr 交通控制示例

    Dapr 已在塔架就位 将发射新一代微服务 牛年 dotnet云原生技术趋势 Dapr是如何简化微服务的开发和部署 前面几篇文章都是从大的方面给大家分享Dapr 能帮助我们解决什么问题,微软从开源到1 ...

  5. user tracker with ETag

    user tracker with ETag 用户追踪, without cookies clear cache bug 实现原理 HTTP cache hidden iframe 1px image ...

  6. Windows 10 滚动截图工具

    Windows 10 滚动截图工具 Edge & Note & Clip https://www.runoob.com/docker/docker-architecture.html ...

  7. flutter & i18n & L10n & json

    flutter & i18n & L10n & json https://marketplace.visualstudio.com/items?itemName=esskar. ...

  8. vue & watch props

    vue & watch props bug OK watch: { // props // chatObj: () => { // // bug // log(`this.chatObj ...

  9. macOS & Xnip

    macOS & Xnip close finished notation cancel checked xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许 ...

  10. vue components registration & vue error & Unknown custom element

    vue components registration & vue error & Unknown custom element vue.esm.js:629 [Vue warn]: ...