【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及其付费用户所有. 本文只从 ...
随机推荐
- Java(全局变量-静态变量-位运算符)
全局变量是默认赋值的:而局部变量是没有默认赋值的(需要赋值才能使用)静态变量只能被静态方法使用 位运算右移,相当于做除法,2的n次幂00001000操作的位移数相当于是偏移量从右向左数n位,从第n+1 ...
- 芯灵思Sinlinx A64 linux 通过设备树写LED驱动(附参考代码,未测试)
开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 全志A64设备树结构体 #inc ...
- C++——volatile关键字的学习
首先声明一点,本文是关于volatile关键字的学习,学习内容主要是来自一些大牛的网络博客. 一篇是何登成先生的C/C++ Volatile关键词深度剖析(http://hedengcheng.com ...
- Java基础随记-不定时更新
一.hashMap与hashTable与ConcurrentHashMap: 1.HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类.不过它们都同时实现 ...
- 使用PROC TRANSPOSE过程步对数据集进行转置时如何保持日期变量的时间顺序
有一个数据集如下所示: 如果直接进行转置. SAS程序: proc transpose data=test out=outx1 (drop=_name_); by id; var amount; id ...
- 关于UI自动化中元素定位常用方法的个人总结
1.如果目标元素有id属性,优先使用id定位: 2.元素locator尽可能保证简洁,考虑locator中路径的变化频率,尽量减少后期更新和维护成本: 3.使用xpath时,不要一味的使用‘/’逐层进 ...
- servlet下载文件
package myjava.cn; import java.io.FileInputStream; import java.io.IOException; import java.io.InputS ...
- 【rabbitmq】rabbitmq集群环境搭建
安装rabbitmq-server 总共有3台虚拟机,都安装有rabbitmq服务,安装过程可参考: [rabbitmq]Centos7 下安装rabbitmq 创建用户和vhost 说明: 此步骤不 ...
- navigateTo、redirectTo、switchTap与reLaunch的区别
wx.navigateTo:保留当前页,跳转到指定页,非tabBar:使用 wx.navigateBack 可以返回到当前的页面. wx.redirectTo:关闭当前页,跳转到指定页,非tabBar ...
- C++ 线性搜索算法演示的代码
将做工程过程中比较好的内容做个备份,下边代码段是关于C++ 线性搜索算法演示的代码. #include<iostream>#include<conio> int linears ...