UOJ#191. 【集训队互测2016】Unknown

题目描述

Solution

二进制分组。
每一个组内维护一个斜率单调减的凸包。
因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的下一个区间填满之后再合并当前区间。
时间复杂度O(nlg2n)O(nlg^2n)O(nlg2n)。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
struct Vct
{int x,y;Vct(int x1=0,int y1=0) { x=x1,y=y1; }Vct operator + (const Vct &a) { return Vct(x+a.x,y+a.y); }Vct operator - (const Vct &a) { return Vct(x-a.x,y-a.y); }ll operator * (const Vct &a) { return 1ll*x*a.y-1ll*y*a.x; }friend bool operator < (const Vct &a,const Vct &b) { return (a.x<b.x)||(a.x==b.x&&a.y<b.y); }
};
struct Convex_Hull
{vector<Vct> V;void Clear() { V.clear(); }Convex_Hull(){ Clear(); }void Push(Vct x) { int n=V.size(); while (n>=2&&(x-V[n-2])*(V[n-1]-V[n-2])<=0) V.pop_back(),n--; n++,V.PB(x); }friend Convex_Hull Merge(const Convex_Hull &x,const Convex_Hull &y){Convex_Hull ans;int i,j;for (i=0,j=0;i<x.V.size()&&j<y.V.size();) ans.Push(x.V[i]<y.V[j]?x.V[i++]:y.V[j++]);for (;i<x.V.size();) ans.Push(x.V[i++]);for (;j<y.V.size();) ans.Push(y.V[j++]);return ans;}ll Query(Vct x){int l=0,r=V.size()-1;while (l+5<r){int mid=(l+r+1)>>1;if ((V[mid]-V[mid-1])*x<=0) l=mid;else r=mid-1;}ll ans=-loo;for (int i=l;i<=r;i++) upmax(ans,x*V[i]);return ans;}
};
struct Segment_Tree
{int flag[MAXN<<1],lst[20];Convex_Hull tree[MAXN<<1];void up(int x) { flag[x]=1,tree[x]=Merge(tree[x<<1],tree[x<<1|1]); }void build(int x,int l,int r,int dep){lst[dep]=0;tree[x].Clear(),flag[x]=0;if (l==r) return;int mid=(l+r)>>1;build(x<<1,l,mid,dep+1);build(x<<1|1,mid+1,r,dep+1);}void insert(int x,int l,int r,int y,Vct z,int dep){if (r==y){if (lst[dep]) up(lst[dep]);lst[dep]=(l==r)?0:x;}if (l==r) { tree[x].Push(z); return; }int mid=(l+r)>>1;if (y<=mid) insert(x<<1,l,mid,y,z,dep+1);else insert(x<<1|1,mid+1,r,y,z,dep+1);}void erase(int x,int l,int r,int y,int dep){tree[x].Clear(),flag[x]=0;if (lst[dep]==x) lst[dep]=0;if (l==r) return; int mid=(l+r)>>1;if (y<=mid) erase(x<<1,l,mid,y,dep+1);else erase(x<<1|1,mid+1,r,y,dep+1);}ll query(int x,int l,int r,int L,int R,Vct y){int mid=(l+r)>>1;if (L<=l&&r<=R) {if (l==r||flag[x]) return tree[x].Query(y);return max(query(x<<1,l,mid,l,mid,y),query(x<<1|1,mid+1,r,mid+1,r,y));}if (R<=mid) return query(x<<1,l,mid,L,R,y);else if (L>mid) return query(x<<1|1,mid+1,r,L,R,y);else return max(query(x<<1,l,mid,L,mid,y),query(x<<1|1,mid+1,r,mid+1,R,y));}
} segment;
int main()
{int zbl=read(),Case;while (Case=read()){int n=min(300000,Case),num=0,ans=0;segment.build(1,1,n,0);while (Case--){int opt=read();if (opt==1) { int x=read(),y=read(); segment.insert(1,1,n,++num,Vct(x,y),0); }else if (opt==2) { segment.erase(1,1,n,num--,0); }else {int l=read(),r=read(),x=read(),y=read();ll t=segment.query(1,1,n,l,r,Vct(x,y));((t%=mods)+=mods)%=mods;ans^=t;}}printf("%d\n",ans);}return 0;
}

卡空间很恶心。

UOJ#191. 【集训队互测2016】Unknown相关推荐

  1. UOJ 88 [集训队互测2015]Robot

    线段树分治套凸包 每个机器人在多次修改之间的贡献是不同的,因为这个一次函数被修改.显然要线段树分治. 我们需要在线段树上维护凸壳,刚开始我以为要用动态凸包的那套理论.后来才知道直接在外面给所有一次函数 ...

  2. [2015国家集训队互测]口胡

    比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...

  3. 「2019 集训队互测 Day 1」最短路径 解题报告

    一.题目概述 题目链接:Libre OJ. 给出一张图,求出 ans=∑i=1n∑j=1n[i≠j]dk(i,j)ans=\sum_{i=1}^n\sum_{j=1}^n[i\ne j]\texttt ...

  4. 【LOJ3077】「2019 集训队互测 Day 4」绝目编诗

    [题目链接] 点击打开链接 [思路要点] 不难发现各个边双连通分量可以分开处理,桥边可以直接删除. 可以证明,对于每一个边双连通分量,当 M−NM-NM−N 超过 O(N)O(\sqrt{N})O(N ...

  5. 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)

    题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...

  6. [Luogu5042/UOJ #100][国家集训队互测2015]丢失的题面/ydc的题面

    题目链接: Luogu5042 UOJ #100 最近有点颓..然后就打算找Duliu做 然后就有了这篇题解..(虽然基本上都是抄的 \(Task1\) 输入\(22\),输出为长度为\(2^{22} ...

  7. 【集训队互测2015】最大异或和

    首先不知道有没有神仙线段树分治过的. 首先一个较为显然的性质: \[ \mathrm{Span}\{v_1, v_2, \dots, v_n\} = \mathrm{Span}\{v_1, v_2 - ...

  8. BZOJ3938 UOJ88:[集训队互测2015]Robot——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3938 http://uoj.ac/problem/88 小q有n只机器人,一开始他把机器人放在了一 ...

  9. 洛谷 P4463 [集训队互测 2012] calc(拉格朗日插值优化DP)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4463 Prob ...

最新文章

  1. Android证书通过keytool获取sha1、sha256、MD5
  2. Mr.J--jQuery效果总结
  3. Oracle data integrator 11g安装配置和一个实例应用指南pdf
  4. Spring Boot 日志配置 ——logback
  5. springmvc(2)Controller源码简单解析
  6. Microsoft Office 2016 简体中文 Vol 版镜像下载
  7. java图书馆_java入门第三季--图书馆借书系统
  8. raspberry pi 4检查ch340/ch341驱动
  9. ftp工具哪个好,推荐8个超级好用而且免费的ftp工具,支持中文版windows系统的。
  10. python识图 web_python+flask搭建CNN在线识别手写中文网站
  11. 学习笔记:中国大学MOOC《计算机程序设计C++》第3周单元测试
  12. javascript 的alert()功能 prompt() 功能
  13. 移动流量转赠给好友_移动的号怎么赠送流量给好友?
  14. wps怎么关闭视图保护_怎么在PPT2013中清除编辑受保护视图功能?
  15. linux如何合并文件
  16. 知云文献翻译打不开_科研星火 | 基础技能——翻译篇
  17. matlab复数fft,第30章 复数FFT的实现
  18. 敏涵控股集团董事长刘敏:唱响敏涵之歌 打造世界敏涵
  19. 高端对话:过程改进领域热点话题集锦
  20. 饿汉单例、懒汉单例类

热门文章

  1. 梦真的是反的 | 今日最佳
  2. 通过R,让你的数据分析更简便!
  3. 技巧:Excel用得好,天天没烦恼
  4. 原来R语言还有这些不为人知的用处!
  5. tcp抓包返回fin_TCP/IP学习二TCP链接建立与断开
  6. 怎么把c语言转换汇编程序,如何把汇编语言转换成C语言
  7. 技能高考本科计算机类,技能高考多少分上本科
  8. linux 用mutex定义一个linkedlist,一个高性能无锁非阻塞链表队列
  9. mysql anyvalue函数_Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式
  10. leedcode05 找出缺失的观测数据(思路加详解)