6/7
这里简单写个题解,由于源代码无法查看,所以过了的题目的代码就不贴了。。。。
题A Problem A Daxia & Wzc's problem
题意:略
题解:这个东西显然推公式,最后推得的一个组合数学的公式与第一项和公差有关(具体公式隔太久不记得了,囧)。然后注意到这个m只有一千,虽然这个i很大,但是C(a,b)的运算次数显然是由a和b较小的一个决定,所以可以优化到算一个组合数的复杂度是min(m,i)。
题B Problem B Daxia & Yayamao's problem
题意:略
题解:这是一个斜率相关问题,比赛的时候没有做出来,然而赛后的也推了超久的(人太渣没办法),我是参考NOI2007的一道题:cash来学的里面的斜率相关问题。这里简单地解释一下:求的是y = a * x + b,(所有的(a,b)已知),变形一下得:b = -x * a + y,这是一条直线,(a,b)是已知的点,给定-x为斜率,求一个最大的斜率,画图可以发现所有有效的点形成一个“上凸包”,只有凸包上的点才是“候选点”,也就是给定一个斜率,我们可以找到最接近的斜率上面的一个点就是答案。这个过程有两种做法,第一种是二分,第二种是三分。二分是二分斜率,然后查找最接近的大于-x的斜率,三分是三分点,把每个点带入对于每个x一定是形成二次函数的样子。两者都可以,要说优劣,只能说三分比较好些,直接求一个凸包,然后三分一下就可以了,二分可能还有误差问题。
1 /*zhen hao*/
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include <string>
8 #include
9 #include <set>
10 #include
代码君(二分)
/*zhen hao*/
#include
#include
#include
#include
#include
#include <string>
#include
#include <set>
#include
代码君(三分)
题C Problem C Daxia & Suneast's problem
题意:略
题解:首先要知道这个SG的规律,白书原题,也可以自己暴力打表发现。然后就是用线段树维护每个点的SG值,区间查询,单点更新即可,实际上是一道水题╮(╯▽╰)╭。
题D Problem D Daxia like YuGiOh
题意:略
题解:没做出来,也没看题,感觉有点难就搁到了现在。。。。
题E Problem E Daxia like acute triangle
题意:略
题解:对于一个圆,先从0度到360度按照逆时针编个号,然后排完序之后对于每个点考虑半圆,从半圆上任意选两个点,方案数为C(n,2),然后一直做到最后一个点就是钝角和直角三角形的数量,最后用C(n,3)减去即可。是道水题,然后比赛的时候脑抽了,整个队在纠结题意。。。。。。
1 /*zhen hao*/
2 #include
3 #include
4 #include
5 using namespace std;
6
7 #define lson l, m, rt*2
8 #define rson m + 1, r, rt*2+1
9 #define xx first
10 #define yy second
11
12 typedef pair<int,int> pii;
13 typedef long long ll;
14 typedef unsigned long long ull;
15
16 char s[10];
17 int n, r;
18
19 int get_id(int x, int y) {
20 if (x == r || (x > 0 && y > 0)) return r - x;
21 else if (x <= 0 && y > 0) return r - x;
22 else if (x < 0 && y <= 0) return 2 * r + r + x;
23 else return 3 * r + x;
24 }
25
26 const int N = 4e4 + 10;
27
28 int id[N];
29
30 int main() {
31 // freopen("case.in", "r", stdin);
32 while (~scanf("%d%d", &n, &r)) {
33 for (int i = 0; i < n; i++) {
34 int x, y;
35 scanf("%d%s", &x, s);
36 if (x == r || x == -r) y = 0;
37 else if (s[1] == '>') y = 1;
38 else y = -1;
39 id[i] = get_id(x, y);
40 // cout << id[i] << endl;
41 }
42 sort(id, id + n);
43 for (int i = 0; i < n; i++) id[i + n] = id[i] + 4 * r;
44 ll res = 1LL * n * (n - 1) * (n - 2) / 6;
45 for (int i = 0; i < n; i++) {
46 int p = lower_bound(id, id + n * 2, id[i] + 2 * r) - id;
47 if (id[p] == id[i] + 2 * r) p++;
48 ll len = p - i - 1;
49 res -= len * (len - 1) / 2;
50 }
51 cout << res << endl;
52 }
53 return 0;
54 }
代码君
题F Problem F Daxia like uber
题意:略
题解:好像是最短路dij+枚举,队友秒的。
题G Problem G Daxia want to buy house
题意:略
题解:模拟题,读懂题意之后好像要利用指数的特点来优化误差,我语文不行,应该做不出这道题,又是队友秒了。