rated

Educational Codeforces Round 81 (Rated for Div. 2)F(线段树)

心已入冬 提交于 2020-01-31 02:17:59
预处理把左集划分为大小为1~i-1时,把全部元素都移动到右集的代价,记作sum[i]。 然后枚举终态时左集的大小,更新把元素i 留在/移动到 左集的代价。 树状数组/线段树处理区间修改/区间查询 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define ll long long 5 const int N=2e5+7; 6 struct Tree{ 7 ll minn,lazy; 8 }tree[N<<2]; 9 ll sum[N];//前缀和 10 inline void build(int root,int l,int r){ 11 if(l==r){ 12 tree[root].minn=sum[l];//1~l的a[i]之和 13 tree[root].lazy=0; 14 return; 15 } 16 int mid=(l+r)>>1; 17 build((root<<1),l,mid); 18 build((root<<1|1),mid+1,r); 19 tree[root].minn=min(tree[(root<<1)].minn,tree[(root<<1|1)].minn);//up 20 return; 21 } 22 inline

Educational Codeforces Round 58 (Rated for Div. 2) D、F

会有一股神秘感。 提交于 2020-01-31 00:42:11
D 题意 一棵树。 求最长两点路径,并且路径上所有的 g c d > 1 gcd>1 g c d > 1 题解 可以考虑 d p dp d p ,因为 2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 ∗ 19 > 1 e 5 2*3*5*7*11*13*17*19>1e5 2 ∗ 3 ∗ 5 ∗ 7 ∗ 1 1 ∗ 1 3 ∗ 1 7 ∗ 1 9 > 1 e 5 所有每个点的值最大质因数不超过 8 8 8 个。算 10 10 1 0 个。 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] 表示从 i i i 开始到子树内的最大长度。 d p [ i ] [ j ] = d p [ s o n ] [ k ] + 1 dp[i][j]=dp[son][k]+1 d p [ i ] [ j ] = d p [ s o n ] [ k ] + 1 , k k k 是子结点值的因数中 v a l val v a l 的位置, v a l val v a l 是 i i i 的第 j j j 个质因数。 但显然这样是不行的,会因为存在两个不在一条链上(我们在 d p dp d p 过程人为规定了直链),所以对 i i i ,要处理出子结点 d p dp d p 值最大两个,相加再加上第 i i i 个结点更新答案。 一共就这两种情况。 #

Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String(序列自动机,贪心)

夙愿已清 提交于 2020-01-31 00:41:34
[Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String(序列自动机,贪心) C. Obtain The String time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given two strings ss and tt consisting of lowercase Latin letters. Also you have a string zz which is initially empty. You want string zz to be equal to string tt. You can perform the following operation to achieve this: append any subsequence of ss at the end of string zz. A subsequence is a sequence that can be derived from the given sequence by deleting zero or more

Educational Codeforces Round 81 (Rated for Div. 2)参加感悟

谁说胖子不能爱 提交于 2020-01-30 23:28:01
这次比赛又加了18分,加油,上(ao)紫(li)名(gei)! 虽然过程有点困难,让我很不痛快,中间小失误太多,竟然只排到了600+。 这次的第五题较水(相对而言),但是线段树太烦了,等我想好怎么做只剩20分钟了,20分钟写线段树? 其实主要是我自己对线段树不太熟悉,每次写都会遇到一些莫名其妙的问题,看来提前准备代码还是有些必要的。 比赛是这个: https://codeforces.com/contest/1295 我说过一句话“前三题太水就不讲了”,现在我改为“没有水题太坑了!” 第一题: 贪心如果棒子数量是奇数,那么输出一个 最高位是7,后面都是1 的数;否则输出一个全是1的数。 (然而这题我WA了一次) 代码: 1 #pragma GCC optimize(3) 2 #include<bits/stdc++.h> 3 #define ll long long 4 #define F first 5 #define S second 6 #define P pair 7 #define FOR(i,a,b) for(int i=a;i<=b;i++) 8 #define V vector 9 #define RE return 10 #define ALL(a) a.begin(),a.end() 11 #define MP make_pair 12 #define PB

Educational Codeforces Round 81 (Rated for Div. 2)

♀尐吖头ヾ 提交于 2020-01-30 21:25:51
A - Display The Number 思路:两个就可以组成1,那么四个就可以组成11,六个就可以组成最大111,三个就可以组成7,五个那么就是(3+2),组成71,所以当是偶数的话就组成全部是1就行,奇数就是最前面放7,后面全放1 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 #include<cmath> 7 using namespace std; 8 const int maxn=1000+10; 9 int main() 10 { 11 12 int a[6]={6,7,3,4,2}; 13 int n,nn; 14 scanf("%d",&n); 15 for(int i=0;i<n;i++) 16 { 17 scanf("%d",&nn); 18 if(nn%2==0) 19 { 20 int t=nn/2; 21 for(int j=0;j<t;j++) 22 printf("1"); 23 printf("\n"); 24 } else 25 { 26 printf("7"); 27 int tt=nn/2-1; 28 for(int jj=0;jj<tt;jj++) 29 printf("1");

Educational Codeforces Round 81 (Rated for Div. 2)

青春壹個敷衍的年華 提交于 2020-01-30 15:52:51
比赛传送门 A. Display The Number 题意: 给你 n ( 2 ⩽ n ⩽ 1 0 5 ) n(2\leqslant n\leqslant 10^{5}) n ( 2 ⩽ n ⩽ 1 0 5 ) 根火柴,问最大能拼成的数字。 思路: 由于其他数字的火柴都要 4 4 4 个以上,除了 1 1 1 需要 2 2 2 根, 7 7 7 需要 3 3 3 根,所以拼其他数字的话不如拼两个 1 1 1 ,而 3 3 3 根火柴的时候拼 1 1 1 不如拼 7 7 7 。 所以当 n n n 为偶数时,全部拼 1 1 1 ; 当 n n n 为奇数时,多出来 3 3 3 根拼 7 7 7 ,其他全部拼 1 1 1 。 代码: # include <bits/stdc++.h> using namespace std ; typedef long long ll ; const ll mod = 1000000007 ; int main ( ) { ll T ; cin >> T ; while ( T -- ) { ll n ; cin >> n ; if ( n % 2 == 0 ) { for ( int i = 1 ; i <= n / 2 ; i ++ ) putchar ( '1' ) ; putchar ( '\n' ) ; } else { putchar (

Educational Codeforces Round 81 (Rated for Div. 2) A-E

余生颓废 提交于 2020-01-30 14:50:52
Educational Codeforces Round 81 (Rated for Div. 2) A. Display The Number 给 \(n\) 个区域,问最大能构成的数字是多少? \(n\) 为奇数: \(7111...\) \(n\) 为偶数: \(1111...\) #include<bits/stdc++.h> #define mes(a, b) memset(a, b, sizeof a) using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn = 2e5+10; const ll mod = 1e9+7; int n, m, T; int main(){ scanf("%d", &T); while(T--){ scanf("%d", &n); if(n % 2 == 1 ) printf("7"); else printf("1"); int len = n/2-1; for(int i = 1; i <= len; i++) printf("1"); printf("\n"); } return 0; } B. Infinite Prefixes 给一个长度为 \(n\) 的字符串 \(s\) ,字符串 \(t\) 是字符串 \

Educational Codeforces Round 78 (Rated for Div. 2)——A、B题简要题解

烂漫一生 提交于 2020-01-30 06:09:25
题目传送门:https://codeforces.com/contest/1278/problem/A 题目传送门:https://codeforces.com/contest/1278/problem/B A. Shuffle Hashing(思维+暴力) 题目大意: 给你两个字符串,看第二个字符串中是否包含第一个字符串或者其相似串,相似串的定义是:两个字符串仅仅是字符的顺序不相同,其余均相同。 题目分析: 记录字符串1的长度为len1,字符串2的长度为len2。将字符串1先进行排序,然后将字符串2的1—len1位排序,与排序好的字符串1比较,如果两个字符串不同,就整体后移一位,将字符串2的2——len1+1位排序,然后再逐一比较,直至找出完全相同的为止。如果遍历到字符串2的最后一位时仍没有找到和排序好的字符串1完全相同的串,那就说明字符串2中不包含字符串1或其相似串。 AC代码: # include <iostream> # include <algorithm> # include <cmath> # include <cstring> # include <set> # include <string> # include <vector> # include <stack> # include <queue> # define PI 3.1415926 typedef

Educational Codeforces Round 81 (Rated for Div. 2)

戏子无情 提交于 2020-01-30 01:06:58
A. Display The Number 题解 题目要求数越大越好,并且有暗示答案会爆longlong, 于是我们就有如下策略: \(n\) 是偶数全填 \(1\) ,因为 \(1\) 只占两格,很值得 \(n\) 是奇数的话先狂填 \(1\) ,再还剩下 \(3\) 个的时候填一个 \(7\) 就好了 #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) typedef long long LL; typedef pair<int,int> PII; #define X first #define Y second inline int read() { int x=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} return x*f; } int w[10]={6,2,5,5,4,5

Manthan, Codefest 18 (rated, Div. 1 + Div. 2)

▼魔方 西西 提交于 2020-01-29 01:01:02
A - Packets 题意:二进制分解 void test_case() { int n; scanf("%d", &n); int x = 1; while((1 << x) <= n) ++x; printf("%d\n", x); } int a[200005]; void test_case() { int n, s; scanf("%d%d", &n, &s); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); sort(a + 1, a + 1 + n); int mid = (n + 1) / 2; if(a[mid] == s) { printf("0\n"); return; } else if(a[mid] > s) { ll sum = 0; for(int i = 1; i <= mid; ++i) { if(a[i] > s) sum += a[i] - s; } printf("%lld\n", sum); return; } else { ll sum = 0; for(int i = mid; i <= n; ++i) { if(a[i] < s) sum += s - a[i]; } printf("%lld\n", sum); return; } } int n; char s[2000005];