首页 > 其他分享 >【题解】洛谷P3531: [POI2012] LIT-Letters

【题解】洛谷P3531: [POI2012] LIT-Letters

时间:2024-11-21 08:56:12浏览次数:1  
标签:P3531 洛谷 int 题解 LIT POI2012 编号 逆序

P3531 [POI2012] LIT-Letters

写了个假做法有点伤心,本以为是两个都求逆序对然后答案相减,但是这样在部分数据上确实合法,但是实际上毫无章法没有逻辑。

正解考虑贪心,我们一个数字肯定要找最前面,第二次出现就去最前面第二次出现的位置,因为如果第一个A放在了后面,那么就有可能产生更对逆序对(因为你把大的数放在了前面)。

我们对每个字母重新编号,\(A\) 为 ABC 编号为 123,\(B\) 为 CBA 编号为 321

接下来就可以正常求逆序对了。

其实思想就是多个重复的我们进行去重,让他们有对应的编号,像原来为A为010,B为100,完全没法去逆序对,不知道的还以为是区间差呢,但是我们重编号就为123,213这就很明确了,我们都尽量向前靠,每个数该去哪就去哪。

#include<bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1 
#define re register 
const int N=1e6+10;
const int mod=998244353;
using namespace std;

int n;

int a[N],b[N];
 

int t[N];

int lb(int x){
	return x&-x;
}

void add(int x,int k){
	while(x<=n){
		t[x]+=k;
		x+=lb(x);
	}
}

int query(int x){
	int sum=0;
	while(x){
		sum+=t[x];
		x-=lb(x);
	}
	return sum;
}

int vis[30][N];
int tt[100]; 

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
	
	cin>>n;
	
	for(int i=1;i<=n;i++){
		char c;
		cin>>c;
		a[i]=c-'A'+2;
	}
	for(int i=1;i<=n;i++){
		char c;
		cin>>c;
		b[i]=c-'A'+2;
	}
	
	for(int i=1;i<=n;i++){
		vis[a[i]][++vis[a[i]][0]]=i;
	} 
	for(int i=1;i<=n;i++){
		b[i]=vis[b[i]][++tt[b[i]]];
	} 
	int ans=0;
	for(int i=n;i>=1;i--){
		ans+=query(b[i]-1);
		add(b[i],1);
	}
	cout<<ans;
	
	return 0;
}

标签:P3531,洛谷,int,题解,LIT,POI2012,编号,逆序
From: https://www.cnblogs.com/sadlin/p/18559851

相关文章

  • 洛谷P6225异或橙子
    洛谷P6225异或橙子位运算思维树状数组这是题面思路先看一下这个式子要干什么例如\(l=2,u=4\)的情况,记橙子序列\(A\)中第\(i\)个橙子的整数是\(a_i\),那么他要求的就是:\[a_2\oplusa_3\oplusa_4\oplus(a_2\oplusa_3)\oplus(a_3\oplusa_4)\oplus(a_2\oplusa_......
  • P8290 填树 题解
    题意:给定一棵树,第\(i\)个点的赋值范围是\([L_i,R_i]\)。计数:选择一条路径,将路径上的点赋值,使得极差\(\leK\);并求出每种这样赋值方案的权值和。\(n\le200\),其余\(\le10^9\)。看见极差,考虑枚举最小值\(x\),然后统计\([x,x+k]\)的答案。思路很简单,但是下一个问题是:\(x......
  • 洛谷算法题P1307 [NOIP2011 普及组] 数字反转
    题目题目描述给定一个整数N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。输入格式一个整数N。输出格式一个整数,表示反转后的新数。样例#1样例输入#1123样例输......
  • Atcoder Regular Contest 059 题解
    ARC059C.BeTogether签到题。枚举要改成哪个,因为值域只有\([-100,100]\)。然后对总代价取个\(\min\)即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constLLMAXN=105;LLn,A[MAXN];intmain(){ ios::sync_with_stdio(false); cin.ti......
  • [题解]CF1685B Linguistics
    @hzjoiineg为什么是神?思路首先将\(S\)中A的数量不等于\(a+c+d\)的情况判掉。然后将\(S\)划分为ABAB...和BABA...的若干段,对于长度为奇数的段构造方案只能是如下构成:A开头为例):AB和BA共\(\lfloor\frac{len}{2}\rfloor\)个,再加一个A。将\(a\)减一,并用......
  • 洛谷 P11210 强制在线动态二维数点
    题目传送门题目中的点满足\(y\lex\),那么不妨把每个点看成区间\([y,x]\)。那么题目相当于要求维护若干个区间,支持修改,以及查询询问区间中区间长度的最小值。从“区间长度的最小值”入手。显然包含别的区间的区间不能成为答案。排除了这样的区间,剩下区间按左端点升序排序,则右端......
  • 洛谷 P1613 跑路 做题记录
    前置芝士:最短路、floyd传递闭包、倍增思路看到题目里面的一次能走\(2^k\)千米,我们联想到倍增,因为只能用跑路器。我们枚举\(k\),然后做一次传递闭包,\((i,j)\)走\(2^k\)千米是相连的,当且仅当有一个点\(k\)是的\((i,k),(k,j)\)可以通过走\(2^{k-1}\)千米相连。此时,\((......
  • Atcoder Regular Contest 058 题解
    ARC058C.Iroha'sObsession*1174\(n\)再大一点的就是巨大恶心分类讨论。但我们注意到\(n\leq10^4\),所以我们可以直接暴力枚举然后写个check。首先我们先把被ban掉的数存标记一下。然后从\(n\)开始往上查,一直查到\(10^6\)基本就可以了。然后每次检查一下有没有数位被......
  • 2022沈阳D题题解
    2022沈阳D题题解​ 这题在VP的时候成功把我卡死了,原因是我一直没有想到用KMP去大力匹配,导致我的算法复杂度一直是O(n^2logn),然后就很典的T了。​ VP完了之后想各种优化卡过去,但是都失败了,跑校园跑的时候突然想到怎么解了。​ 现在我是这样看待这个问题的,这个问题应该是可以被拆......
  • rk3588 银河麒麟自动锁屏问题解决
    rk3588适配的银河麒麟在设置-》电源选项中设置“从不”后依然会触发自动锁屏。通过gsettings设置依然无效。gsettingssetorg.ukui.screensaveridle-delay-1gsettingssetorg.ukui.screensaveridle-lock-1gsettingssetorg.ukui.screensaveridle-activation-enabledfa......