【BZOJ 5125】小Q的书架】的更多相关文章

Problem Description 小 \(Q\) 有 \(n\) 本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小 \(Q\) 希望把这一排书分成恰好 \(k\) 段,使得每段至少有一本书,然后把每段按照现在的顺序依次放到 \(k\) 层书架的每一层上去. 将所有书都放到书架上后,小 \(Q\) 这才突然意识到它们是乱序的,他只好把每一层的书分别按照编号从小到大排序.排序每次可以在 \(1\) 单位时间内交换同一层上两本相邻的书. 请写一个程序,帮助小 \(Q\)…
小Q有n本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小Q希望把这一排书分成恰好k段,使得每段至少有一本书,然后把每段按照现在的顺序依次放到k层书架的每一层上去.将所有书都放到书架上后,小Q这才突然意识到它们是乱序的,他只好把每一层的书分别按照编号 从小到大排序.排序每次可以在1单位时间内交换同一层上两本相邻的书. 请写一个程序,帮助小Q计算如何划分这k段,且如何交换这些书,使得总交换次数最少. Input 第一行包含两个正整数n; k(1≤n≤40000;1≤k≤min…
4017: 小Q的无敌异或 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 593  Solved: 197[Submit][Status][Discuss] Description 背景   小Q学习位运算时发现了异或的秘密.   描述   小Q是一个热爱学习的人,他经常去维基百科(http://en.wikipedia.org/wiki/Main_Page)学习计算机科学.   就在刚才,小Q认真地学习了一系列位运算符(http://en.wi…
新学了一波 决策单调性 dp 套路.... 这种dp一般是长这样的 => f[i][j] = max/min  { f[i-1][k] + cost(k+1,j)} ,其中cost函数满足四边形不等式. 其实这就可以看成是个多阶段决策,每一个阶段的f都是单调的:但因为f[i-1][k] + cost(k+1,j) 并不是单峰函数,所以我们不能通过单调队列做. 这个时候解决的方法就是通过分治 dfs(l,r,L,R) 表示 f[i][l~r] 只能从 f[i-1][L~R] 中转移过来,往下走的时…
设f[i][j]为前i个划成j段的最小代价,枚举上个划分点转移.容易想到这个dp有决策单调性,感性证明一下比较显然.如果用单调栈维护决策就不太能快速的求出逆序对个数了,改为使用分治,移动端点时树状数组维护即可,类似莫队的每次都在原有基础上更新.注意更新时先加再减.感觉复杂度非常玄学丝毫不能看出为啥只需要更新nlog次? #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib>…
显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的决策位置s,两边递归下去继续操作.solve(k,x,s,l,mid-1),solve(k,s,y,mid+1,r). 注意到每个位置每层只会被一个区间遍历到,加上树状数组在线更新逆序对的复杂度,总复杂度为$O(kn\log^2n)$ #include<cstdio> #include<al…
题意:N个数,按顺序划分为K组,使得逆序对之和最小. 思路:之前能用四边形不等式写的,一般网上都还有DP单调性分治的做法,今天也尝试用后者写(抄)了一遍.即: 分成K组,我们进行K-1次分治,get(l,r,L,R)中如果mid位置的最优解来自MID,那么分别以mid和MID和分界线,有get(l,mid-1,L,MID):get(mid+1,r,MID,R): 区间逆序对没有什么特别高效的方法,我们用莫对跑ok了. #include<bits/stdc++.h> #define rep(i,…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 思路就和这里一样:https://blog.csdn.net/leolyun/article/details/70146612 不知为何乘逆元就错了,必须直接除...不过题目保证了是整数,所以直接除也没问题: 然后重新学习了一下分块的简洁写法,就能A了hhh 代码如下: #include<cstdio> #include<cstring> #include<alg…
题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = 区间异或和第 k 位为 1 的子区间个数 * 2^k 而能产生贡献的子区间必定满足 xorSum(R) ^ xorSum(L-1) 第 k 位为 1 注 : xorSum 为前缀异或和 要快速计算这个东西其实很简单.先计算出 xorSum 然后枚举右端点 R .累计到目前为止每个位的 0 和 1 的…
题解:枚举最后在哪里停止,然后剩下的步数/2 也就是找最大深度 枚举终止位置算是一种思路吧 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=10009; int n,m; int maxdep; int cntedge; int head[maxn]; int to[maxn<<1],nex[maxn<<1]; vo…