LOJ 6131 Fiend - 行列式 - 可并堆 - 贪心
题目大意:给定n个区间,求:∑p(−1)f(p)∏i=1n[pi∈[Li,Ri]],n≤100000\sum_{p}(-1)^{f(p)}\prod_{i=1}^n[p_i\in [L_i,R_i]],\ n\le100000∑p(−1)f(p)∏i=1n[pi∈[Li,Ri]], n≤100000(多组数据XD)
其中p为排列,f§表示p中逆序对数量。
题解:看到这个形式很想行列式,事实上,就是一个矩阵,满足第i行的[Li,Ri]是1,其余是0,的行列式。
直接求是三方的,就saygoodbye了。注意到每一行只有一段连续的1,而我们最后想把他消成只有对角线有值的情况。
然后发现,例如,第一列是1的那些行拿出来,选出一个,用其他的减去这一个;
而选啥是随意的,因此显然选一个右端点最靠左的,这样能保证被减去后还以一行连续的1(或者直接一行都是0),也就是可以维护这个题目的性质(否则破坏了性质还做什么)。这样相当于是这些被减去的行会被放到后面考虑。
这个过程直接维护无论怎么办好像都复杂度不够优秀,因此我们需要一个能够整体把一个东西并到另一个东西上,并且能够取出最小值的数据结构,咦,这个好像就是可并堆啊……因此上左偏树。实现的时候顺便求一下每个右端点是在哪一行方便统计行列式的系数。(其实也就顺便发现这个行列式的权值一定是1,0,-1)如果到某个位置发现堆为空,那么行列式是0;以及每到一个位置先把右端点<当前枚举列的位置的点删去。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 200010
#define gc getchar()
using namespace std;
int node_cnt,val[N],id[N],p[N],lef[N],rig[N],dis[N];
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
inline int new_node(int v,int d)
{int x=++node_cnt;dis[x]=0;val[x]=v,p[id[x]=d]=x;return lef[x]=rig[x]=0,x;
}
int merge_lst(int x,int y)
{if(!x||!y) return x+y;if(val[x]>val[y]) swap(x,y);rig[x]=merge_lst(rig[x],y);if(dis[rig[x]]>dis[lef[x]]) swap(lef[x],rig[x]);if(rig[x]) dis[x]=dis[rig[x]]+1;else dis[x]=0;return x;
}
struct lst{int rt;inline int init() { return rt=0; }inline int merge(const lst &t) { return rt=merge_lst(rt,t.rt); }inline int pop() { return rt=merge_lst(lef[rt],rig[rt]); }inline int topv() { return val[rt]; }inline int topid() { return id[rt]; }inline int empty() { return !rt; }inline int insert(int v,int id) { return rt=merge_lst(rt,new_node(v,id)); }
}t[N];
int main()
{for(int T=inn(),n;T;T--){node_cnt=0,n=inn();for(int i=1;i<=n;i++) t[i].init();for(int i=1,l,r;i<=n;i++)l=inn(),r=inn(),t[l].insert(r,i);int ans=1;for(int i=1,v,d;i<=n;i++){while(!t[i].empty()&&t[i].topv()<i) t[i].pop();if(t[i].empty()) { ans=0;break; }v=t[i].topv(),d=t[i].topid(),t[i].pop();t[v+1].merge(t[i]);if(d^i) ans*=-1,p[id[p[i]]=d]=p[i];}printf("%c\n","FDY"[ans+1]);}return 0;
}
LOJ 6131 Fiend - 行列式 - 可并堆 - 贪心相关推荐
- |Tyvj|NOIP2004|堆|贪心|P1066 合并果子
http://tyvj.cn/p/1066 贪心地先把所有果子放进小根堆,然后取出两个最小值相加后再放进去,在此期间ans+=两个最小值的和,直到只剩1个元素停止 #include<cstdio ...
- P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】
正题 题目链接:https://www.luogu.com.cn/problem/P7990 题目大意 数轴上有kkk个点是草地,每个草地有不同收益,mmm个点是地方的点,现在你要放置nnn个我方的点 ...
- P4989-二进制之谜【堆,贪心】
正题 题目链接:https://www.luogu.org/problemnew/show/P4989 题目大意 一个二进制数两两配对,要求 配对的数不能交叉(用同一个区间但不包含) 0在前1在后 要 ...
- jzoj1082-合并果子【堆,贪心】
题目 有n堆大小不同的果子堆,每次合并两堆消耗它们两堆的重量之和,求把它们全部合并的最小消耗 输入 输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数.第二行包含 ...
- 【洛谷】【堆+贪心】P1484 种树
[题目描述:] cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种 ...
- [堆+贪心] CF596C. Wilbur and Points
CF596C. Wilbur and Points 题意: 太难懂了.有一个平面点集,对集合中任意一点(x,y),满足以原点和(x,y)构成的矩形边上和内部的所有点也都在集合里. 现在要给点标号,为了 ...
- BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心
1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但 ...
- 11.03 P73 模拟+堆+贪心
第二题 问题描述 题解 代码 死亡 问题描述 题解 代码 凝视 问题描述 错的不严格题解 bug 代码 tips 每个测试点时限 1 秒 1 秒 1 秒 内存限制 512MB 512MB 512MB ...
- 145. 超市【小根堆 贪心】
将商品按照时间从小到大排序.如果说此时物品的时间小于堆内的数量.说明堆内有几个物品是要过期的. 那么我们用小根堆来维护,直接取最小的删除即可. #include<bits/stdc++.h> ...
- nssl1477-赛【对顶堆,贪心】
正题 题目大意 nnn个物品,有两个人,每个人有一些喜欢的物品. 选mmm个物品,至少选择kkk个第一个人喜欢的和kkk个第二个人喜欢的物品 解题思路 首先我们必定是选最小的 我们从小到大枚举选择多少 ...
最新文章
- 重磅突发!全球首富40颗卫星遭摧毁
- python 赋值、表达式
- 解决w: pt/sources.list:18 中被配置了多次
- 浙江大学杭州国际科创中心招聘优秀青年人才(机器学习及大数据)
- Netflix如何使用机器学习来提升流媒体质量?
- 数据消费过程_特色鲜卤现捞加盟店经营要如何抓准消费群体定位
- html自动滚屏效果,jQuery实现公告新闻自动滚屏效果实例代码
- python可以和java共存吗_python3 and python2 共存
- php mysql bbs_BBS(php mysql)完整版(二)
- 数据中心规划设计参考-(文章以GB 50174为参考基准)
- lena.bmp素材图像
- 索尼a5100_索尼a5100像素是多少?索尼a5100分辨率是多少?
- 解决Mac谷歌浏览器问题
- html 链接nofollow,ueditor给超链接默认添加rel=nofollow标签
- 微信小说小程序源码-自带采集带安装教程
- 阿里云Centos7服务器域名解析和Nginx配置
- NLP「自然语言处理技术」
- Linux文件权限的更改
- mysql时间格式化到小时_mysql 时间格式化
- sendmail安装使用
热门文章
- 【WinHex篇】WinHex制作特定区域镜像教程
- 线性规划问题之案例1(奶制品的生产与销售)
- 如何做出优雅的过渡效果? Dotween插件的简单介绍及示例代码
- java调用ip138接口查询ip地址,iP查询接口Javascript代码示例 iP地址查询接口Javascript代码示例 iP138查询网...
- python循环中释放内存的方法_我怎样才能在Python中明确释放内存?
- Python游戏编程(五)Tic Tac Toe
- 计算机管理-磁盘管理中进行扩展卷操作,管理磁盘diskpart命令
- 第二章 从优化业务流程谈信息集成的必要性
- 关于用Unity实现校区AR导航毕业设计的建议
- Rstudio永久修改当前工作路径