传送门

对于某个点 $(x,y)$ ,不妨设 $x<y$ 因为如果 $x>y$ 直接按 $y=x$ 对称一下即可

当且仅当正方形左下角 $(a,a)$ 满足 $a<=x$,右上角 $(b,b)$ 满足 $b>=y$ ,才能得到这个点的价值

所以发现其实是个二维偏序的问题,直接把 $(a,b)$ 看成另一个平面上的点,$(x,y)$ 放到那个平面上

这样就问题变成选一个点 $(a,b)$ ,你得到的价值为所有 $x>=a$ 并且 $y<=b$ 的点 $(x,y)$ 的价值和再减去 $a,b$ 之间的差值

考虑把点按第一关键字 $x$ 从大到小,按第二关键字 $y$ 从小到大排序,维护一个线段树表示当前 $a=x$ 的情况下 $y$ 取各个值时能够得到的最大价值

因为当前 $a=x$ 的情况下,所有 $x>a$ 的点的代价都加入了,每次加入一个点以后直接查询线段树上 $b>=y$ 和下一个点 $b<=y'-1$ 之间的那一段的最大价值,当然如果下一个点的 $x$ 和当前点不同,那么查询直接查询当前点到线段树最大位置的值即可

发现这样是有问题的,因为对于不同的 $b=y$ ,直接取点的值最大还不行,因为代价还要考虑 $-(y-x)$,所以线段树上维护的应该是点值和再减 $y$ 以后的最大值,当然要随便维护一下取最大值时 $b$ 的值

然后就没了,代码因为主体是比赛时写的,可能比较丑,但是还能看...吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e6+;
const ll INF=1e18;
int n,x[N],y[N],c[N],t[N],xx[N],yy[N];
struct dat {
int l,r,val,id;
dat (int _l=,int _r=,int _val=,int _id=) { l=_l,r=_r,val=_val,id=_id; }
inline bool operator < (const dat &tmp) const {
if(l!=tmp.l) return l>tmp.l;
return r!=tmp.r ? r<tmp.r : val>tmp.val;
}
}d[N];
int tot;
int inv[N];
struct SegTree {
ll T[N<<],id[N<<],tag[N<<];
inline void pushup(int o) { T[o]=max(T[o<<],T[o<<|]); id[o]=T[o<<]>=T[o<<|] ? id[o<<] : id[o<<|]; }
inline void pushdown(int o,int l,int r)
{
if(!o||!tag[o]) return;
T[o]+=tag[o]; if(l==r) { tag[o]=; return; }
tag[o<<]+=tag[o]; tag[o<<|]+=tag[o];
tag[o]=;
}
void build(int o,int l,int r)
{
if(l==r) { id[o]=l; T[o]=-inv[l]; return; }
int mid=l+r>>; build(o<<,l,mid); build(o<<|,mid+,r);
pushup(o);
}
inline void change(int o,int l,int r,int ql,int qr,int v)
{
pushdown(o,l,r);
if(l>qr||r<ql) return;
if(l>=ql&&r<=qr) { tag[o]=v; pushdown(o,l,r); return; }
int mid=l+r>>;
change(o<<,l,mid,ql,qr,v); change(o<<|,mid+,r,ql,qr,v);
pushup(o);
}
ll pos,val;
inline void query(int o,int l,int r,int ql,int qr)
{
pushdown(o,l,r);
if(l>qr||r<ql) return;
if(l>=ql&&r<=qr) { if(T[o]>val) val=T[o],pos=id[o]; return; }
int mid=l+r>>; query(o<<,l,mid,ql,qr); query(o<<|,mid+,r,ql,qr);
pushup(o);
}
}ST;
int main()
{
n=read();
for(int i=;i<=n;i++) xx[i]=x[i]=read(),yy[i]=y[i]=read(),c[i]=read();
for(int i=;i<=n;i++) t[++tot]=x[i],t[++tot]=y[i];
sort(t+,t+tot+); tot=unique(t+,t+tot+)-t-;
for(int i=;i<=n;i++) x[i]=lower_bound(t+,t+tot+,x[i])-t;
for(int i=;i<=n;i++) y[i]=lower_bound(t+,t+tot+,y[i])-t;
int ansx=,ansy=;
for(int i=;i<=n;i++)
{
if(x[i]>y[i]) swap(x[i],y[i]),swap(xx[i],yy[i]);
d[i]=dat(x[i],y[i],c[i],i);
ansx=max(ansx,yy[i]+); ansy=max(ansy,yy[i]+);
inv[x[i]]=xx[i]; inv[y[i]]=yy[i];
}
sort(d+,d+n+); ll ans=; ST.build(,,tot);
d[n+].l=-;
for(int i=;i<=n;i++)
{
ST.change(,,tot,d[i].r,tot,d[i].val);
ST.val=-INF; ST.pos=;
if(d[i].l==d[i+].l) ST.query(,,tot,d[i].r,d[i+].r-);
else ST.query(,,tot,d[i].r,tot);
ll res=ST.val+inv[d[i].l];
if(res>ans) ans=res,ansx=inv[d[i].l],ansy=inv[ST.pos];
}
printf("%lld\n",ans);
printf("%d %d %d %d\n",ansx,ansx,ansy,ansy);
return ;
}

Codeforces 1221F. Choose a Square的更多相关文章

  1. Codeforces Round #448 C. Square Subsets

    题目链接 Codeforces Round #448 C. Square Subsets 题解 质因数 *质因数 = 平方数,问题转化成求异或方程组解的个数 求出答案就是\(2^{自由元-1}\) , ...

  2. Codeforces 1221 F Choose a Square

    题面 不知道大佬们怎么想的,反正我看到这种区间包含性质的并且score只和包含的区间与询问区间挂钩的题,马上就想到了扫描线23333 虽然革命方向无比正确,但却因为SB错误交了5次才 A. WA第一发 ...

  3. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  4. Codeforces 716C. Plus and Square Root-推公式的数学题

    http://codeforces.com/problemset/problem/716/C codeforces716C. Plus and Square Root 这个题就是推,会推出来规律,发现 ...

  5. Codeforces 1187 F - Expected Square Beauty

    F - Expected Square Beauty 思路:https://codeforces.com/blog/entry/68111 代码: #pragma GCC optimize(2) #p ...

  6. Codeforces 715A. Plus and Square Root[数学构造]

    A. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. 【模拟】Codeforces 710C Magic Odd Square

    题目链接: http://codeforces.com/problemset/problem/710/C 题目大意: 构造一个N*N的幻方.任意可行解. 幻方就是每一行,每一列,两条对角线的和都相等. ...

  8. Codeforces 679C Bear and Square Grid

    Bear and Square Grid 枚举k * k 的位置, 然后接上它周围白色连通块的数量, 再统计完全在k * k范围里的连通块, 这个只要某个连通块全部的方格 在k * k里面就好, 并且 ...

  9. CodeForces - 710C Magic Odd Square(奇数和幻方构造)

    Magic Odd Square Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, c ...

随机推荐

  1. Leetcode题目20.有效的括号(简单)

    题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符 ...

  2. LeetCode 36. 有效的数独(Valid Sudoku)

    题目描述 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗 ...

  3. FinalShell Mac OS版,Linux版安装及教程(Mac下的xshell)

    用户QQ群 342045988 Mac版安装路径/Applications/finalshelldata Linux版安装路径/usr/lib/finalshelldata 注意:1.FinalShe ...

  4. MySQL 插件之 连接控制插件(Connection-Control)

    目录 插件介绍 插件安装 插件配置 插件介绍 MySQL 5.7.17 以后提供了Connection-Control插件用来控制客户端在登录操作连续失败一定次数后的响应的延迟.该插件可有效的防止客户 ...

  5. 图片加载框架之ImageLoader

    Android开发中,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于这些问题解决起来会比较吃力,比较著名的就是Univers ...

  6. mongoDB 安装过程

    1.在官方网站下载 mongoDB的安装包,我下载的是3.4.6  系统为win10_64 2.需要安装vc++2015 在安装时发现 win7 系统安装不了. 不得已才安装的win10 3.安装mo ...

  7. class文件访问标志

    class文件中用两个字节共16位代表访问标志(access flags),用于表明该类或接口被访问时能提供的一些信息: 标志名称 标志值 含义 ACC_PUBLIC 0x00 01 是否为Publi ...

  8. EncryptHelper加密对象-工具类

    using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.W ...

  9. SQL:SQL优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. Python操作SQLite

    1. 导入sqlite3数据库模块,从python2.5以后,sqlite3成为内置模块,不需要额外安装,只需要导入即可. import sqlite3 2.创建/打开数据库 使用connect方法打 ...