4.7日刷题记录

小朋友排队

注意0的情况, lowbit(0) = 0;
类似于冒泡排序,k个逆序对,交换k次,每次交换只会使逆序对减一
因为考虑了区间,所以用了树状数组
树状数组里存的是这个数字的个数
k个逆序对:比它大的 + 比它小的
每个数都会被这样操作一次,所以需要除二,每个数必定被操作一次(虽然但是,还是不能明白(n * (n + 1) / 2)

int a[maxn];
int sum1[maxn], sum2[maxn];
int n;

inline int lowbit(int x){
	return x & (-x);
}

void updata(int i, int val){
	while(i < maxn){
		sum1[i] += val;
		//sum2[i] += val;
		i += lowbit(i);
	}
}

int sum(int i){
	int Sum = 0, x = i;
	while(i){
		Sum += sum1[i];
		i -= lowbit(i);
	}
	return Sum;
}

int ans1[maxn];

int main() {
	IOS;
	// freopen("P1908_6.in","r",stdin);//读入数据
	// freopen("P1908.out","w",stdout); //输出数据
	cin >> n;
	for (int i = 0; i < n; ++i){
		cin >> a[i];
		++a[i];
	}
	for(int i = 0; i < n; ++i){
		ans1[i] = sum(maxn - 1) - sum(a[i]);
		updata(a[i], 1);//每个数的个数
	}
	re(sum1);
	for (int i = n - 1; i >= 0; --i){
		ans1[i] += sum(a[i] - 1);
		updata(a[i], 1);
	}
	ll res = 0;
	for (int i = 0; i < n; ++i){
		res += (ll)ans1[i] * (ans1[i] + 1) / 2;
	}
	cout << res << endl;
	return 0;
}

垒骰子

和前面斐波那契数列同样的道理

同样用到了矩阵快速幂(只有背了) 算是套路。
每个状态是有限制的,且限制相同就能进行矩阵快速幂,因为能推出A[]矩阵 f[][]
能够清楚地表示出上一个的状态,所以如果发现dp的数据范围不够,肯定是想岔了

int f[6][6] = {4, 4, 4, 4, 4, 4};
int a[6][6];

int get_op(int i){
	if(i < 3)
		return i + 3;
	return i - 3;
}

void mul(int a[][6], int b[][6], int c[][6]){
	static int t[6][6];
	re(t);

	for (int i = 0; i < 6; ++i){
		for (int j = 0; j < 6; ++j){
			for (int k = 0; k < 6; ++k){
				t[i][j] = (t[i][j] + (ll)b[i][k] * c[k][j]) % mod;
			}
		}
	}
	 memcpy(a, t, sizeof t);
}
int main() {
	IOS;
	// freopen("P1908_6.in","r",stdin);//读入数据
	// freopen("P1908.out","w",stdout); //输出数据
	int n, m;
	cin >> n >> m;

	for (int i = 0; i < 6; ++i){
		for (int j = 0; j < 6; ++j){
			a[i][j] = 4;
		}
	}

	while(m--){
		int x, y;
		cin >> x >> y;
		--x, --y;
		a[x][get_op(y)] = 0;
		a[y][get_op(x)] = 0;
	}

	//快速幂
	for (int i = n - 1; i; i >>= 1){
		if(i & 1)
			mul(f, f, a);
		mul(a, a, a);
	}
	int res = 0;
	for (int i = 0; i < 6; ++i){
		res = (res + f[0][i]) % mod;
	}
    cout << res;
		return 0;
}

大小写转换
transform(src.begin(), src.end(), src.begin(), ::toupper);
transform(src.begin(), src.end(), dst.begin(), ::tolower);
字符互转:
atoi(tem.c_str());

剩下时间在刷往年蓝桥杯题解,感觉连省三都拿不到(毕竟基本0题),说好的暴力无用水杯呢呜
早知道早开始准备了orz,明年再战吧(再挣扎一小下下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值