CCPC for UESTC

1001. Vertex Cover

题意:有一个贪心算法求最小顶点覆盖是每次选出度数最大的点然后删去,输出一个图使得这个算法跑出来的答案是你给出的答案的三倍及以上。

题解:

构造一个二分图,设左边有 nn 个点,标号是 1 ~ n1 n。对于每个 i \in [1, n]i∈[1,n],都在右边新建 \lfloor \frac{n}{i} \rfloor??i??n??? 个点,每个点都选择左边的 ii个点连 1 条边,使得左边每个点最多只被多加了一条边。这样构造完成后可以发现贪心的做法会把右边那 n \log nnlogn 个点当做一个覆盖集,实际上只需左边的 nn 个点即可。对于题目的要求可以设 n = 80n=80

1002. Party

题意:给出 20 * 20 的二分图,点有标号。10 组询问,每组询问一个 gg,表示只考虑标号是 gg 的倍数的子图,求非空顶点的子集 VV 的数量,使得存在一个匹配盖住 VV.

题解:每个询问分开解决。假设 VV 是由左边的 X + YX+Y 组成的,其中 XX 在左侧,YY 在右侧。使用广义的 Hall 引理,可以证明只要 XX 可以被某个匹配盖住,YY 也可以被某个匹配盖住(不需要是同一个匹配),那么 VV 也可以被某个匹配盖住。

所以,只需要 2^{20}2?20?? 枚举 XX 的顶点自己,跑匹配就行了。聪明一点的话可以 dfs 枚举,维护增广路。

1003. Friend-Graph

题意:判定一个无向图是否有三个点的团或者三个点的独立集。

题解:Ramsey theorem,n >= 6 直接输出 Bad 否则暴力。

1004. A Secret

题意:给定两个串,求其中一个串 ss 的每个后缀在另一个串 tt 中出现的次数。

题解:把两个串都 reverse 一下,给 tt 做个 KMP 之后让 ss 在 KMP 出来的结果上跑一边就好了。

1005. CaoHaha‘s staff

题意:在笛卡尔坐标系下,画一个面积至少为 nn 的简单多边形,每次只能画一条边或者一个格子的对角线,问至少要画几条。

题解:如果一个斜着的矩形长宽分别是 a, ba,b,那么它的面积是 2ab2ab。最优解肯定是离 \sqrt{\frac{n}{2}}√??2??n????? 很近的位置。想想 n=5n=5 时答案为什么是 77 然后在那个小范围内枚举一下就好了。

1006. Subsequence Count

题意:给出 01 串,要么询问某个区间内不同的 01 子序列数量,要么把区间翻转。

题解:先考虑怎么算 s_1, s_2, \ldots, s_ns?1??,s?2??,…,s?n?? 的答案。设 dp(i, 0/1)dp(i,0/1) 表示考虑到 s_is?i??,以 0/10/1 结尾的串的数量。那么 dp(i, 0) =dp(i - 1, 0) + dp(i - 1, 1) + 1dp(i,0)=dp(i?1,0)+dp(i?1,1)+111 也同理。
那么假设在某个区间之前,dp(i, 0/1) = (x, y)dp(i,0/1)=(x,y) 的话,过了这段区间,就会变成 (ax + by + c, dx + ey + f)(ax+by+c,dx+ey+f) 的形式,只要用线段树维护这个线性变化就好了。

1007. Palindrome Function

题意:...

枚举ii之后就是计算区间[L, R][L,R]内在base ii下回文数的个数,直接dp就好了。

1008. The Karting

题意:线段上有 nn 个点,你要选 mm 个点组成一个环,代价是相邻两个点的距离 + 转弯的惩罚,问最大的代价。

题解:从左到右考虑 dp(i,chosen, parts)dp(i,chosen,parts) 表示考虑到 ii,已经选了 chosenchosen 个点,左边有 partsparts 个连通块(肯定是若干条链)。然后考虑如果选点 ii,因为是个环,所以肯定 ii 肯定是一进一处。讨论一下进出的方向:

(1) 如果是从左边进来,又从左边出去。那么对答案的贡献就是 +2x[i] + turn+2x[i]+turn. 同时,也会连通块 -1.

(2) 对称地,如果从右边进来出去,那么贡献是 -2x[i] + turn?2x[i]+turn. 同时多一个连通块(它自己)。

(3) 如果左进右出(或者反过来),那么没有任何影响。

注意最后一下要把环闭合,有个特别的转移。

1009. The Designer

题意:(看图)

题解:用 http://en.wikipedia.org/wiki/Descartes%27_theorem .

看上去需要解二次方程,实际上这个二次方程的两个根就是左右两个圆的大小。那么我们用 vieta 定理,就能得到连续 3 个圆的一个线性关系,用这个线性关系递推就好。

1010. Graph Of Zhuper

题意:...

题解:令f(n)f(n)表示nn个点带标号的连通图数目g(n)g(n)nn个点带标号的无向图数目,那么g(n)=2^{n(n-1)/2}g(n)=2?n(n?1)/2??f(n)=g(n)-\sum\limits_{k=1}^{n-1}\binom{n-1}{k-1}f(k)g(n-k)f(n)=g(n)??k=1?∑?n?1??(?k?1?n?1??)f(k)g(n?k)。分治FFT就可以算出每个f(n)f(n)

h_d(n)h?d??(n)是带标号nn点简单无向图且每个连通块大小是nn倍数的方案数,那么显然答案就是\sum\limits_{d|n}\phi(d)h_d(n)?d∣n?∑???(d)h?d??(n)

构造多项式F(x)=\sum\limits_{i=1}^{n/d}f(id)x^iF(x)=?i=1?∑?n/d??f(id)x?i??,那么G(x)=\sum\limits_{i=0}^{\infty}\frac{F^i(x)}{i!}=e^{F(x)}G(x)=?i=0?∑?∞???i!??F?i??(x)??=e?F(x)??x^{n/d}x?n/d??的系数就是h_d(n)h?d??(n)。搞个多项式expexp就好了。

1011. Convolution Layer

题意:...

题解:枚举了最外层的三个 \sum∑ 之后,可以发现里面是一个经典的问题:给一个大矩阵和小矩阵,求小矩阵能放的每个位置和对应位置叠上的大矩阵的一个函数。做法的话因为字符集只有 2 所以首选 bitset,把 -1 看作 1,1看作 0。先搞出大矩阵每一行的 bitset,和小矩阵串起来的 bitset,因为只有 121 位所以可以直接用 __int128。然后首先枚举列,把每行的对应位置上 11 个 bit 扣出来,挨个拼成一串再和小矩阵的 bitset xor 就好,复杂度就是那个七重循环再除个压位的常数

时间: 2024-10-10 01:07:53

CCPC for UESTC的相关文章

2015 CCPC D- Pick The Sticks(UESTC 1218) (01背包变形)

http://acm.uestc.edu.cn/#/problem/show/1218 既然二维dp表示不了,就加一维表示是否在边界放置,放置一个,两个.有一个trick就是如果只放一根,那么多长都可以. wa了好多次(囧) 开始因为l[i]/2会出现小数,没注意,把所有的长度都x2就可以解决. 又wa了n次因为没注意j-l[i]时没加判断,为什么不是RE呢!不开心... /********************************************* Memory: 1140 KB

UESTC 电子科大专题训练 数据结构 D

UESTC 1584 题意:平面坐标上有n个怪物,每个怪物有一个rank值,代表x坐标和y坐标都不大于它本身的怪物数(不包括本身) 思路:对x y坐标从小到大排序,x优先排序,用数状数组计算y坐标小于它的数量 AC代码: #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #i

2015南阳CCPC L - Huatuo's Medicine 水题

L - Huatuo's Medicine Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Huatuo was a famous doctor. He use identical bottles to carry the medicine. There are different types of medicine. Huatuo put medicines into the bottles and chain these b

UESTC 31 饭卡(Card) --背包问题

背包问题. 思路:如果m<5,此时也不能消费,所以此时答案为m m>=5: 求出背包容量为m-5,买前n-1样便宜的菜(排个序)的最大价值(即最大消费,即消费完后剩余值最接近5)最后减去最大的那个菜的价格,就得到最小的余额. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using n

hdu6153 A Secret CCPC网络赛 51nod 1277 KMP

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意: 给出两个字符串S1,S2,求S2的所有后缀在S1中出现的次数与其长度的乘积之和. 思路: CCPC网络赛题解: https://post.icpc-camp.org/d/714-ccpc-2017 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277   是一样的 将s1,s2翻转,转化为求前缀在s1中出

UESTC 电子科大专题训练 数据结构 A

UESTC 1591 题意:求区间极值之差 思路:线段树裸题,不带更新 ACA代码: #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "ma

2017 UESTC Training for Data Structures

2017 UESTC Training for Data Structures A    水,找区间极差,RMQ怼上去. #include<bits/stdc++.h> 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&

UESTC - 878 温泉旅店 二维费用背包问题

http://acm.uestc.edu.cn/#/problem/show/878 设dp[i][j][k]表示在前i个数中,第一个得到的异或值是j,第二个人得到的异或值是k的方案数有多少种. 因为异或后的大小不确定,所以不能压缩数组,但是也不大..可以过. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm>

ACM:UESTC - 649 括号配对问题 - stack

  UESTC - 649  括号配对问题 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Description 大家都知道算术表达式中,括号必须配对,现在任意给出一个算术表达式,判断其括号是否配对.如果配对,输出Yes,否则输出No. Input 含多组测试数据,输入首先是一个整数T表示测试数据组数(0<T≤300).随后有T行测试数据,长度不超过1000个字符,字符串间不含空格. Out