[JZOJ5199]Fiend
来源:互联网 发布:置乱 数据 算法 编辑:程序博客网 时间:2024/06/06 07:00
题目大意
给定
你要生成
请判断生成的排列中逆序对个数为奇数的排列多还是偶数的排列多。
一个测试点
题目分析
题目中既有排列又有逆序对个数奇偶性,这启发我们从矩阵行列式入手。
考虑构造一个
但是这题
注意到题目中的矩阵每一行有值的都是一段区间(且值都是
将限制挂在
然后我们从左到右消。假设我们考虑到位置
也就是说我们需要支持若干个集合的取最小值以及合并,使用左偏树就好了。
时间复杂度
代码实现
#include <algorithm>#include <iostream>#include <cassert>#include <cstdio>#include <cctype>#include <queue>using namespace std;const int N=100050;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}int idx[N],rel[N],root[N];int T,n;namespace leftist_tree{ int rank[N],key[N],cid[N]; int son[N][2]; queue<int> avl; void init() { for (;!avl.empty();avl.pop()); for (int i=1;i<=n;++i) root[i]=0,avl.push(i); } int newnode(int val,int id) { int ret=avl.front();avl.pop(); return key[ret]=val,cid[ret]=id,son[ret][0]=son[ret][1]=0,rank[ret]=1,ret; } void release(int x){avl.push(x);} int merge(int x,int y) { if (!x||!y) return x^y; if (key[x]>key[y]) swap(x,y); son[x][1]=merge(son[x][1],y); if (rank[son[x][0]]<rank[son[x][1]]) swap(son[x][0],son[x][1]); rank[x]=rank[son[x][1]]+1; return x; } void push(int &rt,int val,int id){rt=merge(newnode(val,id),rt);} void pop(int &rt,int &key_,int &id_){key_=key[rt],id_=cid[rt],release(rt),rt=merge(son[rt][0],son[rt][1]);}};int main(){ freopen("fiend.in","r",stdin),freopen("fiend.out","w",stdout); for (T=read();T--;putchar('\n')) { n=read(),leftist_tree::init(); for (int i=1,l,r;i<=n;++i) idx[i]=rel[i]=i,l=read(),r=read(),leftist_tree::push(root[l],r,i); int ret=1; for (int i=1;ret&&i<=n;++i) { int key_,id_; for (;root[i]&&leftist_tree::key[root[i]]<i;leftist_tree::pop(root[i],key_,id_)); if (!root[i]) ret=0; else { leftist_tree::pop(root[i],key_,id_); int tmp=idx[id_]; if (tmp!=i) ret*=-1,swap(idx[id_],idx[rel[i]]),swap(rel[i],rel[tmp]); if (key_<n) root[key_+1]=leftist_tree::merge(root[i],root[key_+1]); } } /*for (int i=1;i<=n;++i) cerr<<idx[i]<<' '; cerr<<endl; for (int i=1;i<=n;++i) cerr<<rel[i]<<' '; cerr<<endl; for (int i=1;i<=n;++i) assert(rel[idx[i]]==i);*/ if (ret>0) putchar('Y'); else if (!ret) putchar('D'); else putchar('F'); } fclose(stdin),fclose(stdout); return 0;}
阅读全文
0 0
- [JZOJ5199]Fiend
- Fiend
- Hex Fiend
- Hex Fiend很强大
- Timus 1741. Communication Fiend
- ural 1741 Communication Fiend
- URAL 1741 Communication Fiend
- URAL - 1741 Communication Fiend
- URAL 1741 Communication Fiend dp
- URAL - 1741 - Communication Fiend(dp)
- Hex Fiend – 十六进制编辑 [Mac]
- timus 1741. Communication Fiend URAL 解题报告 DP+读题
- 21、react之 react-native环境搭建
- 【maven】dependency标签理解
- 测试1:Access Point(Wifi)的密码暴力破解
- 给未来的程序员
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询
- [JZOJ5199]Fiend
- Sublime Text 3 全程详细图文原创教程(持续更新中。。。)
- html基础第一天
- how to clone all remote branches in git
- 浏览器的标准模式和怪异模式有什么区别?
- frame 和iframe 的区别以及和frameset 的关系及应用
- Hibernate 缓存策略
- Java接口与抽象类的区别
- python小程序-0004