首页 > 2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化

2016多校赛2 A 数学推公式 E 极角排序,组合数(待补) L dp+bitset优化

2016 Multi-University Training Contest 2

A - Acperience

题意:给出w[],求S((w[i]-aB[i])^2)的最小值(B[i]为1或-1)。

tags:一看到就搞了个三分上去,估计是精度问题,一直挖,23333。。

就是把这个公式推下去,最后化简为 ans=S(w[i]^2) - ((S(abs(w[i])))^2)/n 。

#include
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 100005;ll w[N], s1, s2, n;
int main()
{int T;  scanf("%d", &T);while(T--){s1=s2=0;scanf("%lld", &n);rep(i,1,n) {scanf("%lld", &w[i]);s1+= w[i]*w[i],  s2+= abs(w[i]);    // 绝对值。。在这挖了几发
        }s1=n*s1-s2*s2;printf("%lld/%lld
", s1/__gcd(s1,n), n/__gcd(s1,n));}return 0;
}
View Code

 E - Eureka

题意: 给出 n个点,多个在同一条直线上的点可以构成一个集合,问有多少个集合。

tags:

 

I   水题

K  水题

L - La Vie en rose

题意:两个字符串A、B。 B可以通过交换相邻位置的字符(每次每个位置只能交换一下)生成其它多个字符串。问A的每个位置(a[i]到a[i+lenB-1])是否可以匹配B或由B生成的字符串。

tags:  好题      虽然题意有点迷,但确实好题,可以练练bitset压位。可以参考大佬博客

dp[i][j][k]表示A匹配到第 i个位置,B匹配到第 j个位置时的情况(k为0表示B第 j个位置不交换,为1表示第 j个位置和 j-1交换,为2表示和 j+1交换)。 然后dp转移:

dp[i][j][0] = (dp[i-1][j-1][0] or dp[i-1][j-1][1]) and (A[i]==B[j])
dp[i][j][1] = dp[i-1][j-1][2] and (A[i]==B[j-1])
dp[i][j][2] = (dp[i-1][j-1][0] or dp[i-1][j-1][1] ) and (A[i]==B[j+1])

直接写出循环就是:

for(int j=1; j<=lenB; ++j)for(int i=1; i<=lenA; ++i) {dp[i][j][k]= }

但这样O(N*M)肯定超时,这里就是关键,又一次体会到了二进制的神奇。把dp[][][]的第一位压入bitset,第二层for循环就可以利用bitset的位运算操作完成,实现常数优化,即O(N*M/w)卡过。  另外dp[][][]第二维因为每次只要用到上一次的数据,所以可以滚动数组优化内存。

#include
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 100005, M=5005;int la, lb;
char A[N], B[N];
bitset dp[2][3], bs[26];
int main()
{int T;  scanf("%d", &T);while(T--) {scanf("%d %d %s %s", &la, &lb, A+1, B+1);rep(i,0,25) bs[i].reset();rep(i,1,la) bs[A[i]-'a'][i]=1;int now=0, las;dp[0][0]=bs[B[1]-'a'];      if(lb>1) dp[0][2]=bs[B[2]-'a'];rep(j,2,lb) {las=now, now^=1;dp[now][0] = ((dp[las][0] | dp[las][1])<<1) & bs[B[j]-'a'];   // 因为求出的是第i-1位的,<<1转到第i位。&bs[]是检测A[]==B[]dp[now][1] = (dp[las][2]<<1) & bs[B[j-1]-'a'];if(j2] = ((dp[las][0] | dp[las][1])<<1) & bs[B[j+1]-'a'];}rep(i,1,la) {int ii=i+lb-1;if(ii<=la && (dp[now][0][ii] || dp[now][1][ii])) putchar('1');else putchar('0');} puts("");}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/sbfhy/p/6740006.html

更多相关:

  • 题目:正则表达式匹配 请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。 示例 1:...

  • 题意:就是在n*m的格子中放“炮”(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状压,但数据范围有100),这篇博客些的很好(传送门),我们定义dp[i][j][k]代表前i行我们有j列式有2个棋子,有k列是一个棋子,那么我们空的列的个数...

  • 虽然也是一道dp的入门题,但就是想不到,或者说不会实现。dp还是要多做题。 链接:https://www.luogu.org/problemnew/show/P1164   我们可以设dp[i][j]表示以考虑完第i件,恰好消费j元的方案数。那么dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]],也就是讨论第i件点...

  • bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色。状态转移方程: 1.(f[l][r]=min(f[l][i],f[i+1][r]) (l<=i

  • 题目背景 博弈正在机房颓一个叫做《模拟城市2.0》的游戏。 2048年,经过不懈努力,博弈终于被组织委以重任,成为D市市委书记!他勤学好问,励精图治,很快把D市建设成富强民主文明和谐的美好城市。为了进一步深化发展,他决定在海边建立一个经济开发区。 题目描述 已知开发区的建筑地块是一个n×nn imes nn×n的矩形,而开发...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...