嘟嘟嘟

今天我们模拟考这题,出的是T3。实在是没想出来,就搞了个20分暴力(还WA了几发)。
这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西。
这就让我想到很久以前的一道NOIP题,铺地毯。那是我第一次接触逆向思维,觉得十分的巧妙,原本要写的很麻烦或者干脆写不出来的题,反着想,竟然几行就完事了。
不扯别的了,还是说一下这题怎么想吧……

把操作离线,然后倒着操作,上移变成了下移。但是每一次移动两维的坐标都会改变,十分的难受。于是我们把坐标轴旋转45度,就十分美滋滋了:以顺时针举例,如果斜率为1,在新的坐标系中只有纵坐标发生了改变;斜率为-1,只有横坐标发生了改变。而且改变的这些点一定是一个前缀或者后缀。于是更新可用线段树实现。
不过更为重要的是,对于查询的\(n\)个点,无论逆向怎么操作,这些点的横、纵坐标的相对大小都不会变,大的只会更大,小的只会更小。
有了这个性质,我们就可以二分找要改的前缀(后缀)的边界了。判断的时候就是线段树单点查询。
到这里这题基本就完事了,需要注意的是,区间修改时应该加(减)的是\(2l\),因为在原本的坐标系中移动的距离是\(\sqrt{2} l\),而新坐标系的距离又是原来的\(\sqrt{2}\)倍,所以应该是\(\sqrt{2} * \sqrt{2}l\)。

线段树有点慢,需要开O2才能过,改成树状数组就快很多了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
#define space putchar(' ')
#define enter puts("")
#define Mem(a, x) memset(a, x, sizeof(x))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 4e5 + 5;
const int N = 262144;
In ll read()
{ll ans = 0;char ch = getchar(), las = ' ';while(!isdigit(ch)) las = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(las == '-') ans = -ans;return ans;
}
In void write(ll x)
{if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}int n, Q;
struct Que
{int d; ll x, l;
}q[maxn];struct Tree
{int l[maxn << 2], r[maxn << 2];ll lzy[maxn << 2];In void build(int L, int R, int now, int flg){l[now] = L; r[now] = R;if(L == R) {lzy[now] = L * flg; return;}int mid = (L + R) >> 1;build(L, mid, now << 1, flg);build(mid + 1, R, now << 1 | 1, flg);}In void pushdown(int now){if(lzy[now]){lzy[now << 1] += lzy[now]; lzy[now << 1 | 1] += lzy[now];lzy[now] = 0;}}In void update(int L, int R, int now, int d){if(l[now] == L && r[now] == R) {lzy[now] += d;return;}pushdown(now);int mid = (l[now] + r[now]) >> 1;if(R <= mid) update(L, R, now << 1, d);else if(L > mid) update(L, R, now << 1 | 1, d);else update(L, mid, now << 1, d), update(mid + 1, R, now << 1 | 1, d);}In ll query(int now, int id){if(l[now] == r[now]) return lzy[now];pushdown(now);int mid = (l[now] + r[now]) >> 1;if(id <= mid) return query(now << 1, id);else return query(now << 1 | 1, id);}
}t1, t2;int main()
{n = read(), Q = read();for(int i = Q; i; --i) q[i].x = read(), q[i].d = read(), q[i].l = read();t1.build(0, N - 1, 1, 1), t2.build(0, N - 1, 1, -1);for(int i = 1; i <= Q; ++i){if(q[i].d == 1){int L = 0, R = N - 1;while(L < R){int mid = ((L + R) >> 1) + 1;if(t2.query(1, mid) < -q[i].x) R = mid - 1;else L = mid;}t1.update(0, L, 1, -q[i].l * 2);}else{int L = 0, R = N - 1;while(L < R){int mid = ((L + R) >> 1) + 1;if(t1.query(1, mid) > q[i].x) R = mid - 1;else L = mid;}if(L + 1 > N - 1) --L;t2.update(L + 1, N - 1, 1, -q[i].l * 2);}}for(int i = 1; i <= n; ++i) write(-(t2.query(1, i) + t1.query(1, i)) / 2), enter;return 0;
}

转载于:https://www.cnblogs.com/mrclr/p/10438820.html

「JOI 2016 Final」断层相关推荐

  1. Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子

    太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...

  2. T3:LOJ2332「JOI 2017 Final」焚风现象.cpp

    记录差值 然后每次运算一下头和尾 如果尾端是最后一次增加则不用运算尾端 详见代码 #include<iostream> #include<cstdio> #include< ...

  3. Libre OJ P2332「JOI 2017 Final」焚风现象【差分思想】By cellur925

    题目传送门 这道题开始看起来会很晕...\(qwq\).首先我们要明确题目中的海拔&&温度.温度是受海拔影响的,每次改变的是海拔,我们求的是温度. 我们开始读入的时候便可以处理出开始\ ...

  4. 【2018.10.1】「JOI 2014 Final」年轮蛋糕

    题面 一看到求"最小值的最大值"这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点, ...

  5. 【题解】LOJ2350:「JOI 2018 Final」月票购买

    原题传送门 可以很套路地得到一个结论,答案与月票的路径有一段连续的重复路径 以 s , t , u , v s,t,u,v s,t,u,v为起点跑四次最短路 现在我们枚举两个月票最短路上的点 x , ...

  6. 【题解】LOJ3254:「JOI 2020 Final」集邮比赛 3

    原题传送门 发现 n < = 200 n<=200 n<=200,那么我们就可以想一个 O ( n 3 ) O(n^3) O(n3)的dp 发现每次肯定是向左/右推进 可以令 d p ...

  7. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  8. Word 2016 用宏实现「只保留文本」粘贴

    本文旨在用 Word 2016 (其他 Microsoft Office 部分产品中也附带)中自带的宏功能实现「只保留文本」粘贴的目的. 准备工作:显示「开发工具」选项卡 ① 单击「文件」选项卡: ② ...

  9. 「JVM 内存管理」低延迟的 Shenandoah GC 与 ZGC

    同时在内存占用(Footprint),吞吐量(Throughput),延迟(Latency)三方面表现得最优,才能称得上完美的垃圾收集器,但这几乎是不可能的(不可能三角,三元悖论,通常最多可以兼顾两项 ...

最新文章

  1. chakra linux安装教程,Chakra Linux 安装指南(二):Chakra Linux 安装
  2. forward declaration of class 错误
  3. 微服务~分布式事务里的最终一致性
  4. oracle gsd,晕死:11203GSD死活起不来
  5. 看动画学算法之:linkedList
  6. windows2003——IIS
  7. angular 设置接口调用地址_[译] 关于 Angular 的变化检测,你需要知道的一切
  8. DOM属性用法速查手册
  9. 从输入url到页面加载完成发生了什么
  10. [leetcode] 150. 逆波兰表达式求值
  11. python手动安装依赖包
  12. 这世界没有能够预测未来的魔法水晶球
  13. Android曲线水波纹动画,Android水波纹显示进度效果,很炫
  14. Matlab roundn()函数使用样例
  15. 【1月7日】议程正式公布!年度AIoT产业盛典重磅来袭!
  16. DS18B20温度传感器arduino程序
  17. 高级驾驶辅助系统ADAS技术介绍
  18. C++:实现量化相关的各类数据测试实例
  19. Qt5开发从入门到精通——第六篇一节( 图像与图片——位置相关函数 )
  20. 【域自适应】Dual Path Learning for Domain Adaptation of Semantic Segmentation

热门文章

  1. 关于图像特征的提取【转】
  2. 羊皮卷的故事-第二章
  3. Apache POI和EasyExcel 第一集:小叙
  4. R语言入门第六集 实验五:综合应用
  5. flex 表格勾选后 鼠标滚动会自动勾选_办公鼠里的BBA,罗技MX Anywhere 3鼠标开箱体验...
  6. 2020双十一实时大屏_双十一实时“战报”来了,你贡献了多少?
  7. obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
  8. rocketmq 消息指定_RocketMq 实际案例–普通消息的发送
  9. ospf避免环路_OSPF路由协议的区域防环机制
  10. vs界面竖线光标变成灰色方块,输入时替代已有字符