Codeforce 811 C. Vladik and Memorable Trip 解析(思維、DP)

今天我們來看看CF811C

題目連結

題目

給你一個數列,一個區段的數列的值是區段內所有相異數的\(XOR\)總和。你可以選任意多的區段,求最大的所有區段的值的總和。然而所有同樣的數字不是完全沒有被包含在區段裡,不然就是要全部在同個區段裡。

前言

這題我一直到看了解答才知道為什麼不是\(O(n)\),題目一直沒搞清楚

想法

這題的難點在,很難用\(O(n^2)\)以下找到一個真正的可行的區段。

此題的做法是線性DP,\(dp[i]\)為考慮到數列的第\(i\)個時的解答,而要計算\(i+1\),我們只需要多考慮是否有個區段是在\(i+1\)結尾。

首先可以\(O(n)\)得到每個數字最左和最右邊在哪裡,每當要計算\(dp[i+1]\)時,先看看\(i+1\)這個位置是否是某個數字的最右的位置,接著從\(i+1\)位置開始往回看,如果目前看的元素的最右位置超出\(i+1\),代表目前\(i+1\)不可能是某個區段的結尾,那麼\(dp[i+1]=dp[i]\);如果一切正常,直到目前位置已經到了目前看過的所有元素的最左位置,就代表我們已經找到一個結尾在\(i+1\)的區段了,此時\(dp[i+1]=\max\{dp[i],區段的\)XOR\(+\)dp[區段的最左-1]\(\}\)

官方解答有個Challenge,利用\(a\oplus b\le a+b\),可以應付\(n,a[i]\le1e5\)的情況,待之後想到再補吧!

程式碼:

const int _n=5010;
int t,n,a[_n],dp[_n];
bool vis[_n],has[_n];
PII alr[_n];
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;rep(i,1,n+1){
cin>>a[i];if(!alr[a[i]].fi)alr[a[i]].fi=i;
alr[a[i]].se=i;
}rep(i,1,n+1)if(alr[a[i]].se==i)has[i]=1;
dp[0]=0,dp[1]=(has[1]?a[1]:0);rep(i,2,n+1){
dp[i]=dp[i-1];
if(has[i]){
int val=0,L=alr[a[i]].fi;memset(vis,0,sizeof vis);
int j=i;while(j>=L){
if(alr[a[j]].se>i)goto A;
L=min(L,alr[a[j]].fi);
if(!vis[a[j]])val^=a[j],vis[a[j]]=1;j--;
}
dp[i]=max(dp[i],val+dp[L-1]);
}
A:;
}cout<<dp[n]<<'\n';
return 0;
}

標頭、模板請點Submission看

Submission

C. Vladik and Memorable Trip 解析(思維、DP)的更多相关文章

  1. Codeforces 811 C. Vladik and Memorable Trip

    C. Vladik and Memorable Trip   time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  2. C. Vladik and Memorable Trip DP

    C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...

  3. CodeForces - 811C Vladik and Memorable Trip(dp)

    C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  5. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  6. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  7. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  8. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  9. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

随机推荐

  1. PHP序列化与反序列化学习

    序列化与反序列化学习 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. <?php class UserInfo { public $name = &q ...

  2. MySql-8.0.x免安装版下载与配置,Navicat打开数据库链接报错1251的解决办法

    若你以前卸载过mysql,小白极大可能没有卸载和删除干净残留,没有卸载干净就肯定重装不成功,可参考https://www.cnblogs.com/Luoters/p/11869032.html 参考与 ...

  3. Python-字符串解析-正则-re

    正则表达式 特殊字符序列,匹配检索和替换文本 普通字符 + 特殊字符 + 数量,普通字符用来定边界 更改字符思路 字符串函数 > 正则 > for循环 元字符 匹配一个字符 # 元字符大写 ...

  4. OpeMp【schedule】

  5. spark-4-文件读写

    hdfs文件读写报错: AccessControlException: Permission denied: user=root, access=WRITE, inode="/user/ch ...

  6. Layman 对PHP源码进行加密保护

    加密软件(php_screw) >下载网站:http://sourceforge.net/projects/php-screw/ >描述:php文件通常以文本格式存贮在服务器端, 很容易被 ...

  7. unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...

  8. windows上启动docker容器报错:standard_init_linux.go:211: exec user process caused “no such file or directory” - Docker

    解决方案: standard_init_linux.go:190: exec user process caused "no such file or directory" - D ...

  9. shell-字符串及整数操作符讲解与多实践

    1. 字符串测试操作符 字符串测试操作符的作用:比较两个字符串是否相同.字符串长度是否为零,字符串是否为null(注:bash区分零长度字符串和空字符串)等. "="比较两个字符串 ...

  10. ansible-handlers变更执行操作

    1. ansible-handlers在变更执行操作  1) 编写playbook的handlers的配置文件 1 [root@test-1 bin]# vim /ansible/nginx/bin/ ...