Codeforces 1221 F Choose a Square
不知道大佬们怎么想的,反正我看到这种区间包含性质的并且score只和包含的区间与询问区间挂钩的题,马上就想到了扫描线23333
虽然革命方向无比正确,但却因为SB错误交了5次才 A。
WA第一发:考虑到我们扫描线的话是要坐标离散化的,然而这种做法是默认正方形内至少有一个点。可所有点权都是负值就尴尬了,这个时候需要找一个空点来把答案替代成0。虽然我考虑到了这种情况,但是第一次找空点的时候不仅写麻烦了(我是用 num[i]+1<num[i+1] 来判断两个坐标之间是否有空隙),而且漏了最大坐标后面的。。。。不过如果你观察题面描述仔细的话,你是会发现输出要求的 坐标是可以 >1e9的,这就是这题的坑比之处,答案<0就可以直接输出 0 \n 1000000001 1000000001 1000000001 1000000001 了。。
WA第二发:我开的vector的下标是离散化之后的坐标,显然是要开两倍空间的,忘开了。。。
WA第三发:又发现线段树的下标也是离散化之后的坐标,显然空间是要开n的八倍的,wori
WA第四发:操作线段树的时候有个 long long 写成int了,gan
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define lc (o<<1)
#define mid (l+r>>1)
#define rc ((o<<1)|1)
#define pb push_back
const int N=500005; inline int read(){
int x=0,f=1; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x*f;
} /*
注意数组空间啊!
虽然只有n个点,不过离散化之后最多涉及 2n 个坐标值
g[i]是用来存右端点在i的点的链表,所以空间开2n
因为线段树的下标是离散后的坐标次序,所以空间要开 8n 而不是 4n
*/ vector<int> g[N*2];
int n,a[N],b[N],num[N*2],ky,c[N],L,R,pos[N*8],w,le=1,ri,P;
ll ans=-1e18,mx[N*8],ad[N*8],now; inline void maintain(int o){
pos[o]=mx[rc]>mx[lc]?pos[rc]:pos[lc];
mx[o]=max(mx[lc],mx[rc]);
} inline void Get(int o,ll w){
ad[o]+=w,mx[o]+=w;
} inline void pushdown(int o){
if(ad[o]) Get(lc,ad[o]),Get(rc,ad[o]),ad[o]=0;
} void build(int o,int l,int r){
if(l==r){ pos[o]=mx[o]=num[l]; return;}
build(lc,l,mid),build(rc,mid+1,r);
maintain(o);
} void update(int o,int l,int r){
if(l>=le&&r<=ri){ Get(o,w); return;} pushdown(o); if(le<=mid) update(lc,l,mid);
if(ri>mid) update(rc,mid+1,r); maintain(o);
} void query(int o,int l,int r){
if(l>=le&&r<=ri){ if(mx[o]>mx[P]) P=o; return;}
// P在query后是最大的线段树上的节点,需要转换到具体的数轴上的点
pushdown(o); if(le<=mid) query(lc,l,mid);
if(ri>mid) query(rc,mid+1,r);
} inline void solve(){
build(1,1,ky),mx[0]=-1e18;
for(int i=1;i<=ky;i++){
for(int j:g[i]) ri=a[j],w=c[j],update(1,1,ky);
P=0,ri=i,query(1,1,ky);
if(mx[P]-num[i]>ans) ans=mx[P]-num[i],R=num[i],L=pos[P];
}
} int main(){
n=read(),num[0]=-1;
for(int i=1;i<=n;i++){
a[i]=read(),b[i]=read(),c[i]=read();
num[++ky]=a[i],num[++ky]=b[i];
if(a[i]>b[i]) swap(a[i],b[i]);
} sort(num+1,num+ky+1),ky=unique(num+1,num+ky+1)-num-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(num+1,num+ky+1,a[i])-num;
b[i]=lower_bound(num+1,num+ky+1,b[i])-num;
g[b[i]].pb(i);
} solve();
if(ans<=0) ans=0,L=R=1e9+1; cout<<ans<<endl;
printf("%d %d %d %d\n",L,L,R,R); return 0;
} /*
Σc[] + j - i
*/
Codeforces 1221 F Choose a Square的更多相关文章
- Codeforces 959 F. Mahmoud and Ehab and yet another xor task
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \ ...
- Codeforces 835 F. Roads in the Kingdom
\(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗 ...
- Codeforces 731 F. Video Cards(前缀和)
Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和 ...
- Codeforces 1187 F - Expected Square Beauty
F - Expected Square Beauty 思路:https://codeforces.com/blog/entry/68111 代码: #pragma GCC optimize(2) #p ...
- Codeforces 1221F. Choose a Square
传送门 对于某个点 $(x,y)$ ,不妨设 $x<y$ 因为如果 $x>y$ 直接按 $y=x$ 对称一下即可 当且仅当正方形左下角 $(a,a)$ 满足 $a<=x$,右上角 $ ...
- CodeForces 135 B. Rectangle and Square(判断正方形和 矩形)
题目:http://codeforces.com/problemset/problem/135/B 题意:给8个点 判断能否用 4个点构成正方形,另外4个点构成 矩形. 输出 第一行是正方形 ,第二行 ...
- Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))
C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 474 F. Ant colony
线段树求某一段的GCD..... F. Ant colony time limit per test 1 second memory limit per test 256 megabytes inpu ...
- Codeforces Round #423 B. Black Square
题目网址:http://codeforces.com/contest/828/problem/B 题目: Polycarp has a checkered sheet of paper of size ...
随机推荐
- 2019牛客多校四 E. triples II (容斥)
大意: 给定$n,a$, 求$n$个$3$的倍数, $or$和为$a$的方案数. 简单容斥题 可以求出$f_{x,y}$表示所有$3$的倍数中, 奇数位不超过$x$个$1$, 偶数位不超过$y$个$1 ...
- 怎样理解script标签的defer属性和async属性
如果script标签是引用的外部js文件, 那就会有一个下载js文件这一过程, 为了不因为这个下载过程而阻塞页面解析与渲染, 我们需要一种机制来解决这一问题, 方法之一就是使用 defer和async ...
- ligerui tab 部分记载
打开一个Tab $(".strength_box").click(function () { var id = $(this).attr("data"); va ...
- 根据xsd文件生成对应的C#类,然后创建对应的xml文件
首先用xsd文件生产对应的C#类,这个VS已经自带此工单,方法如下: 1. 打开交叉命令行工具 2. 输入如下指令 xsd d:\123.xsd /c /language:C# /outputdir: ...
- 【微信支付】公众号 JSAPI支付 HTML5(使用MUI前端框架)+WebApi 实现流程
必要参数: 1) AppID,AppSecret : 在微信公众号后台管理—>(菜单栏)开发 —> 基本设置 2)商户号 :在微信公众号后台管理—>(菜单栏)微信支 ...
- pycharm2019.2永久激活
Pycharm2019.2永久激活Pycharm官网在不到两个月内与2019.7.24更新到最新版本pycharm2019.2,不可说更新不快,对于"喜新厌旧"的我怎能错过新版本呢 ...
- Django迁移
Django迁移 学习目标: 如何在不编写任何SQL语句的情况下创建数据库表 更改model如何自动修改数据库 如何还原对数据库所做的更改 迁移能解决的问题 如果你不了解Django或者WEB开发,肯 ...
- 基于vue的购物车清单
<!doctype html> <html> <head> <meta charset="utf-8"> <link rel= ...
- sql计算两个时间之间的差,并用时分秒表示
这是自己写的方法,总觉得会有更好的办法实现这个效果呢? SELECT then ))))+'秒' then )))+'秒' then ))+'秒' else CONVERT(nvarchar,DATE ...
- Mac上搭建Web服务器--Apache
局域网搭建 Web 服务器测试环境,因为Mac OS X 自带了 Apache 和 PHP 环境,我们只需要简单的启动它就行了. 1.命令:sudo apachectl start Apache服务器 ...