解析

比较妙的一道题

首先的一个技巧是把一条线段拆成左和右两个端点
顺便也就有了离散化
利用k的关键限制,压缩每个点覆盖线段的状态
需要动态更新每一位所对应的线段是哪条

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+100;
const int mod=2009;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+(c^48);c=getchar();}return x*f;
}
inline void Max(int &x,int y){if(x<y) x=y;}
int n,m,k;
int bit[260],mi[9];
int dp[N][260],tot;
struct node{int pl,op,id;
}p[N];
bool cmp (node a,node b){if(a.pl!=b.pl) return a.pl<b.pl;else return a.op<b.op;
}
int nam[9];
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();m=read();k=read();mi[0]=1;for(int i=1;i<=k;i++) mi[i]=mi[i-1]<<1;for(int i=1;i<mi[k];i++) bit[i]=bit[i-(i&-i)]+1;for(int i=1;i<=n;i++){int l=read(),r=read();p[++tot]=(node){l,1,i};p[++tot]=(node){r+1,-1,i};}sort(p+1,p+1+tot,cmp);memset(dp,-0x3f,sizeof(dp));memset(nam,-1,sizeof(nam));dp[0][0]=0;p[tot+1].pl=p[tot].pl;for(int i=1;i<=tot;i++){if(p[i].op==1){int o(-1);for(int j=0;j<k;j++){if(nam[j]==-1){nam[j]=p[i].id;o=j;break;}}//assert(o!=-1);//printf("i=%d id=%d\n",p[i].id,o);for(int s=0;s<mi[k];s++){if(s&mi[o]) continue;Max(dp[i][s],dp[i-1][s]+(bit[s]&1)*(p[i+1].pl-p[i].pl));Max(dp[i][s|mi[o]],dp[i-1][s]+(bit[s|mi[o]]&1)*(p[i+1].pl-p[i].pl));}}else{int o(-1);for(int j=0;j<k;j++){if(nam[j]==p[i].id){nam[j]=-1;o=j;break;}}for(int s=0;s<mi[k];s++){if(s&mi[o]) Max(dp[i][s-mi[o]],dp[i-1][s]+(bit[s^mi[o]]&1)*(p[i+1].pl-p[i].pl));else Max(dp[i][s],dp[i-1][s]+(bit[s]&1)*(p[i+1].pl-p[i].pl));}}//printf("\ni=%d pl=%d id=%d op=%d\n",i,p[i].pl,p[i].id,p[i].op);//for(int s=0;s<mi[k];s++) printf("  s=%d dp=%d\n",s,dp[i][s]);}//fprintf(stderr,"check=%d\n",dp[4][6]);printf("%d\n",dp[tot][0]);
}
/*
3 50000
013
002
001
*/

CF1313D:Happy New Year(状压dp)相关推荐

  1. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  2. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  3. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  4. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  5. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  6. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  7. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  8. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

  9. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  10. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

最新文章

  1. 抽象工厂模式(abstract factory)
  2. 源码解读 Spring Boot Profiles
  3. 【Android 安全】使用 360 加固宝加固应用 ( 加固工具准备 | 生成签名 APK | 加固操作 | 反编译验证加固效果 )
  4. windows phone7---MVVM模式
  5. 服务器安装Windows Server + Ubuntu双系统
  6. MapObjects2自带例子的问题
  7. 北京大学 微软:预训练模型(Transformer)中的知识神经元
  8. ElasticSearch聚合语法学习(bucket,metric,hitogram,date hitogram)
  9. ISDN与PSTN的区别是什么?
  10. mysql如何使用事件_MySQL事件的使用详解
  11. 信息学奥赛一本通(2060:【例1.1】计算机输出)
  12. 如何查看.net framework 版本
  13. java抓取网页数据_Golang丨Java丨Python爬虫实战—Boss直聘网站数据抓取
  14. [译]10-Spring BeanPostProcessor
  15. ROSt通信编程_服务编程
  16. 数模算法:排队论模型
  17. Unreal Engine 4:虚幻4 文档
  18. 23.本地服务Services
  19. android 9.0 默认打开开发者选项显示
  20. 《Python全栈系列教程》目录

热门文章

  1. 炸锅了!Google称2029年人类开始实现永生不死!疾病,衰老,痛苦将彻底消失!?
  2. 《SAS编程与数据挖掘商业案例》学习笔记之四
  3. 计算机能不能直接识别汇编语言程序,计算机能直接识别执行用汇编语言编写的程序吗...
  4. 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序
  5. java注解 sql_mybatis中注解映射SQL示例代码
  6. pythonjson数据提取_python爬虫学习笔记(十)-数据提取之JsonPath的使用
  7. leetcode377. 组合总和 Ⅳ
  8. 文件的创建与读取 文件的数据添加
  9. C++,Java编程中 标识符 常见命名约定
  10. poj2182 Lost Cows-暴力