首页 > 其他分享 >Codeforces 1830E - Bully Sort

Codeforces 1830E - Bully Sort

时间:2023-07-21 21:12:19浏览次数:35  
标签:Sort limits bel int sum Codeforces 1830E MAXN BLK

这种题肯定首先要寻找不变量

显然后面排好序的后缀不会被改变。因此从整体上来看我们的流程肯定是,如果当前 \(p_n=n\),就令 \(n\) 减一,否则你一步换的 \(i\) 肯定满足 \(p_i=n\)。而显然 \(\min\limits_{j=i}^np_j\le i\),因此我们考察 \(\sum|i-p_i|\) 和 \(\sum\limits_{i<j}[p_i>p_j]\),发现两者分别减小 \(2(j-i)\) 和 \(2(j-i)-1\)。因为最终两者全是 \(0\),所以答案就是初始的 \(\sum|i-p_i|-\sum\limits_{i<j}[p_i>p_j]\)。

偷懒写了分块。

const int MAXN=5e5;
const int BLK=710;
int n,qu,p[MAXN+5],b[MAXN+5],blk_sz,blk_cnt,L[BLK+5],R[BLK+5],bel[MAXN+5];ll sum=0;
int calc_lt(int v,int l,int r){
	if(l>r)return 0;
	if(bel[l]==bel[r]){
		int sum=0;
		for(int i=l;i<=r;i++)sum+=(p[i]<v);
		return sum;
	}else{
		int sum=0;
		for(int i=l;i<=R[bel[l]];i++)sum+=(p[i]<v);
		for(int i=L[bel[r]];i<=r;i++)sum+=(p[i]<v);
		for(int i=bel[l]+1;i<bel[r];i++){
			int pos=lower_bound(b+L[i],b+R[i]+1,v)-b;
			sum+=pos-L[i];
		}return sum;
	}
}
void rebuild(int x){
	for(int i=L[x];i<=R[x];i++)b[i]=p[i];
	sort(b+L[x],b+R[x]+1);
}
int t[MAXN+5];
void add(int x,int v){for(int i=x;i;i&=(i-1))t[i]+=v;}
int query(int x){int ret=0;for(int i=x;i<=n;i+=(i&(-i)))ret+=t[i];return ret;}
int main(){
	scanf("%d%d",&n,&qu);blk_sz=(int)sqrt(n);blk_cnt=(n-1)/blk_sz+1;
	for(int i=1;i<=n;i++)scanf("%d",&p[i]),b[i]=p[i],sum+=abs(p[i]-i);
	for(int i=1;i<=blk_cnt;i++){
		L[i]=(i-1)*blk_sz+1;R[i]=min(i*blk_sz,n);
		for(int j=L[i];j<=R[i];j++)bel[j]=i;
	}
	for(int i=1;i<=blk_cnt;i++)sort(b+L[i],b+R[i]+1);
	for(int i=1;i<=n;i++)sum-=query(p[i]),add(p[i],1);
	while(qu--){
		int x,y;scanf("%d%d",&x,&y);if(x>y)swap(x,y);
		sum+=((p[x]<p[y])?-1:1);
		sum+=2*calc_lt(p[x],x+1,y-1);sum-=2*calc_lt(p[y],x+1,y-1);
		sum-=abs(x-p[x]);sum-=abs(y-p[y]);
		swap(p[x],p[y]);
		sum+=abs(x-p[x]);sum+=abs(y-p[y]);
		rebuild(bel[x]);rebuild(bel[y]);
		printf("%lld\n",sum);
	}
	return 0;
}
/*
8 0
8 2 1 5 3 4 7 6
*/

C

标签:Sort,limits,bel,int,sum,Codeforces,1830E,MAXN,BLK
From: https://www.cnblogs.com/tzcwk/p/Codeforces-1830E.html

相关文章

  • Javascript数组sort方法的分析(转)
    特点:类似java的Comparatorjava:Arrays.sort(values,newComparator<Integer>(){publicintcompare(Integervalue1,Integervalue2){returnvalue2-value1;}});javascript:varvalues=[213,16,2058,54,10,1965,57,9];values.sort(fu......
  • Codeforces 794G - Replace All
    一个比较垃圾的做法,卡着时限过了这道题。首先大胆猜个结论:要么\(|s|=|t|\),此时\(A,B\)任取,要么存在字符串\(c\)和整数\(x,y\)使得\(A=c^x,B=c^y\),其中\(c^x\)表示\(x\)个\(c\)拼接得到的结果。证明的话感觉还挺复杂的,可能要border引理之类的东西,不过我是先写了个......
  • Codeforces 856F - To Play or not to Play
    首先,DP肯定是逃不掉的,因为直接贪心其实不好判断在两个人都可以上线的时间段究竟是哪个人上线,需要通过后面的情况来做出判断,但是这题值域比较大直接维护DP值肯定不行,因此考虑先设计一个与值域有关的DP然后优化。将时间区间离散化,然后依次考虑每个时间区间。一个很自然的想法......
  • Codeforces Round div.2 C
    Smiling&Weeping----我对姑娘的喜欢,何止钟意二字题目链接:Problem-C-Codeforces自我分析:我感觉这是一道很有意义的题目,可以帮我们更好的理解二进制的本质思路:首先先了解一下题目,我们是求由第i个数到末尾的异或和(异或:相同为0,不同为1),那么我......
  • Codeforces Round 882 div.2 B
    Smiling&Weeping----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@B.HamonOdysseytimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputJonathanisfightingagainstDIO......
  • Codeforces 1696G - Fishingprince Plays With Array Again
    初读题目可以发现一些性质:每次操作会使整个序列的和减少至多\(X+Y\),因此\(ans\ge\dfrac{\suma_i}{X+Y}\)。对于两个不相邻位置\(a_i,a_j(|i-j|>1)\),每次操作最多使它们的和减少\(\max(X,Y)\)。然后你发现两个限制可以结合在一起使用,稍加思考可以得到一个比较普适的结论:......
  • sort
    sort对文本文件中所有行进行排序。概要sort[OPTION]...[FILE]...sort[OPTION]...--files0-from=F主要用途将所有输入文件的内容排序后并输出。当没有文件或文件为-时,读取标准输入。选项排序选项:-b,--ignore-leading-blanks忽略开头的空白。-d,--dictionar......
  • Codeforces 1446F - Line Distance
    感觉这种类似于让你找第\(k\)大距离的计算几何题其实都挺套路的。二分一个答案\(t\),然后思考一下什么样的点对满足原点到它们的连线的距离\(\let\)。以原点为圆心\(t\)为半径画个圆,然后分情况讨论:如果\((x_i,y_i)\)或\((x_j,y_j)\)在圆内,那么必然符合条件。如果\(......
  • Codeforces 1621H - Trains and Airplanes
    这能3500?对于一组在\(u\)上的询问,考虑每种线路\(x\),假设\(1\tou\)路径上线路\(x\)的长度为\(len\),那么不难发现收罚款的次数只有两种可能:\(\lfloor\dfrac{len}{T}\rfloor\)或者\(\lfloor\dfrac{len}{T}\rfloor+1\),且对于一个\(v\)满足\(z_u=z_v\)且\(v\)在\(u......
  • Educational Codeforces Round 151
    AB略C(简)将密码\(P\)与\(S\)进行匹配,按顺序决定\(P_i\),为了避免\(P\)成为\(S\)的子串,每次贪心地选择当前匹配位置最靠后的。若出现匹配不上则“YES”。D有点意思。从基础的情况入手:设\(\{s_i\}\)为\(\{a_i\}\)的前缀和,弄出\(\{s_i\}\)的图像,让我们考虑第一个......