SRM 597DIV1
250:
首先先特判答案不存在的情况.
再设答案为k,则B[k+1,n]是A的一个子序列,所以,
做法1,枚举k检查子序列是否成立;
做法2,反过来想,从后往前看,最长的一个子序列对应了最小答案.
600:
问题可转化为,找一个凸多边形中是否存在三角形,且三角形与多边形不共顶点.
1暴力:
找出所有凸包中的点再找一个三角形,
找凸包中的所有点:枚举横坐标,再枚举每条边找到上端点和下端点. (O(size*N))
找三角形: 任取2个点,枚举下一个点,过程中必须保证每个点都不是凸包顶点.(O(size*N))
2特判:
如果凸包上点的个数size>=最大坐标差,可以确定其中必定有3不共线的点.
int N;
#define INF 200000
#define EPS 1e-10
int findcross(node a,node b,int x,bool flg)
{
if (a.x==b.x) return flg?max(a.y,b.y):min(a.y,b.y);
double k = (double)(a.y-b.y)/(double)(a.x-b.x);
double c = (double)a.y-k*(double)a.x;
double yy = k*(double)x+c;
int res;
if (flg) res = floor(yy+EPS);
else res = ceil(yy-EPS);
if (x==||x==-)
{
// printf("seg:(%d,%d) (%d,%d) cross at (%d ,%.2lf) , flg=%d res=%d\n",a.x,a.y,b.x,b.y,x,yy,flg,res);
}
return res;
}
int count(vector<int>X,vector<int>Y,vector<node> &q)
{
int cnt = ;
int l,r;
l = INF, r = -INF;
for (int i= ; i<N ; i++ ) l=min(l,X[i]),r=max(r,X[i]);
printf("l=%d r=%d\n",l,r);
for (int i=l ; i<=r ; i++ )
{
int yu,yl;
yu = -INF, yl = INF;
for (int j= ; j<N ; j++ )
{
node a = (node){X[j],Y[j]};
node b = (node){X[(j+)%N],Y[(j+)%N]};
if (min(a.x,b.x)<=i && i<=max(a.x,b.x))
{
yu = max(yu,findcross(a,b,i,));
yl = min(yl,findcross(a,b,i,));
}
}
// if (yu-yl>=0) printf("x=%d yl=%d yr=%d\n",i,yl,yu);
cnt += yu-yl+;
if (cnt>INF+N) return cnt;
for (int j=yl ; j<=yu ; j++ ) q.push_back((node){i,j});
}
return cnt;
}
double xmult(node p1,node p2 ,node p3)
{
// printf("area: (%d,%d) , (%d,%d) , (%d,%d) = ",p1.x,p1.y,p2.x,p2.y,p3.x,p3.y);
node a;
a.x = p1.x-p2.x;
a.y = p1.y-p2.y;
node b;
b.x = p3.x-p2.x;
b.y = p3.y-p2.y;
double res = (double)(a.x*b.y-b.x*a.y)/2.0;
// printf("%lf\n",res);
return fabs(res);
}
bool ok(node a,vector<int> X,vector<int> Y)
{
for (int i= ; i<N ; i++ ) if (a.x==X[i] && a.y==Y[i]) return false;
return true;
}
bool check(vector<int>X,vector<int>Y)
{
vector<node>q;
int cnt = count(X,Y,q);
printf("count=%d\n",cnt);
if (cnt>INF+N) return true;
// for (int i=0 ; i<q.size() ; i++ ) if (ok(q[i],X,Y))printf("(%d,%d)\n",q[i].x,q[i].y);
for (int i= ; i<q.size() ; i++ )
if (ok(q[i],X,Y))
{
for (int j=i+ ; j<q.size(); j++ )
if (ok(q[j],X,Y))
{
for (int k = j+ ; k<q.size() ; k++ )
if (ok(q[k],X,Y) && xmult(q[i],q[j],q[k])>EPS) return true;
return false;
}
}
return false;
}
string ConvexPolygonGame::winner(vector <int> X, vector <int> Y)
{
N = X.size();
if (check(X,Y)) return "Masha";
else return "Petya";
}
trick:
计算上端点和下端点需要用取整函数,由于精度误差要加EPS:
上端点 = floor(y+EPS);
下端点 = ceil(y-EPS);
900:
通过分析知道确定第一列和"接下来每列新出现的颜色序列"后,可以确定一种方案,同时颠倒第一列可以得到一种对称方案.
再推导出"新颜色序列"的性质:
长度为N的序列可以确定长度为N的方案;
相邻项不相邻;
问题转化为对于给定的R,G,B,求组成序列的方案数;
然后计算一系列组合数就可以统计答案(按最后一位的颜色分别计算).
一个技巧:
计算 0~n 的 阶乘的逆元,根据模数是prim的性质,利用费马小定理得到n!的逆元f[n],然后由于
f[n]*n! = f[n]*n*(n-1)! = 1 % MOD
所以f[n-1] = f[n]*n,递推即可.
#define MOD 1000000007
#define MAXN 1500001
typedef long long llong;
llong a[MAXN],inv[MAXN],p[MAXN];
llong Pow(llong num,llong times)
{
llong res=;
while (times)
{
if (times%2ll) res = res*num%MOD;
num = num*num%MOD;
times/=2ll;
}
return res;
}
llong c(int m,int n)
{
if (n>m||m<) return ;
return a[m]*inv[m-n]%MOD*inv[n]%MOD;
}
llong getans(int x,int y,int z)
{
llong res=;
for (int g=x- ; g<=x ; g++ )
{
for (int e= ; e<=g ; e++ )
{
if ((y-z+g-e)%) continue;
int oy = (y-z+g-e)/;
int oz = g-e-oy;
int ry = y-oy-e;
int rz = z-oz-e;
if (oy<||oz<||ry<||rz<||ry!=rz) continue;
res += c(g,e)*c(g-e,oy)%MOD*c(g+ry-,ry)%MOD*p[e]%MOD;
while(res>=MOD) res-=MOD;
}
}
// printf("res=%lld\n",res);
return res;
}
int LittleElephantAndBoard::getNumber(int M, int R, int G, int B)
{
for (int i= ; i<MAXN ; i++ ) a[i] = i==?:a[i-]*(llong)i%MOD;
for (int i= ; i<MAXN ; i++ ) p[i] = i==?:p[i-]*2ll%MOD;
inv[MAXN-] = Pow(a[MAXN-],MOD-);
for (int i=MAXN- ; i>= ; i-- ) inv[i] = inv[i+]*((llong)i+)%MOD;
llong res=;
res += getans(M-R,M-G,M-B)*2LL%MOD; res %= MOD;
res += getans(M-G,M-R,M-B)*2LL%MOD; res %= MOD;
res += getans(M-B,M-G,M-R)*2LL%MOD; res %= MOD;
return (int)res;
}
SRM 597DIV1的更多相关文章
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- SRM 513 2 1000CutTheNumbers(状态压缩)
SRM 513 2 1000CutTheNumbers Problem Statement Manao has a board filled with digits represented as St ...
- SRM 510 2 250TheAlmostLuckyNumbersDivTwo(数位dp)
SRM 510 2 250TheAlmostLuckyNumbersDivTwo Problem Statement John and Brus believe that the digits 4 a ...
- SRM 657 DIV2
-------一直想打SRM,但是感觉Topcoder用起来太麻烦了.题目还是英文,不过没什么事干还是来打一打好了.但是刚注册的号只能打DIV2,反正我这么弱也只适合DIV2了.. T1: 题目大意: ...
- SRM DIV1 500pt DP
SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...
- TC srm 673 300 div1
TC srm.673 300 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 Description 给你n(n<=50)匹马和n个人,一匹马和一个人能 ...
- SRM 584 第一次玩TopCoder。。。只水题一道。。。
第一次topcoder,以前老感觉没有资格去做tc,cf什么的,现在已经慢慢接触了. 感觉还可以,还是有让我们这些蒻菜安慰的水题. tc的确很好玩,用客户端比赛,还有各种规则,而且还是只编写一个类提交 ...
- SRM 616 ColorfulCoins
题意:给定一个从小到大的货币面值,每一个面额都是其前面面额的倍数(倍数大于等于2),每一种货币面值对应一种颜色,目前不清楚面值与颜色的对应关系.要求用最少的查询次数来确定面额与颜色的对应关系.(一次查 ...
- SRM144 - SRM 148(少144-DIV1-LV3,147-DIV2-LV3)
SRM 144 DIV 1 500pt tag:组合 题意:彩票中奖.给定n, m,从1-n中选择m个数组成数列a1, a2, a3...am.对于数列{am}分别满足以下条件的概率: (1)数列所有 ...
随机推荐
- 面试al tx
阿里: 一面: 1:写代码,给三个数组abc,每个数组若干数字,判断一个数字在不在三个数组中.用的map解决. 2:例举知道的排序,写出归并排序代码. 3:剩下的都是小题目了:包括三次握手,tc ...
- 如何使用深度学习破解验证码 keras 连续验证码
在实现网络爬虫的过程中,验证码的出现总是会阻碍爬虫的工作.本期介绍一种利用深度神经网络来实现的端到端的验证码识别方法.通过本方法,可以在不切割图片.不做模板匹配的情况下实现精度超过90%的识别结果. ...
- CentOS 设置mysql的远程访问
好记性不如烂笔头,记录一下. 安装了MySQL默认是拒绝远程连接的. 首先进入数据库,使用系统数据库mysql. mysql -u root -p mysql #回车,然后输入则使用了系统数据库 接着 ...
- JDBC编程之事务处理
JDBC中的事务处理指的是事务的一致性等问题,例如插入一条数据(id,name,password)到表中,另一条数据(address,id)到另一张表中,并且两条数据是相关联的,那么假设第一条数据插入 ...
- windows下配置caffe(环境:win7+vs2013+opencv3.0)
说明:大部分转载于initialneil的大作Caffe + vs2013 + OpenCV in Windows Tutorial (I) – Setup 准备工作: 1.下载CUDA7.5: ht ...
- (转)iOS 各种控件默认高度(图示)
1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图 用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明 ...
- LaTeX笔记
1.上下标: $x^n$, $x^{123}$, $x_n$, $x_{123}$, $C_n^m$, $C_{100}^{50}$ $x^n$, $x^{123}$, $x_n$, $x_{123} ...
- HDU 蟠桃记
蟠桃记 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissio ...
- C# Dictionary 应用
1.字典定义并添加数据 Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add(& ...
- 转载——CLR标量函数、表值函数和聚合函数(UDA)
本节主要介绍使用CLR创建标量函数,表值函数和聚合函数. 所谓标量函数指的就是此函数只返回一个值.表值函数返回值是一个表.聚合函数是在select语句中使用的,用来聚合一个结果集,类似于Sum()或是 ...