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 上传者: 匿名 题目描述 ...
随机推荐
- 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- python基础之IO模型
IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动 ...
- PHP.40-TP框架商城应用实例-后台15-商品属性与库存量1-不同商品(唯一属性、可选属性),属性类型
思路: 1.不同商品属于不同的类型,如:手机.服装.电脑等类型 2.不同的类型有不同的属性,其中分为唯一属性和可选属性,如服装:可选属性{尺寸:S,M,L……;颜色:白色,黑色……}唯一属性:材质 首 ...
- Git使用之二:下载远程代码到本地指定文件夹
一.前期工作: 1.准备好本地的文件夹 2.如果后期需要继续以该文件夹进行同步的,则需要配置该文件夹,方法请参考之前的 Git使用之一:创建仓储和提交文件 二.用clone(克隆方式下载) 在本地下 ...
- 三种block
block的实现原理是C语言的函数指针. 函数指针即函数在内存中的地址,通过这个地址可以达到调用函数的目的. Block是NSObject的子类,拥有NSObject的所有属性,所以block对象也有 ...
- Java中的原生数据类型
Java中的原生数据类型(Primitive DataType)共有8种: 1)整型: 使用int表示(32位).2)字节型: 使用byte表示(从-128到127之间的256个整数).3)短 ...
- CCF-NOIP-2018 提高组(复赛) 模拟试题(五)
T1 相遇 [问题描述] 在一场奇怪的梦里,小 Y 来到了一个神奇的国度.这个国度可以用一根数轴表示,小 Y 在 N 处,而小 Y 想吃的美食在 K 处.小 Y 有两种方式移动, 一种叫做步行, 一种 ...
- 【java并发编程实战】第六章:线程池
1.线程池 众所周知创建大量线程时代价是非常大的: - 线程的生命周期开销非常大:创建需要时间,导致延迟处理请求,jvm需要分配空间. - 资源消耗:线程需要占用空间,如果线程数大于可用的处理器数量, ...
- 超像素 superpixels 是什么东西
毕业设计要做图像分割 识别什么的. 看论文看到 superpixels 开始脑补是 像素插值算出来的 后来越看越不想,搜索发现根本是另外一回事 http://blog.sina.com.cn/s/b ...
- [org.hibernate.engine.jdbc.spi.SqlExceptionHelper]SQL Error: 1064, SQLState: 42000问题的解决办法
[org.hibernate.engine.jdbc.spi.SqlExceptionHelper]SQL Error: 1064, SQLState: 42000问题的解决办法. 出现这种情况的原因 ...