题意:

初始数列,每个数都在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. PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍

    目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...

  2. mysql 排重查询

    GROUP BY 语句可以实现某一列的去重查询. 直接上语句: select io_dev_id from io_info where (TID=1 AND host_name='yang1') GR ...

  3. 倒水问题 (codevs 1226) 题解

    [问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...

  4. ASP.NET Web API安全认证

    http://www.cnblogs.com/codeon/p/6123863.html http://open.taobao.com/docs/doc.htm?spm=a219a.7629140.0 ...

  5. 13.python中的字典

    字典其实和之前的元祖和列表功能相似,都是用来储存一系列对象的.也就是一种可变容器,或者是我所比喻的革新派的菜单. 但也不是完全相同,我在之前曾经将字典称为特殊的'序列',是字典拥有序列的部分特性,但是 ...

  6. 第一个MySQL 存储过程

    昨天写了人生第一个mysql存储过程:遗憾的是,这个存储过程最后还是没用上,用php代码替代 话说mysql的存储过程真是反人类,不查reference,基本不能看懂那些语句:语言中能和它相比的,只有 ...

  7. C 函数可变参数

    C 函数可变参数 C 语言中用 ... 表示可变参数,例如: void fun(int x ...) 头文件 cstdarg.h 中包含可变参数类型va_list和处理可变参数的三个宏: va_lis ...

  8. 'mysql.column_stats' doesn't exist and Table 'mysql.index_stats' doesn't exist

    在生产库MariabDB中修改字段类型,提示如下错误:​Table 'mysql.column_stats' doesn't existTable 'mysql.index_stats' doesn' ...

  9. 机器学习相关——协同过滤

    在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.本文将带你深入了解协同过滤的秘密.下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法.要理解什么是 ...

  10. Drawable

    今天简单的介绍一下有关以下5中的应用: Statelistdrawable Layerdrawable Shapeddrawable Clipdrawable Animationdrawable 1. ...