[省选联考 2020 A/B 卷] 冰火战士
一、题目
二、解法
其实这道题也不是特别难吧 \(......\) 但树状数组上二分是我第一次见。
我们把冰人和火人都按温度排序,那么考虑一个分界线 \(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 卷] 冰火战士的更多相关文章
- luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)
luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...
- luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...
- [省选联考 2020 A 卷] 组合数问题
题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...
- luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)
luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...
- [省选联考 2021 A/B 卷] 卡牌游戏
垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...
- 洛谷P6623——[省选联考 2020 A 卷] 树
传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...
随机推荐
- Kubernets二进制安装(13)之部署Flannel
Flannel简介 Flannel是CoreDNS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址 ...
- Java中new一个对象是一个怎样的过程?JVM中发生了什么?
Java中new一个对象的步骤: 1. 当虚拟机遇到一条new指令时候,首先去检查这个指令的参数是否能 在常量池中能否定位到一个类的符号引用 (即类的带路径全名),并且检查这个符号引用代表的类是否已被 ...
- filter_var 函数()绕过执行命令
escape 过滤器来过滤link,而实际上这里的 escape 过滤器,是用PHP内置函数 htmlspecialchars 来实现的 htmlspecialchars 函数定义如下: htmlsp ...
- Web 开发之 HTTP/2 & SPDY & HTTP 1.1 & HTTP 对比分析详解!
1 https://zh.wikipedia.org/wiki/HTTP/2 HTTP/2 维基百科,自由的百科全书 HTTP/2(超文本传输协议第2版 ...
- .NET & C# & ASP.NET
.NET && C# && ASP.NET https://docs.microsoft.com/zh-cn/dotnet/ .NET Documentation We ...
- React Refs All In One
React Refs All In One https://reactjs.org/docs/react-api.html#refs Ref https://reactjs.org/docs/refs ...
- koa url path & koa-router
koa url path & koa-router url path & regex koa path router "use strict"; /** * * @ ...
- Event Bus & Event Emitter
Event Bus & Event Emitter Event Bus https://code.luasoftware.com/tutorials/vuejs/parent-call-chi ...
- c++ x86_x64挂钩函数 传递寄存器表
https://github.com/januwA/GameCheat #include "pch.h" #include <iostream> #include &l ...
- Flutter 创建透明的路由页面
原文 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends St ...