NOIP2017 Day2_T3 列队
来源:互联网 发布:stm32f4中文数据手册 编辑:程序博客网 时间:2024/06/16 01:37
题目大意:
众人皆知。
题解:
考场时打SBT打傻了,被卡爆了。
这就是个傻逼线段树能过的东西,不要问我问为什么能跑这么快?
每一行用线段树维护前m-1个。
最后一列独立开来。
查询用线段树二分。
可以直接预开6e5。
完。
Code:
#include<cstdio>#include<cstring>#include<algorithm>#define ll long long#define fo(i, x, y) for(int i = x; i <= y; i ++)using namespace std;const int N = 300005;int n, m, Q, x, y;int tot, g[N], ed[N];struct node { ll x, y; int l, r, s;} t[16000000];void update(int i) { if(t[i].x != 0) { ll m = t[i].x + t[i].y >> 1; t[t[i].l].x = t[i].x; t[t[i].l].y = m; t[t[i].r].x = m + 1; t[t[i].r].y = t[i].y; t[t[i].l].s = t[t[i].l].y - t[t[i].l].x + 1; t[t[i].r].s = t[t[i].r].y - t[t[i].r].x + 1; t[i].x = 0; }}void change(int i, int x, int y, int l, int r, ll l1, ll r1) { if(x == l && y == r) { t[i].x = l1; t[i].y = r1; t[i].s = r1 - l1 + 1; return; } int m = x + y >> 1; if(t[i].l == 0) t[i].l = ++ tot; if(t[i].r == 0) t[i].r = ++ tot; if(r <= m) change(t[i].l, x, m, l, r, l1, r1); else if(l > m) change(t[i].r, m + 1, y, l, r, l1, r1); else { ll m1 = l1 + m - l; change(t[i].l, x, m, l, m, l1, m1); change(t[i].r, m + 1, y, m + 1, r, m1 + 1, r1); } t[i].s = t[t[i].l].s + t[t[i].r].s;}int ans1; ll ans2;void find(int i, int x, int y, int s) { if(x == y) { ans1 = x; ans2 = t[i].x; return; } int m = x + y >> 1; if(t[i].l == 0) t[i].l = ++ tot; if(t[i].r == 0) t[i].r = ++ tot; update(i); t[t[i].l].s >= s ? find(t[i].l, x, m, s) : find(t[i].r, m + 1, y, s - t[t[i].l].s);}struct nnode { int x, y;}q[N];int mx[N];int main() { freopen("phalanx.in", "r", stdin); freopen("phalanx.out", "w", stdout); scanf("%d %d %d", &n, &m, &Q); fo(i, 1, n) mx[i] = m - 1; fo(i, 1, Q) { scanf("%d %d", &x, &y); q[i].x = x; q[i].y = y; mx[x] ++; } mx[n + 1] = n + Q; fo(i, 1, n) { g[i] = ++ tot; change(g[i], 1, mx[i], 1, m - 1, (ll)(i - 1) * m + 1, (ll) i * m - 1); ed[i] = m - 1; } g[n + 1] = ++ tot; fo(i, 1, n) change(g[n + 1], 1, mx[n + 1], i, i, (ll) i * m, (ll) i * m); ed[n + 1] = n; fo(i, 1, Q) { x = q[i].x; y = q[i].y; if(y == m) { find(g[n + 1], 1, mx[n + 1], x); change(g[n + 1], 1, mx[n + 1], ans1, ans1, 0, -1); ed[n + 1] ++; change(g[n + 1], 1, mx[n + 1], ed[n + 1], ed[n + 1], ans2, ans2); printf("%lld\n", ans2); } else { find(g[x], 1, mx[x], y); int a1 = ans1; ll a2 = ans2; find(g[n + 1], 1, mx[n + 1], x); change(g[x], 1, mx[x], a1, a1, 0, -1); ed[x] ++; change(g[x], 1, mx[x], ed[x], ed[x], ans2, ans2); change(g[n + 1], 1, mx[n + 1], ans1, ans1, 0, -1); ed[n + 1] ++; change(g[n + 1], 1, mx[n + 1], ed[n + 1], ed[n + 1], a2, a2); printf("%lld\n", a2); } }}
阅读全文
1 0
- NOIP2017 Day2_T3 列队
- 洛谷P3960 [NOIp2017]列队
- NOIP2017 D1T3 列队
- NOIP2017 D2T3 列队
- [noip2017]列队 splay
- jzoj5478. 【NOIP2017提高组】列队
- NOIP2017提高组D2T3[列队]
- 【NOIP2017提高组正式赛】列队
- 【NOIP2017提高组正式赛】D2T3列队
- 5478. 【NOIP2017提高组正式赛】列队
- 「NOIP2017」列队 //线段树
- NOIP2017 列队 题解报告【56行线段树】
- JZOJ 5478. 【NOIP2017提高组正式赛】列队
- NOIP2017 列队 线段树(指针版)+vector
- 【NOIP2017DAY2T3 【NOIP2017提高组正式赛】列队 】(动态开点+n棵线段树)
- 消息列队
- 战马列队
- 数据结构--列队
- OI之路
- 《React-Native系列》 API模块之PixelRatio和Dimensions
- 【文本聚类】用k-means对文本进行聚类
- Eclipse断点调试出现Source not found
- C语言实验——圆周率
- NOIP2017 Day2_T3 列队
- 【设计模式学习笔记】单例模式
- 测试
- Android深入四大组件(六)Android8.0 根Activity启动过程(前篇)
- JAVA中关于switch方法的变更
- python内置模块(json)
- java反射详解,原理分析
- img标签,后台服务器发生变化,但是显示图片未变
- cocos2d-x屏幕自适应原理