HDU 5200 脑洞题 离线
线段树,TLE,各种。唉。。。。我真是笨死了。。。。
我用的线段树是记录左右区间最长连续棵数的。。。反正TLE
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int N=50050;
struct Q{
int val,index;
}Que[N];
int SegT[N*4],L[N*4],R[N*4],C[N*4];
int TreeH[N];
int ans[N];
bool cmp(Q a,Q b){
if(a.val<b.val) return true;
return false;
} void build(int l,int r,int rt){
L[rt]=R[rt]=r-l+1;C[rt]=1;
if(l==r){
SegT[rt]=TreeH[l];
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
SegT[rt]=max(SegT[rt<<1],SegT[rt<<1|1]);
} void slove(int l,int r,int rt,int hv){
if(l==r){
return ;
}
int m=(l+r)>>1;
if(hv>=SegT[rt<<1])
L[rt<<1]=R[rt<<1]=C[rt<<1]=0;
else
slove(l,m,rt<<1,hv);
if(hv>=SegT[rt<<1|1]) L[rt<<1|1]=R[rt<<1|1]=C[rt<<1|1]=0;
else
slove(m+1,r,rt<<1|1,hv);
L[rt]=L[rt<<1],R[rt]=R[rt<<1|1];
if(L[rt<<1]>=m-l+1) L[rt]+=L[rt<<1|1];
if(R[rt<<1|1]>=r-m) R[rt]+=R[rt<<1];
C[rt]=C[rt<<1]+C[rt<<1|1];
if(R[rt<<1]&&L[rt<<1|1]&&C[rt]) C[rt]--;
} void readint1(int i) {
TreeH[i]=0;
char ch;
ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){
TreeH[i]=TreeH[i]*10+ch-'0';
ch=getchar();
}
} int readint2(){
int x=0;
char ch;
ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x;
} int main(){
int n,q;
while(scanf("%d%d",&n,&q)!=EOF){
memset(ans,0,sizeof(int)*n);
for(int i=1;i<=n;i++)
readint1(i);
build(1,n,1);
for(int i=0;i<q;i++){
Que[i].val=readint2();
Que[i].index=i;
}
sort(Que,Que+q,cmp);
for(int i=0;i<q;i++){
if(Que[i].val>=SegT[1]){
ans[Que[i].index]=0;
}
else{
slove(1,n,1,Que[i].val);
ans[Que[i].index]=C[1];
}
}
for(int i =0;i<q;i++)
printf("%d\n",ans[i]);
}
return 0;
}
这个是看了别人之后的解法,漂亮啊。。。
把树排序,把询问排序,都按高度。两个指针扫描,对于不高于询问高度的树,对其原本的位置,若左右均未砍去,则段数+1,若均砍去,则段数-1,除此外,段数不变。
再感叹一下,漂亮啊。。。。T_T
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std;
const int N=50050; struct TH{
int height,index;
}Tree[N],Que[N];
bool vis[N];
int n,q,ans[N];
bool cmp(TH a,TH b){
if(a.height<b.height) return true;
return false;
} void work(int &c,int index){
if(index==0){
if(vis[index+1]) c--;
}
else if(index==n-1){
if(vis[index-1]) c--;
}
else{
if(!vis[index+1]&&!vis[index-1]) c++;
else if(vis[index+1]&&vis[index-1]){
c--;
}
}
} int main(){
while(scanf("%d%d",&n,&q)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&Tree[i].height);
Tree[i].index=i;
}
sort(Tree,Tree+n,cmp);
for(int i=0;i<q;i++){
scanf("%d",&Que[i].height);
Que[i].index=i;
}
sort(Que,Que+q,cmp);
memset(vis,false,sizeof(vis));
int ct=0;
int counts=1;
for(int i=0;i<q;i++){
for(;ct<n;ct++){
if(Tree[ct].height>Que[i].height) break;
vis[Tree[ct].index]=true;
work(counts,Tree[ct].index);
}
ans[Que[i].index]=counts;
}
for(int i=0;i<q;i++)
printf("%d\n",ans[i]);
}
return 0;
}
HDU 5200 脑洞题 离线的更多相关文章
- hdu 5200 Trees [ 排序 离线 2指针 ]
传送门 Trees Accepts: 156 Submissions: 533 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...
- 图论(KM算法,脑洞题):HNOI 2014 画框(frame)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABPoAAANFCAIAAABtIwXVAAAgAElEQVR4nOydeVxTV/r/n9ertaJEC4
- HDU-1042-N!(Java大法好 && HDU大数水题)
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...
- hdu 2586 How far away?(LCA模板题+离线tarjan算法)
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
Portal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU 4630 No Pain No Game(2013多校3 1010题 离线处理+树状数组求最值)
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 5976 Detachment 脑洞题 猜结论
题目链接 题意 将\(x\)拆成\(a_1+a_2+...+\)的形式,且\(a_1\lt a_2\lt...\),使得\(a_1*a_2*...\)取到最大值 思路 大胆猜结论. 首先拆分的形式中肯 ...
- HDU 5200 Trees 二分
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5200 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...
随机推荐
- Scaffold-DbContext-EFCore DB First
在使用 Scaffold-DbContext迁移数据库的时候会遇到两个问题. 一.文件已存在,其实报错很明显,增加 -force即可. 二.大小写转换,不和数据库一样了,如果要保持和数据库一致.增加 ...
- [转]linux下ulimit命令详解
转自:http://blog.chinaunix.net/uid-23842323-id-2656582.html 1,说明:ulimit用于shell启动进程所占用的资源.2,类别:shell内建命 ...
- iOS - UITableView 多选功能实现
:自定义Cell中的代码 #import <UIKit/UIKit.h> @interface TestCell : UITableViewCell @property(nonatomic ...
- Ajax——异步基础知识(二)
XML数据格式 首行必须是版本号和格式等信息 <?xml version="1.0" encoding="utf-8" ?> 最外层需要一个根节点进 ...
- JavaScript的基础数据类型和表达式
Java Script的基础数据类型和表达式 基本的数据类型: number(数值)类型:可分为整数和浮点数 string(字符)类型:是用单引号“'”或者双引号“"”来说明的. boole ...
- (转)OGNL与值栈
http://blog.csdn.net/yerenyuan_pku/article/details/67709693 OGNL的概述 什么是OGNL 据度娘所说: OGNL是Object-Graph ...
- iview表单密码自定义验证
From中定义 ref="passwordForm" 获取dom节点 :model="passwordForm" 关联表单数据对象 :rules=&quo ...
- Excel 导入 分批导入
tm.begin(); sm.begin(); try { result = excel.readE(headKeyV,path); for (int index = 1; index < re ...
- 线索二叉树【C语言】
#include<stdio.h> #include<stdlib.h> typedef char ElemType; typedef enum{Link,Thread} Po ...
- 优化JAVA查询Mongodb数量过大,查询熟读慢的方法
前言:2018年的时候优化了一个项目,该项目从MOngodb中获取数据的时候一次去十万百万千万的数据过慢,往往每次都要二十秒,三十秒,今天提出了一个代码优化的方案 项目查从mongodb中获取数据:代 ...