【HDOJ】3828 A + B problem】的更多相关文章

显然需要贪心,重叠越长越好,这样最终的串长尽可能短.需要注意的是,不要考虑中间结果,显然是个状态dp.先做预处理去重,然后求任意一对串的公共长度. /* 3828 */ #include <iostream> #include <sstream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #includ…
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到boundry,使得boundry * n_edge - sum_edge <= k/b, 或者建立s->t,然后不断extend s->t. /* 4729 */ #include <iostream> #include <sstream> #include <…
树状数组.Easy. /* 4267 */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio&g…
经典DP,写的可能麻烦了一些. #include <stdio.h> #define false 0 #define true 1 ]; ]; ]; void DFS(int, int, int); int main() { int i, j, k; int n; is_prime[] = false; is_prime[] = true; ; i<=; i++) { k = ; ; j*j<=i; j++) { ) { k = ; break; } } if (k) { is_p…
题意很简单就是给你一个N和M,让你求在1-N的那些个子序列的值等于M 首先暴力法不解释,简单超时 再仔细想一想可以想到因为1-N是一个等差数列,可以运用我们曾经学过的只是来解决 假设开始的位置为s,结束的位置为t,那么一定要满足这个等式 (s+t)(t-s+1)=2*m 又因为S和T都是整数,所以左边的括号中每一项都是等式 所以s+t和t-s+1一定是2*m的因式 所以分解因式并带入就可以求出s和t 假设 s+t=a t-s+1=b a*b=2*m 解得 s=(a-b+1)/2 t=(a+b-1…
[BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给每个数记录一下和它相等的上一个位置和下一个位置,那么这两个位置的限定范围就在区间以外,于是变成了一个\(4\)维数点问题,直接\(KD-Tree\)了. #include<iostream> #include<cstdio> #include<algorithm> usin…
[CF903G]Yet Another Maxflow Problem 题意:一张图分为两部分,左边有n个点A,右边有m个点B,所有Ai->Ai+1有边,所有Bi->Bi+1有边,某些Ai->Bj有边,每条边都有一定的容量. 先要求你支持两种操作: 1.修改某条Ai->Ai+1的边的容量2.询问从A1到Bm的最大流 n,m<=100000,流量<=10^9 题解:很有思维含量的题. 首先,我们把求最大流变成求最小割.容易发现,我们最多只会割一条Ai->Ai+1的边…
[BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下一个位置\(nxt\) 则对于一个询问\([l,r]\) 一个位置\(i\)当且仅当\(pre_i<l\)且\(nxt_i>r\) 我们可以将一个位置看作一个点坐标为\((pre_i,nxt_i)\) 要求横坐标\(<l\)且纵坐标\(>r\) 这个可以用简单\(kdTree\) 也可…
[BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. Input 第一行为两个整数N,M.M是询问数,N是序列的长度(N<=100000,M<=200000) 第二行为N个整数,描述这个序列{ai},其中所有1<=ai<=N 再下面M行,每…
[题解]CF986E Prince's Problem(树上差分+数论性质) 题目大意: 给定你一棵树,有点权\(val_i\le 10^7\).现在有\(m\)组询问给定参数\(x,y,w\)问你对于\((x->y)\)的路径经过的点集\(P\),问你这个东西: \[ \prod_{u \in P} {\mathrm{gcd}(w,val_u)} \mod 1000000007 \] 考虑这样一种做法: 把询问差分成 \[ ans(1,x) \times ans(1,y) \times \ma…
题目链接: http://codeforces.com/contest/706/problem/C 题目大意: n(2 ≤ n ≤ 100 000)个字符串(长度不超过100000),翻转费用为Ci(<=109),求所有字符串从上到下符合字典序从小到大的最小费用.无解输出-1. 题目思路: [动态规划] 每个字符串有2种状态,翻转或者不翻转,每次只与上一个字符串是否翻转有关,可以用DP. 费用很大,要用long long. 无解的时候我直接break了WA了好久. // //by coolxxx…
[题意]给定n道题,每月末发放工资m,要求从1解到n,每道题需要在当月初付费ai,下月初付费bi,多道题可以安排在同月,求最少月数. [算法]DP [题解]参考自:[bzoj1700]Problem Solving 解题 dp by GXZlegend 因为当月的选择同时关系着当月和下月,贪心是错误的,有如下反例: 50 5 40 10 10 40 10 5 10 3 10 2 因此考虑DP,令f[i][j]表示解决1~i题,最后一月解决j题的最小月数.(只保证满足当月开销,也就是下月开销之后再…
LCA+RMQ.挺不错的一道题目. 思路是如何通过LCA维护费用.当加入新的点u是,费用增量为dis[u]-dis[lca(u, lower_u)] - dis[lca(u, greater_u)] + dis[lca(lower_u, greater_u)].若beg[u]大于当前最大值或小于最小值,lower_u=min of current, greater_u = max of current. /* 5296 */ #include <iostream> #include <s…
稳定婚姻问题,Gale-Shapley算法可解. /* 1914 */ #include <iostream> #include <sstream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include…
快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. /* 3509 */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector&g…
数学题,证明AB和CD.只需证明C.D在AB直线两侧,并且A.B在CD直线两侧.公式为:(ABxAC)*(ABxAD)<= 0 and(CDxCA)*(CDxCB)<= 0 #include <stdio.h> #define MAXNUM 105 typedef struct { double x1, y1; double x2, y2; } line_st; line_st lines[MAXNUM]; int cal(int i, int j) { double ab_x,…
栈和队列训练题目. #include <stdio.h> #include <string.h> #define MAXNUM 1005 char in[MAXNUM]; char out[MAXNUM]; char stack[MAXNUM]; char order[MAXNUM]; // 1:in, 0:out int main() { int n; int i, j, k, tmp, flg; int top; while (scanf("%d %s %s"…
网络流基础题目,Edmonds_Karp可解. /* 3549 */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include…
HASH+暴力. /* 4403 */ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <map> using namespace std; #define MAXN 55 map<]; char s[MAXN]; int get(int b, int e) { ; for (int i=b; i<e; ++i)…
水题. #include <cstdio> #include <cstring> #include <cstdlib> int abs(int x) { ? -x:x; } int main() { int t, n; int cur, past; __int64 ans; bool flag; #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif scanf(&q…
KD-Tree(乱搞) Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]),其中 i 满足$ ( pre[i]<ql \ and \ nex[i]>qr\ and\ i \in [ql,qr] ) $ 然后我们以(i,pre[i],nex[i])为坐标……将所有点抽象到三维空间中,每次查询就相当于是一次区域求最值! 这题我的感受: 因为前面做了两道区域求和的……然后思路…
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l,r)=\sum_{i=l}^{r}\sum_{j=i+1}^{r}a[i]*a[j]$ 那么就有 $w(l,r+1)=w(l,r)+a[j]*\sum\limits_{i=l}^{r}a[i]$ 所以:w[i][j]明显满足 关于区间包含的单调性 然后我们大胆猜想,小(bu)心(yong)证明,w[…
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define rep(i,n) for(int i=0;i<n;++i) #define F(i,j,n) for(int i=j;i<=n;++i) #define D(i,j…
in script,i use HttpWebRequest to get service from network.but it comes a mysterious problem. the source code: string url = "http://apis.baidu.com/apistore/vop/baiduvopjson"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); print…
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define rep(i,n) for(int i=0;i<n;++i) #define…
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[k+1][j-(k-i+1)]+w(i,k,j)} (这个地方一开始写错了……) 即,将一棵树从k处断开成(i,k)和(k+1,i+j-1)两棵树,再加上将两棵树连起来的两条树枝的长度w(i,k,j) 其中,$ w(i,k,j)=x[k+1]-x[i]+y[k]-y[i+j-1] $ 那么根据四边形…
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明显可以减小极差 然后……直接四边形不等式上吧……这应该不用证明了吧? MLE了一次:这次的w函数不能再开数组去存了……会爆的,直接算就行了= =反正是知道下标直接就能乘出来. 数据比较弱,我没开long long保存中间结果居然也没爆……(只保证最后结果不会爆int,没说DP过程中不会……) //H…
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……sigh) //HDOJ 3415 #include<queue> #include<cmath> #include<vector> #include<cstdio> #include<cstring> #include<cstdlib>…
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知道序列(i,j)是符合标准的,那么如果第j+1个元素不比(i,j)最大值大也不比最小值小,那么(i,j+1)也是合法的 2.如果(i,j)不合法的原因是差值比要求小,那在(i,j)范围内的改动是无效的,需要加入j+1元素充当最大值或者最小值才可能获得合法的序列 3.假设序列(i,j)的差值比要求大,…
DP/单调队列优化 题解:http://www.cnblogs.com/jianglangcaijin/p/3799736.html 令f[i][j]表示第 i 天结束后,手里剩下 j 股的最大利润,则有: \[  f[i][j]= \begin{cases} f[i-1][j] &   &{(不买不卖)}\\ f[i-w-1][k]-ap[i]*(j-k)&   &{ j-as[i] \leq k \leq j-1 (买入)}\\ f[i-w-1][k]+bp[i]*(k…