【COCI 2015/2016 #3】Nekameleoni
题目描述
“这好难啊,我有一个简单点的题,他们解决不了。”
AKPAKP有一个长度为nn的线段,这个线段原来染有颜色,AKPAKP只认识kk种颜色。当然原来的颜色也包含在着kk种颜色之间。
可以进行mm次操作:
改变一条起点为整点,单位长度的线段的颜色
查询包含所有kk种颜色的线段最少长度。
“我能做O(n6)O(n6). nn的范围多大?”
输入格式
第一行,三个数,nn,kk,mm。
第二行,nn个数,表示原来线段上的颜色。
下面mm行,每行第一个数optopt表示操作类型。
当opt=1opt=1时,继续读入两个数xx,yy,把第xx条线段改为yy颜色。
当opt=2opt=2时,表示查询包含所有kk种颜色的线段最少长度。
输出格式
对于每个opt=2opt=2的询问,输出当前包含所有kk种颜色的最少长度,如果无解,输出−1−1。
样例输入
4 3 5
2 3 1 2
2
1 3 3
2
1 1 1
2
样例输出
3
-1
4
数据范围
1≤n,m≤1051≤n,m≤105,1≤k≤501≤k≤50
Time Limit: 3s, Memory Limit 512Mb
不要提交多次卡评测。
# include <stdio.h>
# include <vector>
# include <algorithm>
typedef long long ll;
# define pli pair<ll, int>
# define MP make_pair
# define V first
# define NUM second
# define lc x<<
# define rc x<<|
using namespace std; int n, k, m;
int seq[]; int w[], llen[], rlen[];
pli left[][], right[][];
const int INF = ; inline bool in(ll a, ll b) {
return (a&b) == a;
} inline void merge(int x) {
w[x] = INF;
int plen = ;
for (int i=; i<=llen[lc]; ++i)
left[x][++plen] = left[lc][i];
for (int i=; i<=llen[rc]; ++i) {
if(plen == || !in(left[rc][i].V, left[x][plen].V)) {
left[x][++plen] = left[rc][i];
if(plen > ) left[x][plen].V = left[x][plen].V | left[x][plen-].V;
}
}
llen[x] = plen; int slen = ;
for (int i=; i<=rlen[rc]; ++i)
right[x][++slen] = right[rc][i];
for (int i=; i<=rlen[lc]; ++i) {
if(slen == || !in(right[lc][i].V, right[x][slen].V)) {
right[x][++slen] = right[lc][i];
if(slen > ) right[x][slen].V = right[x][slen].V | right[x][slen-].V;
}
}
rlen[x] = slen; // merge int rpos = ;
for (int lpos = llen[rc]; lpos >= ; --lpos) {
while(rpos <= rlen[lc] && (right[lc][rpos].V | left[rc][lpos].V) != (1LL<<k)-) ++rpos;
if(rpos <= rlen[lc]) {
if((right[lc][rpos].V | left[rc][lpos].V) == (1LL<<k)-) {
w[x] = min(w[x], left[rc][lpos].NUM - right[lc][rpos].NUM+);
}
}
}
w[x] = min(w[x], min(w[lc], w[rc]));
} inline void change(int x, int l, int r, int pos, int del) {
if(l == r) {
llen[x] = rlen[x] = ;
left[x][] = right[x][] = MP(1LL<<del, l);
w[x] = INF;
return ;
}
int mid = l+r>>;
if(pos <= mid) change(lc, l, mid, pos, del);
else change(rc, mid+, r, pos, del);
merge(x);
} int main() { scanf("%d%d%d", &n, &k, &m); for (int i=; i<=n; ++i) {
scanf("%d", &seq[i]);
change(, , n, i, seq[i]-);
} int opt, ta, tb;
while(m--) {
scanf("%d", &opt);
if(opt == ) {
printf("%d\n", w[] == INF ? - : w[]);
} else {
scanf("%d%d", &ta, &tb);
change(, , n, ta, tb-);
}
} return ;
}
代码分析
TongFang不会介意的,我copy了他的代码,自己不会写。
【COCI 2015/2016 #3】Nekameleoni的更多相关文章
- 【BZOJ 3881】【COCI 2015】Divljak
http://www.lydsy.com/JudgeOnline/problem.php?id=3881 好难的一道题啊qwq 一开始我想对T建AC自动机,根本不可做. 正解是对S建AC自动机. fa ...
- 【NOIP 2015 DAY2 T3】 运输计划 (树链剖分-LCA)
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- COCI 2015/2016 Day 8 PROKLETNIK
PROKLETNIK 题目描述:给出\(n\)个数,定义一段连续的数为魔法串是该区间的左右端点值正好是区间的最小值与最大值(最小值可以在左也可以在右,最大值也一样).\(Q\)个询问,每次询问一个区间 ...
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...
- B【USACO 2015 Jan Gold】牧草鉴赏家
时间限制 : 10000 MS 空间限制 : 65536 KB 问题描述 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝 ...
- 【NOIP 2015 D1 T2】信息传递(图论--带权并查集/bfs)
题目:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...
- bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct
[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了 ...
- [官方软件] Easy Sysprep v4.3.29.602 【系统封装部署利器】(2016.01.22)--skyfree大神
[官方软件] Easy Sysprep v4.3.29.602 [系统封装部署利器](2016.01.22) Skyfree 发表于 2016-1-22 13:55:55 https://www.it ...
- 【MyEclipse 2015】 逆向破解实录系列【终】(纯研究)
声明 My Eclipse 2015 程序版权为Genuitec, L.L.C所有. My Eclipse 2015 的注册码.激活码等授权为Genuitec, L.L.C及其付费用户所有. 本文只从 ...
随机推荐
- Git与Github的连接与使用
下面继续,使用git 将项目上传到GitHub上 首先要有GitHub账号,这就不用说了,没有的先注册,地址:https://github.com 没有仓库的话,先新创建一个仓库 填写新仓库名称,备注 ...
- one-hot编码
1 get_dummies函数 有多少种不同类就会产生多少位的编码,生成的age_df 实际上是一个变量,其存储着dataframe数据类型 完全可按dataframe对其操作 age_df = pd ...
- CRC16 的生成及校验原理
参考:https://blog.csdn.net/niepangu/article/details/45499383 计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC. 它不 ...
- 截止2017年,最新的全国行政区划代码数据源(xml)
<?xml version="1.0" encoding="utf-8"?> <Root xmlns:xsd="http://www ...
- vue 深拷贝
Vue.set(row,'isEdit',true); let newRow = JSON.parse(JSON.stringify(row)); this.totalData.push(newRow ...
- ulimit -a
在linux中执行ulimit -a 即可查询linux相关的参数 用ulimit命令是可以修改这些配置的命令的格式:ulimit [-SHacdefilmnpqrstuvx] [limit] 中间的 ...
- RAMOS (内存操作系统)-无忧百科(不断完善中)
RAMOS (内存操作系统)-无忧百科(不断完善中) - RAMOS - 无忧启动论坛 - Powered by Discuz! http://bbs.wuyou.net/forum.php?mod= ...
- Java核心-多线程-并发控制器-Semaphore信号量
Semaphore是非常有用的一个多线程并发控制组件(Java还有CountDownLatch.CyclicBarrier.Exchanger多线程组件),它相当于是一个并发控制器,是用于管理信号量的 ...
- Python import与from import使用及区别介绍
Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.接下来通过本文给大家介绍Python import与from import使用及区别介绍,感 ...
- AD中批量创建域用户
EXCEL表中的各列说明情况: A列:姓 B列:名 C列:姓名 D列:账号 E列:密码 此表格另存为person .csv 的格式到AD的C盘目录下,用记事本打开如下图所示: 打开CMD,右键以管理员 ...