BZOJ 4881: [Lydsy2017年5月月赛]线段游戏
4881: [Lydsy2017年5月月赛]线段游戏
Time Limit: 3 Sec Memory Limit: 256 MB
Submit: 164 Solved: 81
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 4 5 3
Sample Output
HINT
Sourc
想法:
两人取的线段都互不相交,这意味着如果把线段当成点,相交线段连边。那么这张图一定是若干个二分图组成的,否则无解。
于是变成了求连通图个数,用并查集维护一下。如何判掉不是二分图,如果出现三个递减的数,那就不是二分图了。比如3 2 1.
然后细节.....粗心WA了三发。
#include<cstdio> typedef long long ll;
const int len(),MP(),INF(0x7fffffff);
int f[len+];
int suc[len+],suc_m[len+],ans,n,p[len+],much[len+];
void umin(int &a,int b){if(a>b)a=b;}
void umax(int &a,int b){if(a<b)a=b;}
void put(int x){for(int y=x;y;y-=y&(-y))umin(suc[y],x);}
int query(int x){int sum=INF;for(;x<=n;x+=x&(-x))umin(sum,suc[x]);return sum;}
void put_m(int x){for(int y=x;y;y-=y&(-y))umax(suc_m[y],much[x]);}
int query_m(int x){int sum=;for(;x<=n;x+=x&(-x))umax(sum,suc_m[x]);return sum;}
int power(int a,int b)
{
ll t=,y=a;
for(;b;b>>=)
{
if(b&)t=t*y%MP;
y=y*y%MP;
}
return t;
}
int gf(int x)
{
int v=x;while(v!=f[v])v=f[v];
for(int o;x!=v;x=o)o=f[x],f[x]=v;
return v;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)suc[i]=INF,f[i]=i;
for(int i=;i<=n;i++)scanf("%d",p+i);
ans=n;
for(int i=,last,now;i<=n;i++)
{
last=query(p[i]); put(p[i]);
much[p[i]]=+query_m(p[i]);
put_m(p[i]);
if(last==INF)continue;
else
{
now=p[i];
last=gf(last);
while(last!=INF)
{
f[now]=last; ans--;
now=last; if(now==n)break;
last=query(last+);
}
}
}
ans=power(,ans);
for(int i=;i<=n;i++)if(much[i]>=)ans=;
printf("%d\n",ans);
return ;
}
BZOJ 4881: [Lydsy2017年5月月赛]线段游戏的更多相关文章
- [bzoj4881][Lydsy2017年5月月赛]线段游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...
- 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...
- bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT
4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec Memory Limit: 128 MB Description 定义二元运算 opt 满足 现在给定一 ...
- bzoj 4885: [Lydsy2017年5月月赛]长方体
Description 给定一个a*b*c的长方体,定义其表面上两个点的距离为沿着长方体的表面走的最短路径的长度,请找到距离最远的点对,你需要保证找到的两个点里至少有一个是长方体顶点. Input 第 ...
- BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...
- BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...
- 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)
4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 275 Solved: 87 Descripti ...
- [补档][Lydsy2017年4月月赛]抵制克苏恩
[Lydsy2017年4月月赛]抵制克苏恩 题目 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平. 如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一 ...
- 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望
[BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...
随机推荐
- 双击jar不能运行的解决方法
1.问题描述 使用eclipse导出jar.双击jar文件弹出一个内容为“a java exception has occurred”的错误警告提示! 但是在命令行用 java -jar Em ...
- 建立JNI层的本地对象,并与JAVA层交互方法
最近在做OpenCV4Android开发的时候,需要从摄像头捕获多个图片,传值给本地对象,每次捕获到图片都更新数据,最后将计算得到的数据传给JAVA层,并在界面中显示.经过摸索和调试后,找到了通过本地 ...
- WPF后台修改内容界面不显示问题
通知3部曲:1.Model继承并实现 INotifyPropertyChanged 接口:2.数据集合使用ObservableCollection<T>集合:3.View使用Binding ...
- 函数PARSENAME使用和截取字符串
MS SQL server有一个函数PARSENAME ( 'object_name' , object_piece ). 函数有2个参数: Object_name 检索的对象名称.即是:服务器名.数 ...
- springboot 启动
1. 新建一个java 类,名为Application,代码内容: @ServletComponentScan@SpringBootApplicationpublic class Applicatio ...
- luogu 1169 棋盘制作(单调栈/悬线)
luogu 1169 棋盘制作(单调栈/悬线) 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应 ...
- IT兄弟连 JavaWeb教程 使用AJAX发送POST请求并获取响应
POST请求用于向服务器发送应该被保存的数据,因此POST请求天然比GET请求多需要一份需要被保存的数据.那么这些数据应该放在何处呢?毕竟,我们的open()方法接收的三个参数都没有合适的位置. 答案 ...
- Domination
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ , f ...
- CC36:平分的直线
题目 在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分.假定正方形的上下两条边与x轴平行. 给定两个vecotrA和B,分别为两个正方形的四个顶点.请返回一个vector,代表所求 ...
- 详解javascript中的this对象
详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...