AtCoder - arc100_c Or Plus Max(SOSdp)
题目链接:点击查看
题目大意:给出 2n2^n2n 个数,编号从 000 开始,现在要求出对于每个 k∈[0,2n)k\in[0,2^n)k∈[0,2n),找到两个下标 (i,j)(i,j)(i,j),满足 i⊕j<=ki \oplus j<=ki⊕j<=k,且 ai+aja_i+a_jai+aj 最大
题目分析:读完题后感觉很乱,因为绕了很多次,分析之后需要发现,i⊕j<=ki \oplus j<=ki⊕j<=k 这个条件,可以表示为 i⊕ji \oplus ji⊕j 一定是 kkk 的子集
所以我们就可以用 SOSdpSOSdpSOSdp 维护一下每个下标最大的两个数值,每次相加即可
转移的话,这个题目是需要从子集向超集转移
注意若 (i,j)(i,j)(i,j) 满足 i⊕j<=ki \oplus j<=ki⊕j<=k,则一定满足 i⊕j<=k+1i \oplus j<=k+1i⊕j<=k+1,所以答案非严格递增
代码:
// Problem: E - Or Plus Max
// Contest: AtCoder - AtCoder Regular Contest 100
// URL: https://atcoder.jp/contests/arc100/tasks/arc100_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int fi[N],se[N];
void update(int pos,int val) {if(val>fi[pos]) {se[pos]=fi[pos];fi[pos]=val;} else if(val>se[pos]) {se[pos]=val;}
}
int main()
{#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int n;read(n);for(int i=0;i<1<<n;i++) {int x;read(x);update(i,x);}for(int j=0;j<n;j++) {for(int i=0;i<1<<n;i++) {if((i>>j)&1) {//i的维度高于i|(1<<j)的维度update(i,fi[i^(1<<j)]);update(i,se[i^(1<<j)]);}}}int ans=0;for(int i=1;i<1<<n;i++) {ans=max(ans,fi[i]+se[i]);printf("%d\n",ans);}return 0;
}
AtCoder - arc100_c Or Plus Max(SOSdp)相关推荐
- leetcode周赛,希望咸鱼,有一天可以薅到羊毛
进阶指南每日一题地址 atcoder训练地址 leetcode max ratings:2100 碎碎念念 22/4/16 LCP春季杯 LCP 54. 夺回据点 少了个特判...qwq 22/3/6 ...
- AtCoder Regular Contest 100 E - Or Plus Max Sos dp
传送门 文章目录 题意: 思路: 题意: 给你一个长度为2n2^n2n的数组,让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的ai+aj,0≤i<j≤2n−1 ...
- AtCoder Beginner Contest 215 F - Dist Max 2
AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi,yi),定义两点(xi,yi),(xj,yj)(x ...
- AtCoder Beginner Contest 178 E.Dist Max
AtCoder Beginner Contest 178 E.Dist Max 题目链接 如果我们知道一个 nnn 维的点,对每一个维度都有一个运算符的话,很明显一共有 2n2^n2n 种运算,而曼哈 ...
- AtCoder AGC034D Manhattan Max Matching (网络流)
题目链接 https://atcoder.jp/contests/agc034/tasks/agc034_d 题解 降智了没想出来建图--(不过这场是真的DE放反了) 注意到曼哈顿距离有一个重要的性质 ...
- AtCoder AGC034D Manhattan Max Matching (费用流)
题目链接 https://atcoder.jp/contests/agc034/tasks/agc034_d 题解 降智了没想出来建图--(不过这场是真的DE放反了) 注意到曼哈顿距离有一个重要的性质 ...
- HDU - 6971 K - I love max and multiply sosdp
传送门 文章目录 题意: 思路: 题意: 思路: 直接求i&j>=ki\And j>=ki&j>=k不是很好求,所以转换成i&j=ki\And j=ki&am ...
- AtCoder Beginner Contest 136 E - Max GCD
Time Limit: 2 sec / Memory Limit: 1024 MB Score : 500 points Problem Statement We have a sequence of ...
- 【每日亿题#12】AtCoder Grand Contest 021 (A ~ F)全部题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 AtCoder Grand Contest 021 题解 A. Digit Sum 2 B. ...
最新文章
- linux exec 二程序,二十五、Linux 进程与信号---exec函数
- php 中margin-top,css margin-top属性怎么用
- java ee空指针_Java EE 7是最终版本。 思想,见解和进一步的指针。
- 2013科目三道路驾驶技能通用评判标准
- Mybatis(2)---多表查询
- homebrew php70,OSX下安装PHP7教程详解
- mysql 中文本类型有哪些_mysql数据类型有哪些
- MATLAB制作简易小动画入门详解
- 查看抽取解压缩和修改war包
- 高电平、低电平、高电平有效、低电平有效
- Andriod中如何新建lunch项
- ndk编译 toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe
- java hibernate 详解_hibernate详解一
- zynq uart0和uart1设置
- mom和mes系统有哪些异同点?
- Oracle导出导入dmp文件
- 计算机软件卡死,电脑运行卡或软件卡死无响应,怎么办?新生必看
- 机器学习典型隐私威胁
- JavaSE入门0基础笔记 第二章Java基础语法
- Linux下进程状态转换,Linux进程状态转换图