BZOJ 题目整理

现在要写一些题目。
现在已经做了:

157题

「BZOJ1529」「POI2005」Piggy Banks 并查集
「BZOJ3527」「ZJOI2014」力 FFT
「BZOJ1924」「SDOI2010」所驼门王的宝藏 奇妙的建图 强连通分量缩点+最长路dp
「BZOJ3205」思博题
「BZOJ2150」部落战争 建图+最小路径覆盖(不知道什么鬼数据,原图不拆点直接二分图就A了)
「BZOJ1050」「HAOI2006」旅行 求一条使得最大边比最小边最小的路径,枚举最小边,并查集生成树(LCT可以做到 mlog2 不过谁想写啊)
「BZOJ3884」欧拉定理
「BZOJ3668」「NOI2014」起床困难综合症 思博贪心
「BZOJ4196」「NOI2015」软件包管理器 树链剖分,快读导致1A失败,mdzz
「BZOJ3670」「NOI2014」动物园 奇妙的kmp递推
「BZOJ1012」「JSOI2008」弱智线段树
「BZOJ4872」「SHOI2017」分手是祝愿 先观察发现必须从大到小按,那么我们对于还要按 x 次,就有一个概率,然后求个逆元,直接推了
「BZOJ2427」「HAOI2010」5分钟写了一个treedp,然后发现不连通,我蠢死好了,先缩点,然后建一个超级源点,给入度为0的分量连边,这样做依赖dp就好了,这个连接树的方法很好玩,然后就是Treedp都是 O(nm2) 的,我们做一个dfs序,然后求出每个节点子树的 size[x] ,就可以 O(nm) 递推了
「BZOJ1226」「SDOI2009」状态压缩dp,不太好写
「BZOJ2216」「POI2011」对 x 求导,发现斜率增长率递减,所以说当一个点距离远还比距离近的节点小,我们就可以直接让他出队,二分一下原数列,然后对于每个点做一个可行答案区间,然后就可以在 O(nlg) 的时间更新答案,注意到方程与后面的值有关,我们可以反向再做一遍。
「BZOJ3437」第一次写斜率优化,有点恶心,这个式子好像已经到了人尽皆知我不会的地步了。。。我们做出两个sum,保证更新的时候查询距离乘积和的时候是 O(1) 的,然后发现这个式子可以斜率优化,答案在一个上凸壳上,再做两道再说吧,我太弱了。
「BZOJ2749」「HAOI2012」外星人 给了一个式子 ϕx(N)=1 ,好吧我看不懂题目。。其实是求phi迭代计算等于1的值。只有 ϕ(2)=1

ϕ(i=1mpqii)=i=1mpqiii=1m(pi1pi)=i=1m(pi1)pqi1i

好吧这个式子题目给了。。然后我们观察一下,每次做phi操作,使得 pi 的次数-1,然后添加了一个 pi1 ,在观察一下,我们每次操作还可以消去一个2,把它变成1,而 pi1 一定是一个偶数,一定给这个式子添加了一个2,于是问题转化为了求给定数字可以转化为多少个2,我们要消掉它。然后再观察一下,这个关于每个数可以消成的2的个数的函数满足: f[xy]=f[x]+f[y] ,于是就可以线性筛了。
「BZOJ1170」「APIO2009」思博tarjan+dp,但是dp死活过不了,改了个spfa。。。
「BZOJ5039」「JSOI2014」思博线段树。
「BZOJ1015」「JSOI2008」删点维护连通性,离线一下,反向并查集,挺好玩的。
「BZOJ2763」「JLOI2011」思博spfa。(分层图
「BZOJ1570」「JSOI2008」Blue Mary的旅行 暴力枚举答案,每次添加新的层次图,直到最大流==T。(不加当前弧16秒???
「BZOJ1562」「NOI2009」构造二分图, 然后我不会了,然后我dfs,然后我TLE 好吧,我们为了求字典序最小的最大匹配,可以反向求匹配,因为匈牙利算法是后来的边更新前面的,然后一遍二分图最大匹配,把方案输出来就好了。
「BZOJ1257」「CQOI2007」答案是sqrt区间不变的,我好蠢啊。
「BZOJ1103」「POI2007」大都市meg 我直接树链剖分了, dfs序啊啊啊啊,慢的要死。
「BZOJ2190」「SDOI2008」仪仗队,观察性质,直接线性筛了。
「BZOJ1067」「SCOI2007」有毒,线段树分类讨论。
「BZOJ2599」「IOI2011」Race 点分治,我咋老写错这个啊。。。
「BZOJ3658」Jabberwocky 离散化一下,开一个链表维护一个点两边能达到的点,每次树状数组维护删改操作。
「BZOJ1093」「ZJOI2007」最大半连通子图 tarjan+dp最长路
「BZOJ1412」「ZJOI2009」狼与羊的故事 建图+最小割。
「BZOJ1179」「Apio2009」Atm Tarjan+dp
「BZOJ4381」「POI2015」Odwiedziny 树上分块
「BZOJ3689」异或之 01字典树,堆计数第k大
「BZOJ1001」狼抓兔子 平面图最小割->对偶图最短路
「BZOJ1261」「SCOI2006」zh_tree dp
「BZOJ2134」 期望dp
「BZOJ1076」状压期望dp
「BZOJ4008」非常神的期望dp
「BZOJ4318」期望dp
「BZOJ3585」莫队维护区间mex
「BZOJ3143」「HNOI2013」期望dp+高斯消元
「BZOJ1415」「NOI2015」期望,记忆化搜索
「BZOJ1004」「HNOI2008」cards,burnside引理+01背包
「BZOJ4346」「POI2016」Nadajniki 非常神的树形dp,orz Claris
「BZOJ1047」「HAOI2007」理想的正方形 二维单调队列
「BZOJ4300」按位dp
「BZOJ1010」「HNOI2008」斜率优化dp
「BZOJ4870」「SHOI2017」组合数问题 模意义下的组合方案计数,矩阵加速
「BZOJ4868」「SHOI2017」期末考试 贪心( 一生之敌
「BZOJ3631」「JLOI2014」松鼠的新家 树链剖分随便搞一搞就完了
「BZOJ2002」「HNOI2010」弹飞绵羊 LCT模板题 建一个虚拟节点表示弹飞的位置 然后询问的时候:makeroot(node[n+1]);access(node[x]);splay(node[x]);
再查询splay上的左子树大小
「BZOJ2049」「SDOI2008」cave洞穴勘测 LCT维护连通性
「BZOJ3124」「SDOI2013」直径 树的直径随便搞一搞,计个数
「BZOJ3669」「NOI2014」魔法森林 LCT动态维护生成树,方法是把边也看做点连起来,记录路径上的最大点
「BZOJ1975」「SDOI2010」魔法猪学院 反向spfa,然后启发式求k短路
「BZOJ1924」「ZJOI2015」这题我做了一辈子,动态点分治,然后搞一搞就没了
「BZOJ4390」「USACO2015DEC」差分搞一下
「BZOJ4518」「SDOI2016」征途 推一个式子,然后求 s2i 这个式子是可以斜率优化的,然后没了
「BZOJ1303」「CQOI2009」中位数图,其实这个是好久以前写的,现在记一下。大概就是给了一个1e5的序列,问有多少奇数长度的子串中位数是b。我们考虑一下简单的差分计数,给小于b的数字标为-1,给大于b的数字标为1。然后计一波数就好了。同理还有平均数,都是一样的。
「BZOJ3810」「COCI2015」把一个矩形分成若干个长方形,要求必须和矩形边缘相连,求所有矩形面积距离k的差值的平方的最小值。我们考虑记录一下矩形大小和四条边相邻的状态,然后记忆化搜一波。转移时我们发现每次切割这个矩形,要保证a+b+c和a+b+d,两个状态都大于0,才能切成有c没d和有d没c两种,或者a和b,也一样。
「BZOJ2079」「POI2015」问是否可以黑白染色,要求白色点至少和一个黑色点相连,黑色点也是。如果是联通的一个块,那么他有一个生成树,那么我们隔行染色,没了。
「BZOJ2705」「SDOI2010」求 ni=1gcd(i,n) ,观察一下,我们把gcd设为x提出来,我们要计数 gcd==x 的有多少个,根据 gcd(tmp,n)==x<==>gcd(tmp/x,n/x)==1 ,我们其实就是要求 d|nxφ(nx) ,没了。
「BZOJ2820」求 xn,ym,gcd(x,y)==prime 的数对的个数,反演入门题,考虑gcd有prime这个因子的个数 =nprimenprime ,我们令这个式子为 F(prime) ,根据反演公式 F(x)=n|df(d)=n|dμ(dn)F(d) ,然后搞一搞。
「BZOJ4816」「SDOI2017」数字表格,反演是一眼的,然后60分,然后好像是线性筛出一部分做,反正我不会。。
「BZOJ3524」「POI2015」Couriers 给了一个序列,求[l,r]中是否存在出现次数大于一半的数字。主席树模板题。
Code:

const int N=500000+10;
int n,m,a[N],ls[25*N],rs[25*N],size[25*N],cnt=0,rt[N];
inline void ins(int &o,int pre,int l,int r,int q){
    o=++cnt;int mid=(l+r)>>1;
    ls[o]=ls[pre];rs[o]=rs[pre];size[o]=size[pre]+1;
    if(l==r) return;
    if(q<=mid) ins(ls[o],ls[pre],l,mid,q);
    else ins(rs[o],rs[pre],mid+1,r,q);
}
inline int query(int x,int y,int l,int r,int q){
    if(l==r) return l;int mid=(l+r)>>1;
    int lsize=(size[ls[x]]-size[ls[y]]),rsize=(size[rs[x]]-size[rs[y]]);
    if(lsize>q) return query(ls[x],ls[y],l,mid,q);
    else if(rsize>q) return query(rs[x],rs[y],mid+1,r,q);
    else return 0;
}
int main(int argc,const char * argv[]){
    n=read();m=read();
    rep(i,1,n) a[i]=read();
    rep(i,1,n) ins(rt[i],rt[i-1],1,n,a[i]);
    while(m --> 0){
        int l=read(),r=read();
        printf("%d\n",query(rt[r],rt[l-1],1,n,(r-l+1)>>1));
    }
    return 0;
}

「BZOJ3083」遥远的国度,换根操作其实就是判断一下,跟在不在查询点的子树中,如果在,我们就要查询 son[now](son>root) 之外的区间,倍增处理一下。
「BZOJ3526」两个权值的序列,可以翻转权值,1e6次修改能否让序列单调不降。开一个线段树合并区间,合并的方法是,记录区间以小数字开头,右端点的最小值,以大数字开头,右端点的最小值,同时维护是否可行,修改的时候直接做。
「BZOJ1699」rmq
「BZOJ1597」斜率优化
「BZOJ1607」思博题
「BZOJ2006」「NOI2010」超级钢琴,维护区间最大值以及最大值点,在做rmq时向上合并,然后归并答案,取出堆顶,通过极值点加入两边的值。
「BZOJ3601」一个人的数论 这题好神啊,刚开始无脑上了一波反演,然后xjb搞了一会弃疗去看题解了。(我只是想学一下自然数幂和,然后就坑进来了
BZOJ 题目整理_第1张图片
然后没有样例的题我居然写对了。。。
「BZOJ2243」染色 树剖,线段树合并记录左端点颜色和右端点颜色和颜色数,注意树剖向上走的时候记一下两边的颜色,中间要合并上。
「BZOJ1535」kmp求一波,然后开个链表搞一搞。。
「BZOJ4654」「NOI2016」区间,离散化,然后胡想一下,答案应该在连续的区间,然后按权值排序,双指针扫描,线段树搞一波。
「BZOJ2337」「HNOI2011」xor和路径 我们发现,异或操作如果分成每一位上,令 f[x] 表示到n点的期望值,那么如果这条边这一位是1,那么 f[x]=f[y]/d[x] ,否则就应该取反,也就是说 f[x]=(1f[y])/d[x]
高斯消元我建立矩阵一直很脑残,几乎没有一次写对过。。。
「BZOJ1006」「HNOI2008」设dp[i][j]表示到第i位匹配了模板串的前j位,kmp一波求出来,然后发现i没啥用,线性递推,然后就直接上矩阵。
「BZOJ2157」旅游 写了6k树剖,然后爆了,改不动,要死了。。然后换lct,3k写完,mdzz。
「BZOJ1180」「CROATIAN2009」lct模板,还是双倍经验。
「BZOJ2816」「ZJOI2012」开10个lct,搞搞搞,然后发现题目所有字符输出都有’.’,然后就爆了,mdzz。(然后还发现自己的lct跑得超级慢,加了个fread结果忘了init,卡了好久评测,(结果fread更慢
「BZOJ3339」rmq problem 区间mex 莫队搞搞搞。
「BZOJ2005」「NOI2010」大力容斥一发,感觉这个如果反演数据可以1e9?
「BZOJ3400」xjb带模dp一下
「BZOJ1197」我猜是这样dp,然后就A了系列
「BZOJ3540」可以把0染色成1,然后求最长的01相同的区间长度。我们把0看成-1,不考虑修改的话就是记录前缀和为x的最早位置直接做,考虑修改的话就是奇偶划分一下更新。我发现遇到这种题我思路很乱啊,所以说我好弱啊。
「BZOJ4510」 dp[i][j] 表示fj走了i,牛走了j,然后随便转移一下,没了。
「BZOJ5017」「SNOI2017」从一个2016年比赛搬的题,claris博客有。。。一眼缩点拓扑dp,然后建图gg,所以用线段树优化区间建图,复杂度我不会分析,应该挺快的吧
「BZOJ4383」「POI2015」同上
「BZOJ1688」状压(长见识了,不加滚动数组会TLE!!!!这不珂学啊!
「BZOJ1664」线段覆盖,水题之心使我打开它,然后居然没有秒掉,我真是个sb。贪心排序直接选。还有一种是选最少的覆盖当前区间,好像一年noip考了,大概就是左端点排序然后贪,每次选当前R+1覆盖住的L,取个最大,搞搞搞。
「BZOJ1951」「SDOI2010」lucas搞一搞,然后发现不是质数,百度上分解一波质因子,crt合并,据说这叫ex-lucas。
「BZOJ4990」usaco17这一堆题还挺好的啊。两个线段之间权值之差小于等于4的可以连边,求不相交情况下的最大连边数。然后我一直想错,然后我打开了题解,这个题相当对于每个一号线段的点询问他能连到的边中前缀匹配数的max值,然后BIT维护一下就好了。
「BZOJ3680」吊打XXX 模拟退火求广义费马点。。开始有一个温度,然后随机判断更优解,如果解更优或者满足(exp(dE/T)>rand())这一玄学物理公式,就转移过去,然后降温。
「BZOJ4776」先统计所有被遮住的矩形的范围,然后差分一下,最后枚举所有颜色判断是否可以,如果不行就减掉。差分方法是:先给左上角和右下角 +1 最下角下一个和右上角右边一个 1 ,然后先竖着扫前缀和,再横着。不带修改的题我如果再上数据结构我去吃屎
「BZOJ4777」脑补一下,最近异色点对一定在边的两端,所以一定在最小生成树上,建出树以后set胡搞。
「BZOJ4010」「HNOI2015」倒着拓扑字典序最大,可以满足正着最小的数最先出现。
「BZOJ4757」增加一个c的改变量是递减的,然后我们二分这个量,解方程算出c,bzoj二分80次可以A,洛谷要100次,这真是玄学。。
「BZOJ4758」给一个序列,可以反转其中一个子序列,求最长不降子序列的长度,值域 [1,50] 。我们令 dp[i][j][k][m] 表示区间[i,j]的值域为 [k,m] 时的最长不降子序列长度,发现序列反转其实就是两边交换一波就好了。
「BZOJ4759」离散化一下,然后Bit扫两边。
「BZOJ1977」求严格次小生成树。我们先求出最小生成树,然后倍增维护一个路径上的最值和次小值,然后枚举所有非树边,更新答案的最小增量。
「BZOJ2048」答案是调和级数/2
「BZOJ1040」「ZJOI2008」骑士。在一个基环森林里找最大独立集,我们枚举每一个点,从他找环,然后ban掉一条边,两侧分别dp,然后答案都是不取根节点的。
「BZOJ4745」 dp[i][j][0/1] 表示当前第一个序列已经经过了i,第二个序列经过了j,当前人在哪一个的最小消耗。
「BZOJ3886」我们发现用时间表示当前最小的看过的数量是不可行的,于是反过来考虑,看过了集合 S 的最长时间,就可以dp了。我们令 dp[S] 表示当前可以到达的最后时间,转移的时候,枚举所有非集合内的点,然后二分出这个时间之前可以看的点,更新答案。
这个二分是这样的:

inline int find(int t,int i){
    int l=-1,r=cnt[i]-1;
    while(lint mid=(l+r+1)>>1;
        if(a[i][mid]<=t) l=mid;
        else r=mid-1;
    }
    return l;
}

这种求小于xxx的最大值,并且mid就是当前答案,我们要(l+r+1)>>1

「BZOJ3887」给一个有向图,找出一个从一出发的环,你可以逆行一次,问最多经过的点。我们先缩点,变成一个dag,我们可以枚举边,让他反向,然后发现,一条边反向,其实就是反图到边的起点的最长路加上正图到边的终点的最长路,于是我们做两遍dp即可。
注意这种建立新图的题要写结构体里,然后专注,不然就肯定错了。
「BZOJ1213」「POI2008」求去掉每个点之后的不连通的点对数量。我们再求割点的时候,把这个点在dfs树中的所有子树累计计数即可。
「BZOJ2751」观察一下,容易发现答案其实就是当前位置所有取值乘上其他位置所有取值之和,这个其实就是当前位置的所有数字之和乘上其他位置的数之和,然后数据范围1e9,发现被限制的比较少,拿出来做就可以了。
「BZOJ3943」两两之间比赛,可以看做连边,每两个人只比赛一场,就相当于只有一条边可以选,于是我们用xor建出图来,然后求一个mst即可。
「BZOJ1585」给了一些点没有破坏,但不能到达s,求最小点割。最小点割的建图方式就是,原图中的边 (xy) 我们看做是x对应的虚点到y,y对应的虚点到x,建立两条容量为inf的边,对于此题来看,未被破坏的点意思就是割他的权值是inf,且这个点是可以到达汇点的,其余的点,我们让他指向虚点权值为1,表示割掉这个点需要1的流量,这样跑最小割,答案就是最小点割了。
「BZOJ1878」「SDOI2009」这个题可以离线然后树状数组,我这种比较咸的人就会写莫队然后有没有1A
「BZOJ2789」求a字符串到b字符串的最小交换次数。就是求一个逆序对,处理出每个字符应该在b序列中的位置,Bit做一下就好了。
「BZOJ3378」给一个序列,求序列中所有的点对的 max(ai,aj)dis(i,j) ,我们对于所有点,按照权值排序,然后对于位置建立2个树状数组,一个记录这个位置的前缀有多少个点,一个记录前缀的到达0位置的距离之和,这样我们更新当前答案的时候就是,用当前点的位置乘上之前的点个数再减去之前点的前缀距离之和。
「BZOJ2631」lct模板题,注意取模。取模的题我这辈子都ac不了了啊具体来书,记录一个size,记录两个tag,注意加法的tag要先乘在更新,下推的时候记录左右孩子即可。
「BZOJ2590」用k张优惠券买牛。dp了好久,发现好像不能dp。。。直接贪心就好啦,维护两个相对应的堆,记录每个牛的的两种价格,然后给一个小根堆里加入k个0,每次如果使用优惠券更优,就直接用,并注意记录当前牛被选过了,两个堆都要扔,让后给优惠券堆里面加入优惠金额,如果以后来的点,优惠金额更好,我们就可以用上一次的优惠了的金额加上当前优惠值更新一个答案啦。
「BZOJ1632」把放下荷叶当做给水练了一条权值为1的边,然后注意到路径数的计数是有问题的,因为原先有的荷叶形成一个联通块,那么我们就对于每个点dfs一遍找出来并连边然后spfa的时候统计一下路径数量即可。
「BZOJ1217」众所周知,treedp是一种非常难写的dp,所以我们贪心,(滑稽,其实这一类问题都可以贪心,因为当前已知的深度最大的点一定要被覆盖,所以我们dfs一遍,然后按深度排序,向上找k个祖先一定要选,然后向下dfs覆盖即可。
「BZOJ1925」一个5k的排列的波动序列种数有多少个。我们令 dp[i][j] 表示长度为i的排列,开头是j且第一段是下降的种类数,通过一些神奇的推导,我们可以得到一个非常简单的方程, dp[i][j]=dp[i][j1]+dp[i1][ij+1]
推导:如果j和j-1是不相邻的,那么我们交换这两个,没有丝毫影响,如果响铃,我们把j去掉,其实就是在算 dp[i1][(i1)(j1)+1] (这是反向情况下的,因为要求第一段下降。
「BZOJ1306」搜搜搜就能过,其实我们还可以状压一下状态,用hash判断一下,这样跑得飞快。
「BZOJ1194」两个咒语机有连边要求他们在对应的位置都一致,判断所以可以到达的状态中是否有走到的自动机x结点可以输出,而y不可输出的情况,连号边之后直接tarjan求最长路即可。
「BZOJ1211」树的计数 prufer序列和Cayley公式的一个推论,n个节点有标号的无根树一共有 n(n2) 个,而n个节点的度依次为 D1,D2,,Dn 的无根树共有 (n2)!i(Di1)!
「BZOJ3389」最少线段覆盖,按照左端点排序

sort(e+1,e+n+1);
int now=0,cnt=0,tmp=0;
while(nownow;
    while(cnt1].x<=tmp+1){
        ++cnt;
        chmax(now,e[cnt].y);
    }
    if((cnt==n&&e[cnt].y1].x>now+1)){
        puts("-1");return 0;
    }
    ans++;
}

「BZOJ1698」这题重了、、上面有一个。
「BZOJ3011」给一个有根树,求每个点的子树中和他的距离小于l的点有多少个。这道题非常的神,我们先求出树的dfs序和每个节点的深度,然后把所有点按照深度排序,双指针扫一下,维护深度不超过l,然后每次加入的点,求他在dfs序中的子树节点个数,树状数组维护一下即可。
「BZOJ1131」「POI2008」先求出size和dep,然后再dfs一遍更新就好了。
「BZOJ1046」「HAOI2007」询问长度为x的上升序列,我们做出来上升序列,因为字典序要最小,而且询问次数比较少,我们就直接贪心,扫一遍序列,就是这个样子:

for(int i=1,last=0;x;++i){
    if(f[i]>=x&&a[i]>a[last]){
        last=i;printf("%d ",a[i]);
        if(x==1) pts;--x;
    }
}

「BZOJ1598」求k短路,据说a*有一种可以被卡的方法,考完noip看一下好了。一般的a*就是spfa求一遍反图最短路,然后把距离放进一个堆里面更新答案。
「BZOJ3479」MST
「BZOJ3477」给了一个序列,删除中间的一段使得平均值最小。 val=sum[n]sum[j]+sum[i1]n(ji+1)k 我们二分这个k,把式子移项可以得到 sum[n]sum[j]+sum[i1]knkj+kik ,然后我们令 c[i]=sum[i]ki 那么这个式子就是 c[n]c[j]c[i1] ,于是我们在check的时候维护最小值即可。
「BZOJ1117」「POI2009」设 f[x][k] 表示在x的子树中,距离x为k的灭火器有多少个点能分配。设 g[x][k] 表示在x的子树中,距离x为k的灭火器需求的点数。然后对应分配。
「BZOJ????」正解是ac自动机什么的吧,我现在字符串还是太弱了,于是我发现瞎贪心全是a的数据并不能卡死我2333 (我把题号看错了,然后忘了,奶牛的一个字符串题。。
「BZOJ2302」我们可以发现如果一个序列是合法的,那么对于这个序列的一个前缀,必然有 cnt[i]i ,其中 cnt[i] 表示小于等于i的位置数量,否则必然前面会有空的,后面一定坐不下。知道这个之后我们就可以dp了。设 dpi 表示小于等于i的人有j个的方案数,我们用sum表示可以小于等于i编号的人数,那么转移方程就是

fi,j=k=cntiji+1fi1,jkCsumicnti(jk)kcnti

先枚举当前可能有多少人,然后枚举这个增加了多少,首先至少增加 cnti 然后最多增加到 j(i1) 保证上一个位置是合法的。然后除了已知的都可以自由组合起来啦。

「BZOJ2678」这题就是个码农题! 太难写了啊!首先dp是一眼的,就是

dp[i]=minj<idp[j]+max([j+1,i]),sumw[i]sum[j]L

然后线段树码码码,然后那个下表还是错位的,超难调好吧。还是我弱。

「BZOJ1231」我们令 dpi 表示以第i头牛为结尾的状态下的方案数,然后我们枚举状态,然后枚举状态中的点,再枚举不在状态中的点,更新 dp[k][S|(1<<k)]+=dp[i][S](!(S&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;(1<<k)))

「BZOJ1595」单调栈扩展两侧,记录每个点可以扩展到哪里。

「BZOJ1594」二分最早在那里出现矛盾,然后按照权值排序,这样我们拿一个并查集维护,每个线段就是把这里面所有的点连接到r+1的位置。

「BZOJ2733」我们用权值线段树记录第k小,然后合并线段树,用并查集维护连通性。

int n,m,a[N],root[N],id[N],sz;
int ls[N*20],rs[N*20],sum[N*20];
inline void insert(int &k,int l,int r,int val){
    if(!k) k=++sz;
    if(l==r){
        sum[k]=1;return;
    }
    int mid=(l+r)>>1;
    if(val<=mid) insert(ls[k],l,mid,val);
    else insert(rs[k],mid+1,r,val);
    sum[k]=sum[ls[k]]+sum[rs[k]];
}
inline int query(int k,int l,int r,int rk){
    if(l==r) return l;
    int mid=(l+r)>>1;
    if(sum[ls[k]]>=rk) return query(ls[k],l,mid,rk);
    else return query(rs[k],mid+1,r,rk-sum[ls[k]]);
}
inline int merge(int x,int y){
    if(!x) return y;if(!y) return x;
    ls[x]=merge(ls[x],ls[y]);
    rs[x]=merge(rs[x],rs[y]);
    sum[x]=sum[ls[x]]+sum[rs[x]];
    return x;
}

「BZOJ2326」「HNOI2011」矩阵快速幂,分段做。

「BZOJ1419」我们令 fi 表示有i个红色j个黑色时候的期望收益, fi=max(0,i(i+j)(fi1+1)+j(i+j)(fi1)) ,注意这个方程虽然很显然,但是一定要注意到这个0,因为小于0不如不选。

「BZOJ1620」我开始二分,然后我死了,好烦啊。直接贪心啊,好烦烦啊,贪心毁一生。我们直接按照结束时间排序,最后完成的在前,如果当前答案比枚举到的结束位置要小,就可以直接减去用时,如果比结束时间还要晚,ans就要到达这个点的开始时间。

「BZOJ2109」spfa

「BZOJ1602」倍增

「BZOJ2783」「JLOI2012」dfs的过程中可以开双指针扫,也可以开一个set来统计答案,用添加0的trick来维护根节点的路径。

「BZOJ1584」非常神奇的题目,首先还是显然dp: dp[i]=min(dp[j],cnt[(j+1i)]) ,这样做显然是三次的,优化一下双指针扫描,就变成2次的了,然后我们发现,所有点都直接选出来,答案是n,那么答案实际上肯定比n小,也就是说,当前点的决策区间内不超过 n 种决策,我们把连续的相同点缩成一个,然后只要枚举根号个决策就好了。

「BZOJ2431」dp,不想写方程了,很水。

「BZOJ2621」状压,用了i个电梯,奶牛状态为j时候电梯内的最小重量,因为我们转移的时候判断了可行性,最后只需要判断第一个被优化的点就可以了。

「BZOJ2058」环形逆序对。先求逆序对,然后发现把第一个点转化成最大的数,和循环移位是等价的,然后我们发现由于没有任何数字比最小的数字小,我们从最小的数字开始改变,这个数字的位置-1就是逆序对数量,改变后增加的逆序对就是这个点后面的数字数量。

「BZOJ2060」大水题

「BZOJ1705」还是一眼dp系列,我们令 dpi 表示前i个杆子,当前杆子高度是j的最优解,如果每次转移枚举前面就比较gg了,所以说我们算一波当前高度为j时候的最优解,注意到绝对值,于是我们分类讨论一波高低即可。最优解这样算: f[i]=min(f[i1]+c,dpi1) 增高上一根柱子,或者选择上一次的dp值(初始f要清inf)

「BZOJ1601」每个点都有费用,那我们给一个虚点连边再求mst即可。

「BZOJ1965」开始的时候猜想循环节是len>>1然后gg了,暴力有70,然后模错了我就爆了,后来发现,应该先暴力求循环节2333。瞎猜选手被制裁啦!

「BZOJ4095」神题,非常神,我们把序列反向,询问反向,就变成询问一个点最后回到达原数列中的那个点,我们倍增处理,并且观察到这个窗口在下移,所以倍增的时候顺手减一个1。

「BZOJ3406」搜搜搜

「BZOJ1773」如果要让图没有环,拓扑是个好东西,我们拓扑走无权边,然后给无向边带权,无权的我们拓扑走,有权的我们直接沿着拓扑序把逆向边ban掉。

「BZOJ1216」堆,贪心,如果被打断,直接拆开当前重新加入堆即可。

「BZOJ2620」分金币升级,没啥区别,主要就是设一个k表示n给了1多少个,然后求就行了。

「BZOJ1483」 链表启发式合并

注意到,下面行都比较松散,因为,csdn太难用了,我自己换了一个typora,编辑完了拷上来的。

你可能感兴趣的:(一些题目)