题目抽象:给定最大的覆盖次数k和q条线段对于每条线段判断是否能覆盖在相应区间上使得该区间上最大的覆盖次数<k,输出这些线段的编号有两种做法,一种使用懒惰标记,一种不使用,时间差不多先讲使用懒惰标记的没什么好讲的,在需要更新或查询的时候将信息往下传即可,上代码View Code #include<stdio.h>#include<cstring>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mid (l+r)>>1const int maxn = 1000010;i Read More
线段树区间染色,判断区间颜色的数目典型的成段更新,懒惰思想View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int col[maxn<<2];//是否被某种颜色完全覆盖 int sum[maxn<<2];//刚开始想只用一个域来表示,但是怕会分不清楚的,所以 Read More
很典型的树形DP,自己也理解了好久,感觉自己好水哦。。。。。。。。。。。。。。。。。。。。。。。。。所以讲得清楚一点,以后回忆起来也快题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值我们把背包的思想用到这里来,做的步数相当于背包的容量,点上的权值相当于价值,给定一定的背包容量,求最多能装进背包的价值设dp[0][s][j]表示从s(当前根节点)出发,走 j 步,回到s所能获得的最大权值 dp[1][s][j]表示从s(当前根节点)出发,走j步,不回到s所能获得的最大权值现在我们就可以分配背包容量了:父节点与子节点分配背包容量,从而设计出状态 Read More
把最贵的先留着最后再买View Code #include<stdio.h>#include<string.h>int dp[1010];int p[1010];int max(int a,int b){ return a>b?a:b;}int main(){ int n,m,i,j,pos; while(scanf("%d",&n),n) { int Max=0; for(i=1;i<=n;i++) { scanf("%d",&p[i]); if(p[i]>Max) ... Read More