loj 2336「JOI 2017 Final」绳
首先,所有位置最多被染色一次,因为要染多次的话,还不如一开始就染成最终的颜色.并且你可以一开始就染好色
因为最终长度为2,那么如果染完后这个序列可以被折完,那么首先最多只有两种颜色,还有就是要满足对于所有同色极大联通块长度都要是偶数,不过第一个和最后一个长度可以为奇数
证明的话,先证充分条件,即这样子一定合法.可以搞出一个方法,每次只操作后面.先把最后面一个连通块长度缩成1(这样一定最优),然后因为接下来一个连通块长度为偶数,所以可以把接下来那个轴对称翻过去,然后重复这个操作直到长度为2.然后证中间有长度为奇数的一定不合法.首先如果缩到最后中间只有一个奇数长度的,那么你是翻不过去的.然后如果有多个奇数连通块,那么你怎么翻,中间部分都有奇数长度的.如果还是不理解可以问这个人(tpq)
然后考虑计算答案.首先长度为偶数的连通块可以拆成若干个长度为\(2\)的连通块,再根据第一个长度为\(2\)的连通块的起始位置是\(1\)还是\(2\)分类讨论,还有要使得染色次数最少,等价于不染色位置最多.枚举每一种颜色来算对应答案,如果连通块两个都是这种颜色,那么显然不用改;如果两个都不是这种颜色,那么都要染成另一种颜色,这种颜色是什么先不考虑;如果一个当前颜色一个不是当前颜色,那么可以发现把不是当前颜色的改成当前颜色一定不亏.现在再考虑另外一种颜色是什么,我们要尽量使得这种颜色位置最多,不过可能有些位置和当前枚举颜色在一起,这些位置要染掉,那么这种颜色的贡献就是出现总次数(\(记为cnt\))-和当前颜色在同一块的块个数(\(记为f_{i,j}\)).所以一种颜色答案\(i\)为\(n-cnt_i-\max_{j\neq i} (cnt_j-f_{i,j})\)
写的时候,\(f_{i,j}\)可以先把颜色不同的块内的两种颜色相互连边,然后\(f_{i,j}\)就是\(i,j\)之间的边数.然后按照\(cnt_j\)从大到小枚举另一种颜色,并且如果枚举到\(f_{i,j}=0\)的\(j\)就不用枚举了,接下来一定不优
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=1e6+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
};
int n,m,a[N],cn[N],sq[N],an[N],f[N][2];
int v[N];
bool cmp(int aa,int bb){return cn[aa]>cn[bb];}
vector<int> e[N];
void wk()
{
for(int i=1;i<=m;++i)
{
vector<int>::iterator it;
for(it=e[i].begin();it!=e[i].end();++it)
++v[*it];
for(int j=1;j<=m;++j)
{
int x=sq[j];
if(i==x) continue;
an[i]=max(an[i],cn[i]+cn[x]-v[x]);
if(!v[x]) break;
}
for(it=e[i].begin();it!=e[i].end();++it)
--v[*it];
}
}
int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;++i)
a[i]=rd(),++cn[a[i]];
for(int i=1;i<=m;++i)
an[i]=cn[i],sq[i]=i;
sort(sq+1,sq+m+1,cmp);
for(int i=1;i+1<=n;i+=2)
if(a[i]!=a[i+1])
e[a[i]].push_back(a[i+1]),e[a[i+1]].push_back(a[i]);
wk();
for(int i=1;i<=m;++i) e[i].clear();
for(int i=2;i+1<=n;i+=2)
if(a[i]!=a[i+1])
e[a[i]].push_back(a[i+1]),e[a[i+1]].push_back(a[i]);
wk();
for(int i=1;i<=m;++i) printf("%d\n",n-an[i]);
return 0;
}
loj 2336「JOI 2017 Final」绳的更多相关文章
- 「JOI 2017 Final」绳
题意 loj 做法 首先我们观察到最后能折起来的充要条件是: 只有两个颜色,除首尾外,所有颜色块内的数量为偶数 因为为偶数,我们进一步推论: 所有颜色块起始位置奇偶性相同 然后因为增与减都会有相同花费 ...
- loj#2334 「JOI 2017 Final」JOIOI 王国
分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...
- loj#2333 「JOI 2017 Final」准高速电车
分析 我们发现到达一个点一定是先快车再准快车再慢车 于是快车将1-n分为多个区间 每次取出每个区间当前能到达的点的数量 选剩余时间贡献最大的的一个取得贡献并且再能到达的最远点建立准快车 代码 #inc ...
- loj#2332 「JOI 2017 Final」焚风现象
分析 我们发现改变一个区间实际上只有两个端点的贡献变换 代码 #include<bits/stdc++.h> using namespace std; #define int long l ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- LOJ#2764. 「JOI 2013 Final」JOIOI 塔
题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...
- LOJ#2343. 「JOI 2016 Final」集邮比赛 2
题目地址 https://loj.ac/problem/2343 题解 首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数.这个显然可以\(O(n)\)处理出来.然后考虑在每个位置 ...
- loj 3014「JOI 2019 Final」独特的城市
loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...
随机推荐
- 2018-2019-2 20165205 网络对抗技术 Exp7 网络欺诈防范
2018-2019-2 20165205 网络对抗技术 Exp7 网络欺诈防范 实验内容 本次实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET ...
- SRS之监听端口的管理:RTMP
1. 监听端口管理的入口函数 监听端口的管理入口在 run_master 函数中,如下: int run_master() { ... if ((ret = _srs_server->liste ...
- 基本CSS布局
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 八十二:memcached之python操作memcached
安装:pip install python-memcached 创建链接:mc = memcache.Client(['127.0.0.1:11211'], debug=True) 插入数据:mc.s ...
- 工程变更(ENGINEERING CHANGE)
工程变更(ENGINEERING CHANGE)是企业活动重要的管制项目之一,依照实施的时间.目的不同,其管制细分如下: ECN (ENGINEERING CHANGE NOTICE)工程变更通知: ...
- GMM-EM实验结果
- 利用python列出当前目录下的所有文件
问题 当一个目录下有很多文件夹或者文件,我们想分析各个文件的名字,这时就可以写一个函数,列出当前目录下所有文件名字. 代码 src_dir = r'./' # 源文件目录地址 def list_all ...
- Day03:日期操作 / 集合框架(上)
日期操作 Java中的时间 · Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点: · 固定的时间点叫纪元(epoch),是U ...
- Java的Comparable接口
Comparable接口提供比较对象大小功能,实现了此接口的类的对象比较大小将通过接口提供的compareTo方法. 此方法的返回int类型,分三种情况. 返回正数,当前对象大于目标对象 返回负数,当 ...
- win10相机打不开,显示错误代码0xA00F4246(0x800706D9)
有时我们在不知道什么情况下电脑便会变成这个样子,当我们以为是驱动问题的时候,或许我们可以使用下面的办法解决这个问题 方法: 1.WIN键+R打开命令端,输入regedit运行 2.进入 计算机\HKE ...