一、题目

点此看题

二、解法

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

我们把冰人和火人都按温度排序,那么考虑一个分界线 \(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. Python——requests模块

    一.安装模块 pip install requests 二.引用 import requests 三.get方法 #GET访问页面 r = requests.get(url) print(r.text ...

  2. Zabbix 配置监控 & 触发器

    Zabbix 自定义监控 zabbix-agent 获取数据,然后定义,交给 zabbix-server 端 Zabbix 配置监控项 监控的内容 # 监控服务器登录用户的数量 [root@web01 ...

  3. Shell 元字符 & 变量

    Shell 介绍 ## 什么是程序 程序就是一组数据和代码逻辑集合的文件 ## 什么是进程 进程是程序的运行过程,也可以说是操作系统干活的过程,因为是操作系统负责控制硬件来运行应用程序 ps:进程与进 ...

  4. kubernetes实战-配置中心(二)交付apollo配置中心到k8s

    apollo官网:官方地址 apollo架构图: apollo需要使用数据库,这里使用mysql,注意版本需要在5.6以上: 本次环境mysql部署在10.4.7.11上,使用mariadb:10.1 ...

  5. python之字符串replace的方法

    1.描述 replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果有指定第三个参数max,则替换的不超过max次 2.语法 str.replace(old,new[,max] ...

  6. KEIL5 使用STM32 官方例程

    1. 安装keil5,破解 网上很多安装包/教程,跳过 2.下载官方固件库 https://www.st.com/content/st_com/en.html 在这里找微处理器,STM32 stand ...

  7. codeforces 2C(非原创)

    C. Commentator problem time limit per test 1 second memory limit per test 64 megabytes input standar ...

  8. tfrecords转图片存储

    import os import shutil import tensorflow as tf import time import sys import cv2 # 图片存放位置 PATH_RES ...

  9. CSS style color all in one

    CSS style color all in one https://developer.mozilla.org/en-US/docs/Web/CSS/color_value /* Hexadecim ...

  10. Electron in Action

    Electron in Action $ yarn add -D electron@latest # OR $ npm i -D electron@latest https://www.electro ...