Codeforces Round #750 (Div. 2)
A. Luntik and Concerts
题意:T组询问,每次给你a个1元,b个2元,c个3元,让你把这些钱分给两个人,使得这两个人得到的总钱数差值尽量小
sol.因为数据比较弱,直接输出\((a + 2 * b + 3 * c) \% 2\)即可
B. Luntik and Subsequences
题意:让你求出一个序列的子序列个数,使得这个子序列sum = 原来序列的权值 - 1
sol.直接统计1的个数和0的个数就好了
C. Grandma Capa Knits a Scarf
题意:让你选定一个字母,你可以删去它给你的字符串里面的 你选定的小写字母 若干个,最后使得你删去字符后的字符串是一个回文串,问最小删去字母个数
sol.直接枚举一下,删那个字符,直接模拟一下就好了
D. Vupsen, Pupsen and 0
题意:给你一个序列\(\{a_i\}\),让你构造出一个等长的序列\(\{b_i\}\),使得\(\sum_{i = 1}^na_i * b_i = 0\)
sol.很简单吧,先考虑一下n为偶数的时候
如果 a序列为
n为奇数也类似,不过注意 \(\{b_i\}\)中不能出现0
E. Pchelyonok and Segments
题意:给你一个序列,问你最多能取 一个k多少,使得存在 题目给定的那个 \(k-sub\)之类的玩意
sol.挺蠢的(不止说这题,还说我自己),首先考虑\(k <= \sqrt n\)这个是平凡的
直接直接从后往前做,每次是一个长度 单增,但是权值确实单调的
这么做就好了 是\(O(n\sqrt n)\)的
F1. Korney Korneevich and XOR (easy version)
题意:一个数\(x\)能被选择,只有当原序列存在一个单调上升序列,使得这个单调上升序列的 \(异或和 = x\) , \(n <= 1e5,a_i <= 500\)
sol.这个是简单版本,不用脑子做的话,可以维护一个\(p[i]表示 当前考虑过的数,上升序列异或和为i的最小末尾是多少\),直接这么做就好了
(考场降智我吐了)
F2. Korney Korneevich and XOR (hard version)
题意:同上,\(n <= 1e6 , a_i <= 5000\)
sol. \(p[i]\)表示单调子序列异或和为i的最左的右端点是\(p[i]\)
直接转移就好了
G. Kuzya and Homework
题意:给你一个数字序列,以及符号序列,等长, 一段区间 如果合法,仅当 依次执行 $x (符号b_i) a_i $出来的每一个数,都是整数
sol.不妨枚举一下,最左端点在那里,然后确定一下 最右端点能到那里
那么考虑一下,如果全部出现的数都是一个质因数的次幂,就是一个很裸的问题了
\(*p^k\)看成 + k \(/p^k\)看成-k 并且记当前左端点为\(L\),那么就是找一个最长的子段,并且\(sum >= 0\)
那么考虑一下有多个质因数,发现,每一个质因数都是独立的。。。。
直接对于每一个质因数都处理一下,然后直接处理出最小得右端点即可
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000005
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
int n,a[MAXN];
char s[MAXN];
int vis[MAXN],p[MAXN],g[MAXN],len;
int used[MAXN];
ll ans;
vector<int>S[1000005];
priority_queue<pii, vector<pii>, greater<pii> > pque;
void init(){
for(int i = 2 ; i <= 1e6 ; i++){
if(!vis[i])len++ , p[len] = i , g[i] = i;
for(int j = 1 ; j <= len && p[j] * i <= 1e6 ; j++){
vis[i * p[j]] = 1;
g[i * p[j]] = p[j];
if(i % p[j] == 0){
break;
}
}
}
}
int main(){
init();
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i++)scanf("%d" , &a[i]);
scanf("%s" , s + 1);
for(int i = n ; i >= 1 ; i--){
int now = a[i] , js = 0 , dx;
while(now != 1){
js = 0 , dx = g[now];
while(now % dx == 0)now /= dx , js++;
if(s[i] == '/')while(js--)S[dx].push_back(i);
else while(js--)if(!S[dx].empty())S[dx].pop_back();
used[dx] = (S[dx].empty() ? -1 : S[dx].back());
if(used[dx] != -1) pque.push({used[dx], dx});
}
while(!pque.empty() && used[pque.top().second] != pque.top().first)pque.pop();
ans = ans + (pque.empty() ? n + 1 : pque.top().first) - i;
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号