XJOI网上同步训练DAY1 T3】的更多相关文章

思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q的数量也确定了.所以序列长度也确定了,设m为序列长度. 而且对于每个a[i]都代表了一个固定数量的p和q和长度. 因此,长度大于m/2的前缀,我们可以用总的p和总的q减去它,转换成小于等于m/2长度的前缀后缀. 这样我们可以设计DP为f[i][j][k],代表从左往右i个中有j个p,从右往左i个有k…
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> #include<map> #define ll long long typedef std::pair<ll,int> info; std::map<info,in…
思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html 一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决问题了. 实际情况:10分,wtf 我的程序: #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<iostream> ; ][],n,m,K…
思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nlogn) 满分程序: #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #define ll long long ; i…
思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就把u到v的路径全部染色成0 最后只要询问缩点完的S到缩点完的T的路径上有多少是1就是答案了,最后复杂度:O(nlogn) 至于为什么这么做:因为我们要找必经过的边,这不就是桥吗,那我们先预处理出原来图的桥,然后把图转变成树,之后对于官道来说,它只要是连接了两个在同一个联通块里的点,就表明这段路绝对不…
思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> int n,m; ][]; ][]; int read(){ ,f=;char ch=getchar(); ;ch=getchar();} +ch-';ch=getchar();} return t*f;…
思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n个点拆成 我们枚举数字的最小公倍数 个,因为如果一个数模某个数等于0,那么模它的因数也一定是0,因此我们的思路就是拆点最短路. #include<cstdio> #include<cmath> #include<cstring> #include<algorithm&…
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> ],c[],p[],val[],f[][]; int read(){ ,f=;char ch=g…
考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分询问,复杂度是O(nlogn),又get一种新的树链剖分打法 #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> stru…
思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的s和r相等,然后我们就选这个位置的bi,由于bi会改变当前位置,因此当前位置的vi我们就能吃到了.所以,每个位置的vi我们都能拿到,所以答案就是Σvi,然后只要模拟过去就可以了.. 我真是太弱鸡了..还有这个算法的复杂度是O(N^1.5),我一直以为是O(N^2).. #include<cstdio…