rated

Educational Codeforces Round 80 (Rated for Div. 2)-C. Two Arrays(组合数)

旧城冷巷雨未停 提交于 2020-01-28 07:05:18
组合数 第一步:把数组a和数组b合并排个序 第二步:用组合数中的隔板法得到C(2*m+n-1,n-1) 隔板法 条件一:N个相同元素 条件二:M个不同盒子 条件三:每个盒子至少一个元素 N个相同元素=2 m个位置 M不同盒子 = n个元素 也就是2 m个相同元素放入n个不同的盒子,但是盒子可以为空,所以增加n个为空的元素 不同盒子n 总相同元素2*m+n 可以得到 隔板数:n-1 空隙数:2 m+n-1; C(2 m+n-1,n-1) 费马小定理处理除数求模问题 # include <bits/stdc++.h> //typedef long long ll; //#define ull unsigned long long # define int long long # define F first # define S second # define endl "\n" //<<flush # define lowbit(x) (x&(-x)) # define ferma(a,b) pow(a,b-2) # define pb push_back # define mp make_pair # define all(x) x.begin(),x.end() # define memset(a,b) memset(a,b,sizeof(a)); # define IOS

Educational Codeforces Round 80 (Rated for Div. 2) D. Minimax Problem

与世无争的帅哥 提交于 2020-01-26 23:20:06
题目链接 题目意思: n*m的数组, 选取两行,两行合并成一行,取对应位置上的最大值,然后再取这行的最小值。使这个最小值最大,问这两行的行号。 每行的数字最多八个, 思路: 看到每行最多八个数, 就要想到二进制位优化。 首先要二分出来最大的数 x , 对于这个数,我们进行check。 然后对于每一行, 这一行中如果大于 x, 就设为1, 否则就设为 0, 这样每行就可以组成一个数 y 。vis[y] = i; 这个数最大就是256 , 就可以两重for循环,然后暴力判断这两行是不是满足条件。 判断的标准就是 if (vis[i] && vis[j] && (i|j) == (1 << m) - 1) 。 反思: 太巧妙了emmmm # include <bits/stdc++.h> using namespace std ; const int N = 3e5 + 100 ; int a [ N ] [ 10 ] , n , m , ans1 , ans2 ; int vis [ 500 ] ; bool fuck ( int x ) { int tmp ; memset ( vis , 0 , sizeof vis ) ; for ( int i = 1 ; i <= n ; ++ i ) { tmp = 0 ; for ( int j = 1 ; j <= m ; ++ j )

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组

吃可爱长大的小学妹 提交于 2020-01-20 05:35:57
E. DNA Evolution 题目连接: http://codeforces.com/contest/828/problem/E Description Everyone knows that DNA strands consist of nucleotides. There are four types of nucleotides: "A", "T", "G", "C". A DNA strand is a sequence of nucleotides. Scientists decided to track evolution of a rare species, which DNA strand was string s initially. Evolution of the species is described as a sequence of changes in the DNA. Every change is a change of some nucleotide, for example, the following change can happen in DNA strand "AAGC": the second nucleotide can change to "T" so that the resulting DNA strand is

Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块

只愿长相守 提交于 2020-01-20 01:28:49
Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 【Problem Description】 ​ 初始 \([1,500000]\) 都为0,后续有两种操作: ​ \(1\) 、将 \(a[x]\) 的值加上 \(y\) 。 ​ \(2\) 、求所有满足 \(i\ mod\ x=y\) 的 \(a[i]\) 的和。 【Solution】 ​ 具体做法就是,对于前 \(\sqrt{500000}=708\) 个数,定义 \(dp[j][k]\) 表示所有满足 \(i\ mod\ j=k\) 的 \(a[i]\) 的和。每次进行 \(1\) 操作的时候, \(O(\sqrt{500000})\) 预处理一下。查询时可 \(O(1)\) 查询。 ​ 对于大于 \(O(\sqrt{500000})\) 的数,可暴力求解: \(i\ mod\ x=y\Leftrightarrow i+x\cdot t=y\) 。所以只需要枚举 \(\frac{500000}{x}\) 次即可。而 \(x\) 不小于 \(\sqrt{500000})=708\) ,所以枚举次数不大于 \(708\) 次,所以总复杂度为 \(O(500000^{\frac{3}{2}})\) 。 【Code】 /* *

Educational Codeforces Round 59 (Rated for Div. 2) - D. Compression(思维)

主宰稳场 提交于 2020-01-19 22:47:26
Problem Educational Codeforces Round 59 (Rated for Div. 2) - D. Compression Time Limit: 2500 mSec Problem Description Input Output Print one number: maximum x such that an x-compression of the given matrix is possible. Sample Input 8 E7 E7 E7 00 00 E7 E7 E7 Sample Output 1 题解:首先可以知道对于一个符合条件的x,原矩阵要能够划分成 x * x的小矩阵,每个小矩阵中的元素是相同的,这是充要条件。接下来就是从大到小遍历n的约数判断是否满足该条件即可,如果每次都暴力判断那最差的情况下是O(约数个数 * n^2),约数的数量多一点就无法承受,主要到矩阵中的元素只可能是0和1,那么如果小矩阵中元素都相等,那么就都为0或者都为1,这时就可以通过小矩阵的元素和来判断是否元素都相同。想到这题目就结束了,二维前缀和预处理一下即可。 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define REP(i, n) for (int i = 1; i <= (n); i

Educational Codeforces Round 73 (Rated for Div. 2) D. Make The Fence Great Again

两盒软妹~` 提交于 2020-01-19 19:19:39
题目链接: http://codeforces.com/contest/1221/problem/D 题意:给一个序列,要求修改某些位置的数字,使得这个序列的相邻的数不相等,每次修改,只能使得某个数字加一,每次修改的代价为b【i】,求最小所需的代价。 解题思路:经过简单分析,我们可以知道,每个数字最多只需要修改两次,那么我们定义dp【i】【j】使得前j个数字相邻数字不等的最小代价,且最后一个数字修改了i次。那么答案即为min{dp【0】【n】,dp【1】【n】,dp【2】【n】}。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=3e5+5; const ll inf=1e18; ll dp[3][maxn]; int a[maxn],b[maxn]; int main(){ int q; scanf("%d",&q); while(q--){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&a[i],&b[i]); dp[0][i]=inf; dp[1][i]=inf; dp[2][i]=inf; } dp[0][0]=0; dp[1][0]=b[0]*1ll; dp[2][0]=b[0]*2;

Educational Codeforces Round 80 (Rated for Div. 2) E - Messenger Simulator(前缀和,树状数组)

五迷三道 提交于 2020-01-19 00:12:29
🍓 🍓 🍓 题意:一个1到n的全排列,m次操作,表示将ai移动到数组的第一个位置,求过程中每个数的最小位置和最大位置。 1,最小值为 1 / 初始位置 2,最大值出现在某次移动这个数之前 or 全部移动完成之后 3,因为数字不重复所以维护一个前缀和即可(记得空出来移动的位置) int n , m ; int c [ MAXN * 2 ] ; void update ( int x , int v ) { while ( x <= n + m ) { c [ x ] + = v ; x + = ( x & ( - x ) ) ; } } int que ( int x ) { int sum = 0 ; while ( x ) { sum + = c [ x ] ; x - = ( x & ( - x ) ) ; } return sum ; } signed main ( ) { cin >> n >> m ; vector < int > ans1 ( n + 1 ) , ans2 ( n + 1 ) , a ( m ) , pos ( n + 1 ) ; rpp ( i , n ) { ans1 [ i ] = ans2 [ i ] = i ; pos [ i ] = i + m ; update ( i + m , 1 ) ; } int l = m ; rep ( i ,

Educational Codeforces Round 80 (Rated for Div. 2)

会有一股神秘感。 提交于 2020-01-17 02:05:45
前言 D 题看起来就像是二分,但不知道怎么写 check ,而且二分不熟……每次写二分的时候都担惊受怕。干脆花了一晚上总结了一下各种二分的写法。以后写二分应该没有那么慌了。 二分的总结明天或后天再写吧。留个坑在这里。 限时只做了 A、B、C 三题,D 题后面补了。 E、F 题估计是不补了。以后有机会再康康吧。 比赛链接 题解 A. Deadline 题目大意 给定 \(n, d\) 判断是否存在一个整数 \(x\) 使得 \(x + \lceil\dfrac{d}{x + 1}\rceil \le n\) 分析 一波数学推导有: \[ x + \lceil\dfrac{d}{x + 1}\rceil = x + 1 + \lfloor\dfrac{d}{x + 1}\rfloor = \lfloor x + 1 +\dfrac{d}{x + 1}\rfloor \ge \lfloor2\sqrt{d}\rfloor \] 当且仅当 \((x + 1)^2 = d\) 也就是 \(x = \sqrt d - 1\) 的时候取得最小值。 直接算出 \(x\) 和 \(x + 1\) 时 \(x + \lceil\dfrac{d}{x + 1}\rceil\) 的值,代入与 \(n\) 判断即可。 代码 B. Yet Another Meme Problem 题目大意 给定 \(A, B

Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator

烈酒焚心 提交于 2020-01-17 00:10:55
E. Messenger Simulator 传送门 # include <bits/stdc++.h> # include <ext/pb_ds/assoc_container.hpp> using namespace std ; using namespace __gnu_pbds ; template < class T > using ordered_set = tree < T , null_type , less < T > , rb_tree_tag , tree_order_statistics_node_update > ; template < class T , class U > void ckmin ( T & a , U b ) { if ( a > b ) a = b ; } template < class T , class U > void ckmax ( T & a , U b ) { if ( a < b ) a = b ; } # define MP make_pair # define PB push_back # define LB lower_bound # define UB upper_bound # define fi first # define se second # define SZ(x) ((int) (x).size

Educational Codeforces Round 80 (Rated for Div. 2) D

僤鯓⒐⒋嵵緔 提交于 2020-01-16 08:27:58
D - Minimax Problem 传送门 # include <bits/stdc++.h> using namespace std ; constexpr int N = 300000 , M = 8 ; int n , m , x , y , tot ; int a [ N ] [ M ] , id [ 1 << M ] ; bool solve ( int v ) { std : : fill ( id , id + tot , - 1 ) ; for ( int i = 0 ; i < n ; ++ i ) { int s = 0 ; for ( int j = 0 ; j < m ; ++ j ) if ( a [ i ] [ j ] >= v ) s | = 1 << j ; id [ s ] = i ; } for ( int i = tot - 1 ; i >= 0 ; -- i ) for ( int j = 0 ; j < m ; ++ j ) if ( id [ i | 1 << j ] != - 1 ) id [ i ] = id [ i | 1 << j ] ; for ( int i = 0 ; i < tot ; ++ i ) { if ( id [ i ] != - 1 && id [ ( tot - 1 ) ^ i ] != - 1 ) {