题意:

初始数列,每个数都在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. ThinkPHP之中的验证码的小示例

    ThinkPHP之中已经封装好了验证码的调用,但是关于手册,缺失了HTML之中以及.实际操作之中的点击ajax就会刷新验证码ajax代码:现在分享一下:看客老爷们注意啦! 放大招啦!!!三分归元气-- ...

  2. 批量删除的js代码

    <script type="text/javascript"> function seltAll(){ var chckBoxSign = document.getEl ...

  3. .NET软件汉化小实例

    Author:KillerLegend Date:2014.6.18 From:http://www.cnblogs.com/killerlegend/p/3795577.html 好的,今天我们来汉 ...

  4. Delphi开发的IP地址修改工具

    用Delphi进行开发的,直接修改注册表,需重启电脑后才生效

  5. Jquery在项目中的总结

    1.构造对象 var _getSearchArg = function () { var argModel = {}; argModel.Txt = value; argModel.Code = va ...

  6. AngularJs记录学习04

    <html> <head> <title>Angular JS Views</title> <script src="js/Angula ...

  7. Python2安装说明

    1.Python版本 Python 2.x的版本的,被称为Python2:是目前用的最广泛的,比如Python 2.7.12. Python 3.x的版本的,被称为Python3:是最新的版本的,比如 ...

  8. Python核心编程--学习笔记--8--条件与循环

    本章讲述if.while.for以及与他们搭配的else.elif.break.continue.pass等语句. 1 if语句 语法:三部分——关键字if.条件表达式.代码块.(记住冒号) if c ...

  9. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  10. nginx 配置 ThinkPHP Rewrite

    server { listen 80; server_name www.funsion.com; root /www/web/funsion; index index.php; location / ...