CF930E Coins Exhibition
题意:平面上一共有k个硬币(k<=1e9),给你n个区间这些区间中至少有一个硬币反面朝上,m个区间中至少有一个硬币正面朝上。问有多少种硬币放置方案?n,m<=100005.
标程:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+;
const int N=;
typedef long long ll;
struct node{int l,r;}a[N],b[N];
int k,n,m,p[N],rg[N][],g[],f[N][],t;
int ksm(int x,int y)
{
int res=;
while (y){if (y&) res=(ll)res*x%mod; x=(ll)x*x%mod;y>>=;}
return res;
}
int main()
{
scanf("%d%d%d",&k,&n,&m);
for (int i=;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r),p[++t]=--a[i].l,p[++t]=a[i].r;
for (int i=;i<=m;i++) scanf("%d%d",&b[i].l,&b[i].r),p[++t]=--b[i].l,p[++t]=b[i].r;
p[++t]=;p[++t]=k;
sort(p+,p+t+);t=unique(p+,p+t+)-p-;
for (int i=;i<=t;i++) rg[i][]=rg[i][]=t+;
for (int i=;i<=n;i++)
{
a[i].l=lower_bound(p+,p+t+,a[i].l)-p;
a[i].r=lower_bound(p+,p+t+,a[i].r)-p;
rg[a[i].l][]=min(rg[a[i].l][],a[i].r);
}
for (int i=;i<=m;i++)
{
b[i].l=lower_bound(p+,p+t+,b[i].l)-p;
b[i].r=lower_bound(p+,p+t+,b[i].r)-p;
rg[b[i].l][]=min(rg[b[i].l][],b[i].r);
}
for (int i=t-;i>=;i--) rg[i][]=min(rg[i][],rg[i+][]),rg[i][]=min(rg[i][],rg[i+][]);
f[t][]=f[t][]=f[t][]=;
for (int i=t-;i>=;i--)
{
g[]=(ll)f[i+][]*(ksm(,p[i+]-p[i])-+mod)%mod;//这一段有0有1
for (int j=;j<=;j++) g[j]=((ll)f[i+][j]-f[rg[i][j]][j]+mod)%mod;//g[1/0]表示这一段全0/1且符合限制的方案数。
f[i][]=((ll)f[i+][]+g[]+g[])%mod;
f[i][]=((ll)f[i+][]+g[]+g[])%mod;
f[i][]=((ll)g[]+g[]+g[])%mod;
}
printf("%d\n",f[][]);
return ;
}
易错点:1.离散化数组的大小需要注意,此题应该开4倍。
2.注意左端点要-1,因而统计的时候都是左开右闭的区间。
题解:前缀和优化dp
朴素思路:将区间按照左端点排序,dp[i:走到第i个格子][j:满足前j个0区间][k:满足前k个1区间]。状态数太大。
可以按照端点离散化,之后就可以按照关键点跳。官方题解:dp0[i][l1]表示最后一个位置为0,当前统计完前i个关键点,l1表示上一个1的位置在哪个关键点区间,dp1同设。状态数还是太大。
继续优化:中间部分按照全1,全0,有1有0讨论。后面两维可以合并掉。f[i:走到第i个关键点,后面的所有关键点都满足其开头限制][0/1:pos[i]~pos[i+1]的区间包含0/1(最后一个0/1在i区间),2:全集]的方案数。f[i][0/1]是最后一个0/1在i~t区间的方案后缀和。f[i][2]是当前的最后一段有0有1的方案数全集(不是后缀和)。
对于限制的处理,对于有相同左端点的区间,取右端点min。对于有包含关系的区间,两个限制都取较小的一个右端点,保证右端点单调,可以直接避免最靠前的一个01位置的不合法情况。
O((n+m)logk)。
CF930E Coins Exhibition的更多相关文章
- [CF930E]/[CF944G]Coins Exhibition
[CF930E]/[CF944G]Coins Exhibition 题目地址: CF930E/CF944G 博客地址: [CF930E]/[CF944G]Coins Exhibition - skyl ...
- 【CF944G】Coins Exhibition DP+队列
[CF944G]Coins Exhibition 题意:Jack去年参加了一个珍稀硬币的展览会.Jack记得一共有 $k$ 枚硬币,这些硬币排成一行,从左到右标号为 $1$ 到 $k$ ,每枚硬币是正 ...
- [LeetCode] Arranging Coins 排列硬币
You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...
- ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力
Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS Memory Limit:65536KB 64bit IO Fo ...
- Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)
传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...
- csuoj 1119: Collecting Coins
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec Memo ...
- Coins
Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hi ...
- hdu 1398 Square Coins (母函数)
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)
http://poj.org/problem?id=3260 Description Farmer John has gone to town to buy some farm supplies. ...
随机推荐
- 【二】Jmeter接口自动化测试系列之函数使用及扩展
上一篇文章我们了解了Jmeter的参数化的集中方法,虽然方法不是很多,但已经足够使用! 本篇文章,介绍一下Jmeter自带函数的使用和 函数扩展,来满足测试工作中的各种需求! Jmeter自带函数 点 ...
- 某个ip段可以访问mysql
我们先创建一个测试用户LimitIP,只允许192.168段的IP地址访问,具体权限如下所示: mysql> GRANT SELECT ON MyDB.* TO LimitIP@'192.168 ...
- awesome mac
https://proxyman.app/ https://proxie.app/docs/#how-does-it-work https://github.com/kyleduo/TinyPNG4M ...
- 高级UI晋升之触摸事件分发机制(一)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 0. 前言 鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇.实践 ...
- Elasticsearch索引别名使用
背景 项目中使用的老的索引,由于数据冗余,会想影响性能.因此需要重新建立索引,但是这样必然需要更新服务中的索引名称,然后重新启动服务,可能会对服务的使用者产生一定的影响.因此,调研了Elasticse ...
- 关于虚拟机中linux系统时间的问题
由于考试需求,我在vm上放置了考试用的linux环境,在进行操作的时候需要回调时间才能进行一些操作.但是每次重启之后,时间总是会和物理服务器的时间进行同步,让我非常的苦恼. 终于有一天我想清楚了如何表 ...
- Dubbo中有哪些角色?
registry 注册中心. 是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服务总线的. 发布 开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开. 订阅 客户端程 ...
- CSIC_716_20191204【网络编程 OSI 七层结构】
软件开发架构 C/S架构: Client: 客户端 Server: 服务端 比如: 微信客户端.QQ客户端等... 优点: - 软件的使用稳定 - 节省网络资源 缺点: - 安装麻烦,用户体验差 - ...
- java-----Long转换为 int , string
int: 1.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 2.先把long转换成字符串String,然后在转行成 ...
- bcc-tools工具之profile
profile是用于追踪程序执行调用流程的工具,类似于perf中的-g指令 相比perf -g而言,profile功能化更加细分,可以根据需要选择追踪层面,例如-U(用户要调用流程) -K (内核态调 ...