【CodeVS 5032】【省队集训2016 Day5 T1】Play with array
一开始我用分块大法,分成$\sqrt{n}$块,每个块上维护一个Splay,然后balabala维护一下,时间复杂度是$O(n\sqrt{n}logn)$。后来对拍的时候发现比$O(n^2)$的暴力跑得还慢,xxy学长说是Splay常数太大2333333
考试的时候没想到可以在每个块上建一个$10^5$的数组来存储每个数字出现的次数,而是用了常数巨大且复杂度多了一个log的SplayQwQ,发现自己完全没有对空间复杂度的认识啊(┙>∧<)┙へ┻┻
标算是块状链表,什么balabala比较基础地维护,卡着空间开2333333
我把块的大小设为$[\frac{\sqrt{n}}{2},\sqrt{n}×2)$,在codevs上TLE,,,
后来把块的大小改成了$[\sqrt{n},\sqrt{n}×2)$,1s内能轻松跑过。
也许是因为某些玄学的原因吧,,,
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100000;
const int B = 316;
const int BB = 632; int in() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 3) + (k << 1) + c - '0';
return k * fh;
} struct BLOCK {
BLOCK() {
nxt = NULL;
len = 0;
memset(times, 0, sizeof(times));
}
BLOCK *nxt;
int a[BB + B + 3], times[N + 1], len;
}; int cnt = 0;
int n; namespace BlockList {
BLOCK *head;
void Build(BLOCK * t) {head = t;}
void split(BLOCK *r) {
int rlen = r->len / 2, tlen = r->len - rlen, to = rlen;
BLOCK *t = new BLOCK;
memcpy(t->a + 1, r->a + rlen + 1, sizeof(int) * tlen);
for(int i = 1; i <= tlen; ++i) {
++t->times[t->a[i]];
--r->times[t->a[i]];
}
t->len = tlen;
r->len = rlen;
t->nxt = r->nxt;
r->nxt = t;
}
void merge(BLOCK *r) {
BLOCK *t = r->nxt;
if (t == NULL) return;
int tlen = t->len, to = r->len;
memcpy(r->a + to + 1, t->a + 1, sizeof(int) * tlen);
for(int i = 1; i <= tlen; ++i)
++r->times[t->a[i]];
r->len += tlen;
t = t->nxt;
delete r->nxt;
r->nxt = t;
if (r->len >= BB) split(r);
}
BLOCK *find(int &k) {
BLOCK *t = head;
while (k - t->len > 0 && t != NULL) {
k -= t->len;
t = t->nxt;
}
return t;
}
void work(int l, int r) {
BLOCK *t = find(r);
int num = t->a[r];
--t->times[num];
int tlen = --t->len;
for(int i = r; i <= tlen; ++i)
t->a[i] = t->a[i + 1];
if (t->len < B) merge(t);
t = find(l);
for(int i = ++t->len; i > l; --i)
t->a[i] = t->a[i - 1];
t->a[l] = num;
++t->times[num];
if (t->len >= BB) split(t);
}
int query(int l, int r, int k) {
BLOCK *tl = find(l), *tr = find(r);
int ret = 0;
if (tl == tr) {
for(int i = l; i <= r; ++i)
if (tl->a[i] == k) ++ret;
return ret;
} else {
int lentl = tl->len;
for(int i = l; i <= lentl; ++i)
if (tl->a[i] == k) ++ret;
for(int i = 1; i <= r; ++i)
if (tr->a[i] == k) ++ret;
for(tl = tl->nxt; tl != tr && tl != NULL; ret += tl->times[k], tl = tl->nxt);
return ret;
}
}
} int main() {
n = in();
int c = 0, k;
BLOCK *tmp = new BLOCK;
BlockList::Build(tmp);
for(int i = 1; i <= n; ++i) {
++c;
if (c > B) {
c = 1;
tmp->len = B;
tmp->nxt = new BLOCK;
tmp = tmp->nxt;
}
k = in();
tmp->a[c] = k;
++tmp->times[k];
}
tmp->len = c;
int m = in(), op, l, r;
while (m--) {
op = in(); l = in(); r = in();
if (op == 1)
BlockList::work(l, r);
else {
k = in();
printf("%d\n", BlockList::query(l, r, k));
}
}
return 0;
}
继续颓文化课,期末考试Bless All!
【CodeVS 5032】【省队集训2016 Day5 T1】Play with array的更多相关文章
- [2018湖南省队集训] 6.24 T1 marshland
题面在这里! 一开始感觉像一个类似二分图的最小割,于是成功跑偏2333333 很容易发现一个关键性质,'L'的两个角落在的偶数格 的行(或者列)的奇偶性一定不同.... 于是我们再把偶数格按照行(或者 ...
- JS省队集训记
不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...
- HN2018省队集训
HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...
- 2018HN省队集训
HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...
- 2017FJ省队集训 游记
2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
随机推荐
- Carcraft
魔兽登录系统 创建魔兽系统相关窗体: 登录窗体(frmLogin) 注册窗体(frmRegister) 主窗体 (frmMain) 实现魔兽登录系统: 登录的界面如下 实现思路: 1.创建一个 ...
- java 27 - 6 反射之 通过配置文件运行类中的方法
在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: public class Dog { public void eat() { S ...
- 小心 CSS3 Transform 引起的 z-index "失效"
https://www.douban.com/note/343402554/ http://www.jb51.net/css/255811.html 最后我直接removeClass;把transfo ...
- MySQL的mysql_insert_id和LAST_INSERT_ID(转)
本文介绍的是mysql中last_insert_id和mysql_insert_id的区别 1 mysql_insert_id 一.PHP获取MYSQL新插入数据的ID mysql_insert_id ...
- MySQL数据库的优化(下)MySQL数据库的高可用架构方案
MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...
- Java集合系列:-----------06List的总结(LinkedList,ArrayList等使用场景和性能分析)
现在,我们再回头看看总结一下List.内容包括:第1部分 List概括第2部分 List使用场景第3部分 LinkedList和ArrayList性能差异分析第4部分 Vector和ArrayList ...
- 反复请求某个URL缓存严重解决办法
有2个iframe页面A和B 点击B页面某按钮刷新A,A缓存严重. 后来发现是因为反复请求同样的URL,浏览器就在调用缓存. 解决方法是在URL后添加一个当前时间即可 var url,e=/[?]/g ...
- 用微信小程序做H5游戏尝试
微信小程序发布后,公司虽然没有拿到第一批内测资格,但作为微信亲密合作伙伴,一定要第一时间去尝试啦.现在微信小程序刚发布还在测试阶段,可以说是1.0版本,所以框架和结构内容都还不多,相关的文档跟微信AP ...
- Java调用C/C++编写的第三方dll动态链接库(zz)
这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...
- 博客搬家。新博客地址 http://fangjian0423.github.io/
以后新的博客会发到 http://fangjian0423.github.io/ 里. 这里基本上不会再更新博客了.