题意:

初始数列,每个数都在1~k以内

支持两种操作:1.修改一个数,修改后的数在1~k内

                          2.查询一个最短包含1~k的序列的长度

查询100000,数列100000,k是50

题解

考虑压缩状态到一个二进制串。

用一个线段树。每个点维护前缀的状态,后缀的状态。被包含的最短的

然后如果暴力合并子树信息,这样是的,其实有用的状态不超过个。那么时间复杂度就是

合并子树的时候尺取。

就是。卡卡卡卡卡常大概好像就过了

#include <cassert>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio> using namespace std; #define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR (i, 0, (n))
#define TRACE(x) cout << #x << " = " << x << endl
#define _ << " _ " << typedef long long llint;
typedef pair<llint, int> pli; const int INF = 1e9;
const int MAXNODES = 262144;
const int offset = 131072; inline bool subset(llint mask1, llint mask2) {
return (mask1 & mask2) == mask1;
} int n, k, q; class tournament {
private:
struct node {
int len;
pli pref[50];
pli suff[50];
int ans; node() { ans = INF; len = 0; }
node(int t, int v) {
len = 1;
pref[0] = suff[0] = pli(1LL<<v, t);
ans = INF;
}
}; node tree[MAXNODES]; void merge(node &t, node &l, node &r) {
int pref_len, suff_len; pref_len = 0;
for (int i = 0; i < l.len; ++i)
t.pref[pref_len++] = l.pref[i];
for (int i = 0; i < r.len; ++i)
if (pref_len == 0 || !subset(r.pref[i].first, t.pref[pref_len-1].first)) {
t.pref[pref_len] = r.pref[i];
if (pref_len > 0) t.pref[pref_len].first |= t.pref[pref_len-1].first;
++pref_len;
} suff_len = 0;
for (int i = 0; i < r.len; ++i)
t.suff[suff_len++] = r.suff[i];
for (int i = 0; i < l.len; ++i)
if (suff_len == 0 || !subset(l.suff[i].first, t.suff[suff_len-1].first)) {
t.suff[suff_len] = l.suff[i];
if (suff_len > 0) t.suff[suff_len].first |= t.suff[suff_len-1].first;
++suff_len;
} assert(pref_len == suff_len);
t.len = pref_len; t.ans = INF;
int pref_pos = 0;
for (int suff_pos = l.len-1; suff_pos >= 0; --suff_pos) {
while (pref_pos < r.len && (l.suff[suff_pos].first | r.pref[pref_pos].first) != (1LL<<k)-1)
++pref_pos;
if (pref_pos < r.len) {
llint curr_mask = l.suff[suff_pos].first | r.pref[pref_pos].first;
if (curr_mask == (1LL<<k)-1)
t.ans = min(t.ans, r.pref[pref_pos].second-l.suff[suff_pos].second+1);
}
}
t.ans = min(t.ans, min(l.ans, r.ans));
} public:
tournament() {} void update(int t, int v) {
t += offset;
tree[t] = node(t-offset, v);
for (t /= 2; t > 0; t /= 2)
merge(tree[t], tree[2*t], tree[2*t+1]);
} int query(void) {
return tree[1].ans;
} }; tournament T; int main(void) { #define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
FO(nekameleoni)
scanf("%d%d%d", &n, &k, &q); REP (i, n) {
int v;
scanf("%d", &v);
--v;
T.update(i, v);
} REP (i, q) {
int t;
scanf("%d", &t);
if (t == 1) {
int x, v;
scanf("%d%d", &x, &v);
--x; --v;
T.update(x, v);
} else {
int ans = T.query();
printf("%d\n", ans == INF ? -1 : ans);
}
} return 0;
}

[COCI]coci2015/2016 nekameleoni的更多相关文章

  1. 【COCI 2015/2016 #3】Nekameleoni

    题目描述 “这好难啊,我有一个简单点的题,他们解决不了.” AKPAKP有一个长度为nn的线段,这个线段原来染有颜色,AKPAKP只认识kk种颜色.当然原来的颜色也包含在着kk种颜色之间. 可以进行m ...

  2. COCI 2015/2016 Day 8 PROKLETNIK

    PROKLETNIK 题目描述:给出\(n\)个数,定义一段连续的数为魔法串是该区间的左右端点值正好是区间的最小值与最大值(最小值可以在左也可以在右,最大值也一样).\(Q\)个询问,每次询问一个区间 ...

  3. [COCI2015]COCI

    [COCI2015]COCI 题目大意: 有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数.现在已经得知每个人前两轮的成绩. ...

  4. [SinGuLaRiTy] COCI 2016~2017 #5

    [SinGuLaRiTy-1012] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 最近神犇喜欢考COCI...... 测试题目 对于所有的 ...

  5. COCI 2015、2016 1st round 题解(官方)

    官方题解: 官方代码: Code-KARTE: #include <cstdio> #include <iostream> #include <cstring> u ...

  6. @COCI 2016/2017 Round 3@ Meksikanac

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在平面直角坐标系中,给定一个左下角为 (0, 0),右上角为 ( ...

  7. Be Better:遇见更好的自己-2016年记

    其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...

  8. Connect() 2016 大会的主题 ---微软大法好

    文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...

  9. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman

    美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.9 是第三天, Scott Hanselman 做Keynote.今天主题围绕的是.NET ...

随机推荐

  1. div左右布局

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!DOCTYPE html> <html>     <head> ...

  2. js JSON对象属性

    json对象是是一种用于原生json分析的对象,无法对其进行构造函数调用,用java术语 来说,它相当于能够直接使用类方法的工具类JSON对象的属性parse(text[,reviver]);对参数t ...

  3. C-链表的一些基本操作【创建-删除-打印-插入】

    #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define LEN sizeof(stru ...

  4. win7修改软件【授权给…】后面的名称

    很简单,按下图打开注册表,修改: Ctrl+F分别搜索以下三个键值,搜到后修改为你想显示的名称即可即可. 1:UserName 2:RegisteredOrganazition 3:Registere ...

  5. Show or Hide Menu List via ng-show

    <div ng-app ng-controller='MenuController'> <ul ng-show='menuState_show'> <li>Stun ...

  6. 学一点Git--20分钟git快速上手 [Neil]

    From: http://www.cnblogs.com/shuidao/p/3535299.html (图片已修复)在Git如日中天的今天,不懂git都不好意思跟人说自己是程序猿.你是不是早就跃跃欲 ...

  7. python 装饰器(decorator)

    装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...

  8. moses:processPhraseTable被删除

    今年一月,processPhraseTable被删除了,具体原因如下: https://www.mail-archive.com/moses-support@mit.edu/msg11372.html ...

  9. spring 基本操作总结主要是aop以及依赖注入的基本配置

    一所需架包 spring commom-logging.jar  spring.jar 注解 common-annotation.jar aop面向切面 aspectjrt.jar    aspect ...

  10. oracle 分析函数(笔记)

    分析函数是oracle数据库在9i版本中引入并在以后版本中不断增强的新函数种类.分析函数提供好了跨行.多层次聚合引用值的能力.分析函数所展现的效果使用传统的SQL语句也能实现,但是实现方式比较复杂,效 ...