AEIOU
选出的子串中由AEI构成的子串和由OU构成的子串之间并没有什么关系,分别算出最长的加起来。
#pragma comment(linker, "/STACK:102400000,102400000")#include#include #include #include #include #include #include
数字游戏
这题看别人的代码貌似跟全排列有关,但是没想通关系在哪。
我的解法是这样的:首先加减和交换的顺序并不会影响操作的步数,所以可以看做是先进行若干步交换,然后依次把每一位加减为B的对应位数字。以A为初始状态进行bfs,然后卡时,就过了、
#pragma comment(linker, "/STACK:102400000,102400000")#include#include #include #include #include #include #include
第K小分数
前K个分数显然由每个质数构成的分数的前连续若干项构成,由于最多有1000个质数,所以最多有1000个最后一项,所以第K个分数一定是这最多1000个最后一项中的一个。可以用二分法来确定每种分母的最后一项并计算其排名,若其排名为K,则找到了题目要求的分数。
#pragma comment(linker, "/STACK:102400000,102400000")#include#include #include #include #include #include #include
逆序异或和
#includeusing namespace std;typedef long long ll;const int N = 100010;int n, a[N];struct BIT { int c[N]; void init() { memset(c, 0, sizeof(c)); } void insert(int x) { for (; x < N; x += x & -x) c[x] ++; } int count(int x, int res=0) { for (; x; x ^= x & -x) res += c[x]; return res; }}bit[20], num;int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", a + i); num.init(); for (int i = 0; i < 20; ++i) bit[i].init(); ll ans = 0; for (int i = n; i >= 1; --i) { int tar = num.count(a[i] - 1); num.insert(a[i]); for (int j = 0; j < 20; ++j) { int _num = 1 << j; int _bit = a[i] & _num; int _bit_tar = bit[j].count(a[i] - 1); if (_bit) { ans += 1LL * _num * (tar - _bit_tar); bit[j].insert(a[i]); } else { ans += 1LL * _num * _bit_tar; } } } cout << ans << endl; return 0;}