Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子
太神仙了这题。。。
原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度。
下面的1,2操作均定义为向下沉降(与原题意的变换相反);
首先这个题目只会操作前缀和后缀,并且只会把前缀中的数(纵坐标)变小(2操作),后缀中的数(横坐标)变大(1操作),所以具有单调性,可以进行二分。(括号中含义的解释见下)
先把整个坐标系旋转$45$度(逆时针为例),操作1即纵坐标$y>=xi$的点都会往右走$2*l$,横坐标$+2*l$,纵坐标不变,由于有单调性,只会操作后缀;操作2即横坐标$x<=xi$的点都会往下走$2*l$,纵坐标$-2*l$,横坐标不变,由于有单调性,只会操作前缀。
所以二分一下实际坐标就好了。。注意最后计算深度是$(x-y)/2$
我的这种二分需要维护一个$mx$区间最大值,二分时看一眼左右子树的$mx$,然后决定向哪一棵子树递归。
#include<cstdio>
#include<iostream>
#define ls (tr<<1)
#define rs (tr<<1|1)
#define ll long long
#define R register ll
const int N=,Inf=0x3f3f3f3f;
using namespace std;
char B[<<],*S=B,*T=B,ch;
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m;
struct node {int x,d,l;}q[N];
ll MX[][N<<],TG[][N<<];
#define mx MX[c]
#define tg TG[c]
inline void build(int c,int tr,int l,int r) {
if(l==r) {mx[tr]=l; return ;} R md=l+r>>;
build(c,ls,l,md),build(c,rs,md+,r); mx[tr]=max(mx[ls],mx[rs]);
}
inline void spread(int c,int tr) { if(!tg[tr]) return ;
tg[ls]+=tg[tr],tg[rs]+=tg[tr],mx[ls]+=tg[tr],mx[rs]+=tg[tr]; tg[tr]=;
} ll pos;
inline void fx(int tr,int l,int r,int k) {
if(l==r) {if(MX[][tr]<=k) pos=max(pos,(ll)l); return ;} spread(,tr); R md=l+r>>;
if(MX[][ls]<=k) pos=max(pos,md),fx(rs,md+,r,k); else fx(ls,l,md,k);
}
inline void fy(int tr,int l,int r,int k) {
if(l==r) {if(MX[][tr]>k) pos=min(pos,(ll)l); return ;} spread(,tr); R md=l+r>>;
if(MX[][ls]<=k) fy(rs,md+,r,k); else fy(ls,l,md,k);
}
inline void add(int c,int tr,int l,int r,int LL,int RR,int d) {
if(LL<=l&&r<=RR) {mx[tr]+=d,tg[tr]+=d; return ;} spread(c,tr); R md=l+r>>;
if(LL<=md) add(c,ls,l,md,LL,RR,d); if(RR>md) add(c,rs,md+,r,LL,RR,d); mx[tr]=max(mx[ls],mx[rs]);
} ll p[][N];
inline void calc(int c,int tr,int l,int r) {
if(l==r) {p[c][l]=mx[tr]; return ;} spread(c,tr);
R md=l+r>>; calc(c,ls,l,md),calc(c,rs,md+,r);
}
signed main() { freopen("geologic.in","r",stdin); freopen("geologic.out","w",stdout);
n=g(),m=g(); for(R i=;i<=m;++i) q[i].x=g(),q[i].d=g(),q[i].l=g();
build(,,,n),build(,,,n); for(R i=m;i>=;--i) {
if(q[i].d==) {
pos=; fx(,,n,q[i].x);
if(pos) add(,,,n,,pos,-*q[i].l);
} else {
pos=Inf; fy(,,n,q[i].x);
if(pos!=Inf) add(,,,n,pos,n,*q[i].l);
} //cerr<<pos<<endl;
} calc(,,,n),calc(,,,n);
for(R i=,ans;i<=n;++i) ans=(p[][i]-p[][i])/,printf("%lld\n",ans);
}
这还有一个不旋转坐标的,具体的就是类似直接模拟,但是难度在如何二分位置;
想一想发现:这不是直线方程么。。。
所以还是分别维护横纵坐标,但是二分条件改成$y>=x-xi$即$x-y<=xi$或$y>=-x+xi$即$x+y>=xi$;
#include<cstdio>
#include<iostream>
#define ll long long
#define R register ll
const int M=;
char B[<<],*S=B,*T=B;
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} ll x[M],y[M],ans[M];
inline int fx(ll d) { R pos=,t;
for(R i=;~i;--i) if((t=x[pos+(<<i)]-y[pos+(<<i)])<=d) pos+=(<<i),d-=t; return pos;
}
inline int fy(ll d) { R pos=,t;
for(R i=;~i;--i) if((t=x[pos+(<<i)]+y[pos+(<<i)])<=d) pos+=(<<i),d-=t; return pos;
} int n,m;
inline void add(int pos,int incx,int incy) {for(;pos<M;pos+=pos&-pos) x[pos]+=incx,y[pos]+=incy;}
struct node {int x,d,l;} q[M];
signed main() { freopen("geologic.in","r",stdin); freopen("geologic.out","w",stdout);
n=g(),m=g(); for(R i=;i<=n;++i) add(i,,);
for(R i=;i<=m;++i) q[i].x=g(),q[i].d=g(),q[i].l=g();
for(R i=m;i;--i) if(q[i].d==) {
R pos=fx(q[i].x); if(pos) add(,-q[i].l,-q[i].l),add(pos+,q[i].l,q[i].l);
} else { R pos=fy(q[i].x); if(pos<n) add(pos+,q[i].l,-q[i].l);}
for(R i=;i<=n;++i) {
ans[i]=ans[i-(i&-i)]+y[i];
printf("%lld\n",-ans[i]);
}
}
2019.06.01 June
Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子的更多相关文章
- 「JOI 2016 Final」断层
嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...
- LOJ#2343. 「JOI 2016 Final」集邮比赛 2
题目地址 https://loj.ac/problem/2343 题解 首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数.这个显然可以\(O(n)\)处理出来.然后考虑在每个位置 ...
- HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Tota ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...
- 「JOI 2014 Final」飞天鼠
「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...
- 「JOI 2015 Final」城墙
「JOI 2015 Final」城墙 复杂度默认\(m=n\) 暴力 对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向 ...
随机推荐
- Agc003_D AntiCube
传送门 题目大意 给定$N$个数,求一个最大的子集,使得任意两两的乘积不是一个完全立方数. $n\leq 10^5 A_i\leq 10^{10}$ 题解 考虑两两乘积为$x^3$,由于$x^3\le ...
- 幻想乡三连B:连在一起的幻想乡
$G[k][x]$表示所有$x$个点的无向图中每一个图的边数的$k$次方之和. $F[k][x]$就是在$G[k][x]$的基础上加了一个整体连通的性质. 有一个经典的套路就是对于$F$在对应的$G$ ...
- jraiser小结
1 合并小结 jrcpl F:\site\js\app --settings package.settings 上面代码的意思,就是说,根据package.settings文件,来对app文件夹下的所 ...
- oracle rac搭建
(一)环境准备 主机操作系统 windows10 虚拟机平台 vmware workstation 12 虚拟机操作系统 redhat 5.5 x86(32位) :Linux.5.5.for.x86. ...
- unittest 执行测试脚本输出测试报告
import unittestimport HTMLTestRunnertest as HTMLTestRunner#获取路径path = './'#创建测试套件,读取测试脚本suite = unit ...
- Webpack打包之后[-webkit-box-orient: vertical]样式丢失
背景:项目是用的vue全家桶套餐 今天在工作中遇到一个问题,需求是要求文字只能显示3行,超过3行则隐藏且显示 '...', 于是我加了如下样式在标签里面: display: -webkit-box;- ...
- 都是stm32的JTAG引脚惹的祸
转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 最近在调试08接口的LED显示屏,使用的是自己做的STM32板子. ...
- /*用户登录注册页面输入框的设置*/<span>的使用
<!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...
- PAM认证
PAM认证 摘自: http://www.cnblogs.com/shenxm/p/8451889.html PAM(Pluggable Authentication Modules) Sun公司于1 ...
- Spark 各个组件关系
Term Meaning Application User program built on Spark. Consists of a driver program and executors on ...