bzoj 4879 失控的数位板 4881 线段游戏 贪心,瞎搞
[Lydsy1705月赛]失控的数位板
Time Limit: 30 Sec Memory Limit: 256 MB
Submit: 148 Solved: 33
[Submit][Status][Discuss]
Description

Input
Output
Sample Input
........
........
###.####
#......#
#..#####
#.......
up 3
right 7
down 2
left 4
up 3
Sample Output
HINT
[Lydsy1705月赛]线段游戏
Time Limit: 3 Sec Memory Limit: 256 MB
Submit: 322 Solved: 184
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 4 5 3
Sample Output
HINT
Source
题解:对于数控板,对于一个数如果有颜色那么时间一定在其后,
如果本应该有颜色但是现在没颜色了,那么时间一定在其之前。
对于线段的话,
题意可理解为给定一个序列,求将这个序列分成两个上升序列的方案数
先判断是否输出0,方法是用树状数组求最长下降序列,若长度>2,说明无解
然后从左往右扫,将这些数一个一个加到set里,在加入之前,先将set中比当前数大的数全都删掉,
然后将这些数中最大的数加到set中去,最后若set中还剩m个数,答案就是2^m
为什么这样理解,对于小的数当然是随便选,想后面的,加入一个数,如果比当前最大的数大,那么直接加入
否则,必然和前面构成矛盾,将这些数删除,留下最大是因为之后如果不影响的话,必须必当前最大值更大才行。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=1e6+;
int h,w,n,op[M],d[M],nex[][]={-,,,,,,,-},curx,cury;
ll t,L,R;
set<int> sx[M],sy[M];
char s[M];
int getop(char *s){
if(s[]=='u') return ;
if(s[]=='r') return ;
if(s[]=='d') return ;
if(s[]=='l') return ;
}
char ask(int x,int y,bool flag){
if(flag) swap(x,y);
return s[x*w+y];
}
void solve(set<int> &s,int st,int ed,ll tl,int wh,bool flag){
int l=st,r=ed;
if(l>r) swap(l,r);
for(set<int>::iterator it=s.lower_bound(l);it!=s.end()&&*it<=r;){
if(flag) sx[*it].erase(sx[*it].find(wh));
else sy[*it].erase(sy[*it].find(wh));
if(ask(wh,*it,flag)=='#') L=max(L,tl-abs(*it-st));
else R=min(R,tl-abs(*it-st)-);
s.erase(it++);
}
}
int main(){
scanf("%d%d%d",&h,&w,&n);
for(int i=;i<h;i++)
scanf("%s",s+i*w);
for(int i=;i<=n;i++){
char tmp[];
scanf("%s%d",tmp,&d[i]);
op[i]=getop(tmp);
}
for(int i=;i<h;i++)
for(int j=;j<w;j++) sx[i].insert(j);
for(int i=;i<w;i++)
for(int j=;j<h;j++) sy[i].insert(j);
curx=h-;
cury=;
t=;
for(int i=;i<=n;i++){
t+=d[i];
curx+=nex[op[i]][]*d[i];
cury+=nex[op[i]][]*d[i];
}
R=t;
for(int i=n;i;i--){
int tp=(op[i]+)%;
int nx=curx+nex[tp][]*d[i],ny=cury+nex[tp][]*d[i];
if(tp%) solve(sx[curx],cury,ny,t,curx,);
else solve(sy[cury],curx,nx,t,cury,);
t-=d[i];
curx=nx;
cury=ny;
}
for(int i=;i<h&&L<=R;i++){
for(set<int>::iterator it=sx[i].begin();it!=sx[i].end();it++){
if(ask(i,*it,)=='#'){
L=R+;
break;
}
}
}
if(L>R) L=R=-;
printf("%lld %lld\n",L,R);
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <set>
using namespace std;
int n,ans,v[],tr[];
set<int> s;
void updata(int x,int val)
{
for(int i=x;i<=n;i+=i&-i) tr[i]=max(val,tr[i]);
}
int query(int x)
{
int i=x,ret=;
for(i=x;i;i-=i&-i) ret=max(ret,tr[i]);
return ret;
}
int main()
{
scanf("%d",&n);
int i,a,b;
set<int>::iterator it;
for(i=;i<=n;i++) scanf("%d",&v[i]);
for(i=n;i>=;i--)
{
a=query(v[i]-)+;
if(a>=)
{
printf("");
return ; }
updata(v[i],a);
}
for(i=;i<=n;i++)
{
b=v[i];
while(!s.empty())
{
it=s.upper_bound(b);
if(it==s.end()) break;
b=*it,s.erase(b);
}
s.insert(b);
}
b=s.size(),ans=;
while(b--) ans=(ans*)%;
printf("%d",ans);
return ;
}
bzoj 4879 失控的数位板 4881 线段游戏 贪心,瞎搞的更多相关文章
- bzoj 1610: [Usaco2008 Feb]Line连线游戏【瞎搞】
阴沟翻船.jpg 居然忘了除0的情况 枚举两两之间的线,把斜率装起来排个序去个重就好了 真是水的一晚上呢 #include<iostream> #include<cstdio> ...
- bzoj 2563: 阿狸和桃子的游戏 贪心
这个真的好巧妙啊~ 如果只考虑点权的话显然直接按照权值大小排序即可. 但是加入了边权,就有了一个决策的问题. 于是,我们将边权分一半,分给两个端点. 如果一个人拿了两个端点,则边权都会加上. 否则,边 ...
- bzoj 3720 Gty的妹子树 树分块?瞎搞
Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2149 Solved: 781[Submit][Status][Discuss] D ...
- bzoj 3573: [Hnoi2014]米特运输【树形dp+瞎搞】
阅读理解题,题意是以1为根的有根树,每个点有点权,求修改最少点权能使每个点的权值等于其所有子节点权值之和并且每个点的所有子节点权值相等的个数 然后就比较简单了,就是有个技巧是数太大,需要对所有操作都取 ...
- bzoj 5277: [Usaco2018 Open]Out of Sorts【冒泡排序瞎搞】
首先考虑快排的递归什么时候停下,显然是当前段只剩下一个数了,也就是一个数两边出现分隔符 然后再考虑计算冒泡长度这个操作,因为有分割,所以我们可以把这些放到一起冒泡,这和递归每个区间冒泡是等价的 所以答 ...
- BZOJ 4881: [Lydsy2017年5月月赛]线段游戏
4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 164 Solved: 81[Submit][St ...
- BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)
4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 359 Solved: 205[Submit][Stat ...
- #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...
- 【loj6034】「雅礼集训 2017 Day2」线段游戏
#6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 题目描述 ...
随机推荐
- android 界面切换教程
Android的界面切换其实并没有什么难度,就和java的界面切换一样简单,但是java的使用的是Swing框架进行的切换,而Android使用的是Intent 来切换框架的,这是一个全新的使用方法, ...
- C++远征之封装篇(下)-学习笔记
C++远征之封装篇(下) c++封装概述 下半篇依然围绕类 & 对象进行展开 将原本学过的简单元素融合成复杂的新知识点. 对象 + 数据成员 = 对象成员(对象作为数据成员) 对象 + 数组 ...
- BAT批处理
常用命令 查看目录内容命令dir 指定可执行文件搜索目录path 创建目录命令md 打开指定目录命令cd 删除当前指定的子目录命令rd 改变当前盘符命令d: 文件复制命令copy 显示文本文件内容命令 ...
- HyperLedger Fabric 1.4 超级账本简介(5.2)
超级账本(Hyperledger)是推动区块链跨行业应用的开源项目的总称,组织成员可以发起新的区块链项目,加入到超级账本项目(Hyperledger)中,但需要遵循Hyperledger的生命周期. ...
- 插件开发遇到的坑------final 型变量,编译过程被优化
android 插件开发遇到的坑 今天遇到一个坑,pdf 插件,调用了主工程的一个静态final 字符串,但是主工程里面已经没有这个字符串了,却没有崩溃. 后来同事说,因为字符串可能已经直接被写死了. ...
- ORB-SLAM(五)KeyFrame类
KeyFrame类利用Frame类来构造.对于什么样的Frame可以认为是关键帧以及何时需要加入关键帧,是实现在tracking模块中的. 由于KeyFrame中一部分数据会被多个线程访问修改,因此需 ...
- 安装Sql Server 2008时出错
在安装Sql Server 2008的时候,出现一个错误,说是"SQL Server 2005 Express tools"安装了,需要移除,但是我在控制面板里面找了 ...
- 获得通讯录并拨打电话 Android
由于通讯录在手机里是以数据库贮存的 所以我们可以通过getContentResolver来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息, 当然 ...
- Unity3d工具方法小集
1.获取垂直水平方向上的输入: float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = I ...
- 26、js阶段性复习
1.一元运算符 Operator + 可用于将变量转换为数字: <!DOCTYPE html> <html> <body> <p> typeof 操作符 ...