CF1012F Passports
http://codeforces.com/problemset/problem/1012/F
题解
考虑\(p=1\)的情况。
我们可以把题意理解成平面上有一些线段,你需要给每条线段分配一个长度给定的预备线段,使得预备线段要在它所属的线段前面,并且所有线段不能相交。
因为我们只需要弄出一组解来,所以我们可以直接设\(dp[s]\)表示\(s\)集合内的所有旅行都办好了签证,最后拿到护照的最小时间。
于是我们发现\(p=2\)时我们只需要把它们分成两组,每组都满足条件就行了,并且需要满足每次办理签证的当前不能再某次旅行途中。
所以对于\(p=2\)的情况,我们还是按照上面去\(dp\),最后枚举划分就好了。
然后考虑怎么\(dp\)。
我们可以直接枚举一个状态,然后枚举下一次办理那个国家的签证,然后判断一下就行。
如何判断新加入一个国家时需要的时间,我们设上一次的时间为\(last\)。
我们可以把所有初始,的线段排序,然后我们从前往后扫描每个线段,当当前时间与这个线段冲突时就把时间往后推。
然后发现这个是有单调性的,于是可以把所有要转移的按照签证时间排序,双指针即可。
代码
#include<bits/stdc++.h>
#define N 25
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int n,p;
int bit[1<<23];
int ansl[N];
ll ansr[N];
int tot,b[N],tot1,c[N];
ll dp[1<<23],tag[1<<23];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct node{
int l,r,t,id;
inline bool operator <(const node &b)const{
return l<b.l;
}
}a[N];
inline bool cmp(int x,int y){
return a[x].t<a[y].t;
}
void dfs(int s,int tg){
if(!s)return;
int x=tag[s];
ansr[a[x].id]=dp[s]-a[x].t;
ansl[a[x].id]=tg;
dfs(s-(1<<x-1),tg);
}
int main(){
n=rd();p=rd();
for(int i=1;i<=n;++i){
a[i].l=rd();
int x=rd();
a[i].r=a[i].l+x-1;
a[i].t=rd();
a[i].id=i;
}
sort(a+1,a+n+1);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;++i)bit[1<<i-1]=i;
int maxn=(1<<n);
dp[0]=1;
for(int i=0;i<maxn;++i)if(dp[i]<1e15){
tot=tot1=0;
for(int j=1;j<=n;++j)if(!(i&(1<<j-1)))b[++tot]=j;else c[++tot1]=j;
sort(b+1,b+tot+1,cmp);
int p1=1,p2=1;
ll last=dp[i];
for(int j=1;j<=tot;++j){
int now=b[j];
while(1){
bool tg=0;
if(last>=a[p1].l&&p1<=n){
last=max(last,(ll)a[p1].r+1);
p1++;tg=1;
}
while(last>a[c[p2]].l&&p2<tot1)p2++;
if(last<=a[c[p2]].l&&p2<=tot1){
int xx=c[p2];
if(a[xx].l<=last+a[now].t)last=max(last,(ll)a[xx].r+1),p2++,tg=1;
}
if(!tg)break;
}
int s=i^(1<<now-1);
if(last+a[now].t<a[now].l&&last+a[now].t<dp[s])dp[s]=last+a[now].t,tag[s]=now;
}
}
if(p==1){
if(dp[maxn-1]<1e15){
dfs(maxn-1,1);
puts("YES");
for(int j=1;j<=n;++j)cout<<ansl[j]<<" "<<ansr[j]<<"\n";
}
else puts("NO");
}
else{
for(int i=0;i<maxn;++i)if(dp[i]<1e15&&dp[maxn-1-i]<1e15){
dfs(i,1);dfs(maxn-1-i,2);
puts("YES");
for(int j=1;j<=n;++j)cout<<ansl[j]<<" "<<ansr[j]<<"\n";
return 0;
}
puts("NO");
}
return 0;
}
CF1012F Passports的更多相关文章
- 新概念英语(1-15)Your passports please
Is there a problem wtih the Customers officer? A:Are you Swedish? B:No. We are not. We are Danish. A ...
- Windows Server 2008 R2常规安全设置及基本安全策略
这篇文章主要介绍了Windows Web Server 2008 R2服务器简单安全设置,需要的朋友可以参考下 用的腾讯云最早选购的时候悲催的只有Windows Server 2008 R2的系统,原 ...
- json 转化
1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码代码如下: JSONArray array = JSONArray.fromObject(userlist); S ...
- RFID 仿真/模拟/监控/拦截/检测/嗅探器
Sound card based RFID sniffer/emulator (Too tired after recon.cx to do draw the schematics better th ...
- RFID 基础/分类/编码/调制/传输
不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...
- json串转对象
// 引入相应的包 //json-lib-2.2-jdk15.jar import net.sf.json.JSONArray;import net.sf.json.JSONObject; 1. // ...
- JSON字符串与java对象的转换
所需的jar包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar 4.commons-logging.jar ...
- JSON 字符串 与 java 对象的转换
jsonLib 经典文章:http://json-lib.sourceforge.net/xref-test/net/sf/json/TestJSONObject.html // 引入相应的包 //j ...
- 英语阅读积累<一>
Passage 1.Woodpecker 惹treat or trick There are many apple trees in a garden. They’re good friend ...
随机推荐
- 【转】centos7安装
转自:https://blog.csdn.net/qq_42570879/article/details/82853708 1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:htt ...
- adb,aapt等命令使用
adb install/uninstall:安装/卸载手机中的应用. devices:查看当前连接到电脑中的设备. adb shell 首先运行adb ...
- C++中对象的构造顺序
1,C++ 中的类可以定义多个对象,那么对象构造顺序是怎样的? 1,很多的 bug 是由对象的构造顺序造成的,虽然它不难: 2,对象的构造往往和构造函数牵涉在一起,构造函数的函数体又可能由非常复杂的程 ...
- 悼念512汶川大地震遇难同胞——选拔志愿者 HDU 2188 博弈论 巴什博奕
悼念512汶川大地震遇难同胞--选拔志愿者 HDU 2188 博弈论 巴什博奕 题意 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队 ...
- 不能将X*类型的值分配到X*类型的实体问题的解决方法
今天在学习链表的过程中遇到了这个问题,我用如下方法定义了一个结构体,然后这个函数想要在链表头插入一个节点.但是在函数的最后一行却出现了报错:不能将MyLinkedList * 类型的值分配到MyLin ...
- tar.xz问价解压
1. 解压tar.xz安装包 今天去Ubuntu上安装nodejs,下载的文件是node-v8.11.1-linux-x64.tar.xz,这是两层压缩,外面是xz压缩,里层是tar压缩,所以分两步实 ...
- 【学习总结】快速上手Linux玩转典型应用-目录
内容链接 慕课网:快速上手Linux玩转典型应用 目录 第1章-课程介绍 第2章-linux简介 第3章-CentOS的安装 第4章-准备工作 第5章-远程连接SSH专题 第6章-linux常用命令讲 ...
- Vue中如何引入第三方icon库(阿里巴巴矢量图标库)
1.进入阿里巴巴矢量图标库: 2.新建项目 3.前缀注意不要跟element-ui自带的icon(el-icon)重名就ok 4.创建完成后,去阿里选自己要使用的图标,加入购物车 ...
- 算法学习之选择排序算法的python实现
——参考自<算法图解> def findSmallest(arr): # 假设第一个元素最小 smallest = arr[0] smallest_index = 0 for i in r ...
- rest_framework框架的认证、权限
REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth", ] ...