首页 > 其他分享 >ARC097E题解

ARC097E题解

时间:2022-08-18 18:22:50浏览次数:48  
标签:const int 题解 read while ARC097E return getchar

感觉挺一眼的啊?

众所周知如果序列 \(i\) 要通过相邻两项交换变成 \(p_i\),那么交换次数就是 \(\sum_{i<j}[p_i>p_j]\),或者说线段 \((i,p_i)\) 相交的对数。

于是一个很 naive 的想法就是枚举最终序列的黑白状态,但是这样显然行不通。

一看数据范围,\(n=2000\),是不是能在上面做点手脚。

容易发现黑色球的序列和白色球的序列是单调的,所以只需要知道某个球前面有几个黑球几个白球以及这个球是什么颜色就能知道这个球的位置和权值应该是多少。

于是考虑 DP,设 \(dp[n][m]\) 表示前 \(n\) 个黑球和前 \(m\) 个白球的线段最多有几个相交,容易发现就是 \(i\) 比自己小 \(p_i\) 比自己大的。

这个数线段非常容易,因为 \(n\) 只有 \(2000\) 所以可以直接暴力做二维偏序。

然后基本上就做完了,复杂度 \(O(n^2)\),需要注意一些细节。

#include<cstdio>
#include<cctype>
const int M=2005;
int n,S1[M][M*2],S2[M][M*2],dp[M][M],p1[M],p2[M];
inline char read_c(){
	char s;while(!isalpha(s=getchar()));return s;
}
inline int read(){
	int n(0);char s;while(!isdigit(s=getchar()));while(n=n*10+(s&15),isdigit(s=getchar()));return n;
}
inline int min(const int&a,const int&b){
	return a>b?b:a;
}
signed main(){
	n=read();
	for(int i=1;i<=n*2;++i){
		bool typ=read_c()=='W';(typ?p1:p2)[read()]=i;
	}
	for(int i=1;i<=n;++i)++S1[i][p1[i]],++S2[i][p2[i]];
	for(int i=1;i<=n;++i)for(int j=1;j<=n*2;++j)S1[i][j]+=S1[i-1][j],S2[i][j]+=S2[i-1][j];
	for(int i=1;i<=n;++i)for(int j=1;j<=n*2;++j)S1[i][j]+=S1[i][j-1],S2[i][j]+=S2[i][j-1];
	for(int i=0;i<=n;++i)for(int j=0;j<=n;++j){
		const int&w1=(j?dp[i][j-1]+(i-S1[i][p2[j]-1])+(j?j-1-S2[j-1][p2[j]-1]:0):1e9);
		const int&w2=(i?dp[i-1][j]+(i?i-1-S1[i-1][p1[i]-1]:0)+(j-S2[j][p1[i]-1]):1e9);
		dp[i][j]=!i&&!j?0:min(w1,w2);
	}
	printf("%d",dp[n][n]);
}

标签:const,int,题解,read,while,ARC097E,return,getchar
From: https://www.cnblogs.com/lmpp/p/16599709.html

相关文章

  • 【题解】 洛谷P3694 邦邦的大合唱站队
    发现尽管\(n\)比较大,但\(m\)非常小,于是考虑状压。记\(dp_{i}\)表示满足条件的乐队集合为\(i\)时的最小出队人数,\(dp_i=\min\{dp_{i\\xor\\1<<k}\}+w_{i\\xo......
  • [CF1450F] The Struggling Contestant 题解
    \(\mathtt{Link}\)CF1450FTheStrugglingContestant-洛谷|计算机科学教育新生态(luogu.com.cn)\(\mathtt{Description}\)\(T\)组数据。一共有\(n\)道题,题号......
  • P5080 Tweetuzki 爱序列 题解
    题目传送门更好地阅读体验题目大意Tweetuzki有一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)。他希望找出一个最大的\(k\),满足在原序列中存在一些数\(b_1,b......
  • IOI 2022 简要题解
    考前写题解增加RP。D1T1:考虑按照列DP。对于每一列选择的鱼的区间进行决策。每列中被选择的y坐标最大的鱼,需要被左面或右面覆盖。假设我们决策好了前i列的方案,考虑第i列......
  • [题解] HDU 5115 Dire Wolf 区间DP
    考虑先枚举所有的物品中最后拿走的,这样就分成了2个子问题,即先拿完左边的,再拿完右边的,最后拿选出的那个。令dp(i,j)表示拿完[i,j]所有物品的最小代价。你可能会说,我们拿[i,j......
  • 题解 CF1575D【Divisible by Twenty-Five】
    值域非常小,其中只有\(4\times10^6\)个数是\(25\)的倍数,因此可以暴力枚举所有位数正确的\(25\)的倍数,然后检查是否合法。检查方法就是枚举每一位,如果是数字就必须一......
  • CF Round 814 Div2 题解
    A题ChipGame(签到)给定一个\(n\)行\(m\)列的方格矩阵,左下角是\((1,1)\),右上角是\((m,n)\)。(采取了类似笛卡尔坐标系的表示法,不是普通的\(x\)行\(y\)列)Burenka......
  • CF578C题解
    看到题面的第一眼是这玩意儿关于x是单谷的,证明稍微想了一下:设\(f[k]\)和\(g[k]\)是原序列中长度为\(k\)的子区间的最大子区间和最小子区间,给定\(x\)时答案就相......
  • CF1719C Fighting Tournament 题解
    思路根据题意,很容易看出,每个人都完成一次比赛后,即完成\(n-1\)轮之后,力量值最大的人会留在第一的位置,且在第\(n-1\)轮完成后,除了力量值最大的人,其他人的胜场数都不会再......
  • CF1719A Chip Game 题解
    题目传送门。思路当其中一个人不能动的时候,这个人一定位于点\((n,m)\)上。令点\((n,m)\)为终点。当\(n\)和\(m\)都是奇数或当\(n\)和\(m\)都是偶数时,赢的人......