[luoguP3960] 列队(动态开点线段树)
有splay的做法,有树状数组的做法。。。
最好理解的还是线段树的做法。
一开始我是这样想的,如果移动某一个人,只有当前行和最后一列会受到影响,感觉就像是个线段树,树状数组什么的。
然而接下来就想歪了,把一个人移到后面,等于把后面的整体往前移一格,gg
正确思路是权值线段树,如果一个数被移走,相当于这个数的个数-1,然后把它变成了m+1,放到后面。
移动第x行第y个人其实就是求第x行的第y大。
这样,每一行和最后一列建一棵线段树,然而超空间。
所以需要动态开点,因为总共只移动3*10^5次,也就是开nlongn的点。
据说逆向思维可以骗50分,这都没想到。。。
最后附上丑陋的,调了一晚上的,连我自己都看不懂的代码——
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 600001
#define LL long long using namespace std; int n, m, q, M, cnt;
int size[N], sum[N * 10], ls[N * 10], rs[N * 10], root[N];
LL val[N * 10]; 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 << 1) + (x << 3) + ch - '0';
return x * f;
} inline LL del(int &now, int l, int r, int x, int f, int h)
{
if(!now) now = ++cnt;
sum[now]--;
if(l == r)
{
if(!f) return val[now] ? val[now] : (LL)(h - 1) * m + l;
return val[now] ? val[now] : (LL)l * m;
}
int mid = (l + r) >> 1;
if(mid - l + 1 + sum[ls[now]] >= x) return del(ls[now], l, mid, x, f, h);
else return del(rs[now], mid + 1, r, x - (mid - l + 1 + sum[ls[now]]), f, h);
} inline void insert(int &now, int l, int r, int x, LL d)
{
if(!now) now = ++cnt;
if(l == r)
{
val[now] = d;
return;
}
int mid = (l + r) >> 1;
if(x <= mid) insert(ls[now], l, mid, x, d);
else insert(rs[now], mid + 1, r, x, d);
} int main()
{
int i, x, y;
LL a, b;
n = read();
m = read();
q = read();
M = max(n, m) + q;
size[0] = n;
for(i = 1; i <= n; i++) size[i] = m - 1;
while(q--)
{
x = read();
y = read();
if(y != m) a = del(root[x], 1, M, y, 0, x);
b = del(root[0], 1, M, x, 1, x);
printf("%lld\n", y == m ? a = b : a);
if(y != m)
{
++size[x];
insert(root[x], 1, M, size[x], b);
}
++size[0];
insert(root[0], 1, M, size[0], a);
}
return 0;
}
就让这个题作为我回归奥赛的开端,SDOI2018加油!
[luoguP3960] 列队(动态开点线段树)的更多相关文章
- Luogu P3960 列队(动态开点线段树)
P3960 列队 题意 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有\(n \times m ...
- NOIP2017 列队——动态开点线段树
Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 ...
- 洛谷P3960 列队(动态开节点线段树)
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...
- [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- codeforces 915E - Physical Education Lessons 动态开点线段树
题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...
- CF915E Physical Education Lessons 动态开点线段树
题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...
- 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)
题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...
随机推荐
- Jenkins怎么启动和停止服务
笔者没有把Jenkins配置到tomcat中,每次都是用命令行来启动Jenkins.但是遇到一个问题:Jenkins一直是开着的,想关闭也关闭不了.百度了一些资料,均不靠谱(必须吐槽一下百度).于是进 ...
- JNI工程搭建及编译
JNI工程搭建及编译 建立Java工程 在具有C/C++比编译器的Eclipse中进行工程的创建,先创建一个简单的Java project,选项和一般同,这里仅仅需要将要调用的C/C++函数声明为na ...
- leetcode_1052. Grumpy Bookstore Owner
1052. Grumpy Bookstore Owner https://leetcode.com/problems/grumpy-bookstore-owner/ 题意:每个时刻i会有custome ...
- [Android 测试] 压力稳定性测试之: Monkey 详解分析脚本(转载)
一.什么是稳定性测试? 通过随机点击屏幕一段时间,看看app会不会奔溃,能不能维持正常运行. 二. Money是什么? Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模 ...
- 响应式Web设计- 背景图片
背景图片可以响应式调整大小或缩放,以下是三种不同的方式 1.如果 background-size 属性设置为 "contain", 背景图片将按比例自适应内容区域.图片保持其比例不 ...
- Python学习笔记2(序列)
元组不可变序列 tuple函数 总结 字符串 基本字符串的操作 字符串格式化 字符串方法 find join lower replace split strip translate 小结 元组:不可变 ...
- 【数学 exgcd】bzoj1407: [Noi2002]Savage
exgcd解不定方程时候$abs()$不能乱加 Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, L ...
- docker系列之安装配置
由于docker支持内核3.8以上的,所以我们要安装centos7系统,这个系统的内核是3.10,来支持docker使用环境 一.用UItralSo制作u盘启动 打开找到要做u盘启动的镜像 二.安装C ...
- 用java Graphics生成验证码
以下下是API文档对Graphics的介绍! Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. Graphics 对象封装了 Java ...
- getParameter getAttribute
URL:http://localhost:8888/Test/index.jsp?test=123 <body> ${test} ${requestScope.test} <%req ...