该oj是qsc自己写的比赛,友情链接:http://qscoj.cn/

喵哈哈村的排队

发布时间: 2017年2月26日 16:13   最后更新: 2017年2月26日 16:14   时间限制: 1000ms   内存限制: 128M

描述

有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为1的村民站在最后面,标号为n的村民站在队列的最前面,而且每个村民都拥有一个智商值a[i]。

这些村民有时候会觉得不开心,因为他们觉得凭什么一个智商比他低的人,可以站在他的前面!现在对于每个村民,他们都想知道,在他前面,智商比他低,离他最远的距离是多少。

输入

第一行n,表示有n只咸鱼
第二行n个整数,表示每个村民的智商值a[i].
n<=200000 1<=a[i]<=1000000000

输出

对于每个村民,输出智商比他的,且离他最远的距离是多少,如果没有输出-1

样例输入1 复制

6
10 8 5 3 50 45
样例输出1

2 1 0 -1 0 -1

  原本是水题来着,2333想七想八搞了个贪心+权值线段树+并查集,然后。。WA。贪心的策略根本不对好久才发现。最近真的是第K大做多了,思维同化。以下是WA代码给自己的提醒。
 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
struct segtree
{
int val,num,l,r;
}tree[];
int a[],num[],fa[],afront[],n,m,l,r,k,rnu;
void init(int i,int l,int r);
void update(int i,int num);
int query(int i,int num);
int findpos(int i,int big);
int findposd(int num,int l,int r);
int Find(int i);
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
clr(tree);
clr(afront);
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
memcpy(a,num,sizeof(num));
sort(a+,a+n+);
for(int i=;i<=n;i++)
fa[i]=i;
rnu=unique(a+,a+n+)-a-;
init(,,rnu);
for(int i=n;i>=;i--)
{
k=query(,num[i]);
if(k!=)
{
l=findpos(,k);
// printf("%d %d\n",k,l);
fa[i]=Find(afront[l]);
}
afront[findposd(num[i],,rnu)]=i;
update(,num[i]);
}
for(int i=;i<=n;i++)
{
if(num[Find(i)]!=num[i])
printf("%d ",Find(i)-i-);
else
printf("-1 ");
}
printf("\n");
}
return ;
}
void init(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].val=a[r];
if(l==r)
return ;
int mid=(l+r)>>;
init(i<<,l,mid);
init((i<<)|,mid+,r);
return ;
}
void update(int i,int num)
{
tree[i].num++;
if(tree[i].l==tree[i].r)
return ;
if(tree[i<<].val>=num)
update(i<<,num);
else
update((i<<)|,num);
return ;
}
int query(int i,int num)
{
if(tree[i].val<=num)
return tree[i].num;
else
{
if(tree[i<<].val<num)
return query(i<<,num)+query((i<<)|,num);
else
return query(i<<,num);
}
}
int findpos(int i,int big)
{
if(tree[i].l==tree[i].r)
return tree[i].l;
if(tree[i<<].num>=big)
return findpos(i<<,big);
else
return findpos((i<<)|,big-tree[i<<].num);
}
int findposd(int num,int l,int r)
{
if(l==r)
return l;
int mid=(l+r)>>;
if(a[mid]>num)
return findposd(num,l,mid-);
if(a[mid]<num)
return findposd(num,mid+,r);
return mid;
}
int Find(int i)
{
if(fa[i]!=i)
fa[i]=Find(fa[i]);
return fa[i];
}

  然后真AC代码,及题解:

  一个无脑的做法:对于每个人进行二分,二分之后用线段树取区间最小值或者一个其他的数据结构去维护就好了。

  但实际上有其他的做法:

 #include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAX 200002
using namespace std; int a[MAX],ans[MAX];
vector<int> v,num; int main()
{
int n;
while(~scanf("%d",&n)){
for(int i=;i<n;i++) scanf("%d",&a[i]);
v.clear();
num.clear();
for(int i=n-;i>=;i--){
if(v.size()== || v.back()>=a[i]){
v.push_back(a[i]); num.push_back(i);
ans[i]=-;
}else{
int j = (lower_bound(v.rbegin(),v.rend(),a[i]) - v.rbegin());
j = (int)v.size() - j - ;
ans[i] = num[j+] - i - ;
}
}
for(int i=;i<n;i++){
if(i) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
return ;
}

真题解

qsc round#2 喵哈哈村的排队(本辣鸡想七想八的,特写此博文给自己一个提醒)的更多相关文章

  1. qsc oj-17 喵哈哈村的排队

    http://qscoj.cn/problem/17/ 喵哈哈村的排队 描述 有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为1的村民站在最后面,标号为n的村民站在队列的最前面,而且每个 ...

  2. bzoj2141排队(辣鸡但是好写的方法)

    题意很明确,也非常经典: 一个支持查询 区间中比k大的数的个数 并且支持单点修改的序列 ——因为题意可以转化为:查询这两个数中比后者大的个数.比后者小的个数.比前者大的个数.比前者小的个数(根据这4个 ...

  3. 喵哈哈村的魔法考试 Round #2 (Div.2) 题解

    喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...

  4. 喵哈哈村的魔法考试 Round #7 (Div.2) 题解

    喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...

  5. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解

    喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...

  6. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  7. 喵哈哈村的魔法考试 Round #20 (Div.2) 题解

    题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...

  8. 喵哈哈村的魔法考试 Round #19 (Div.2) 题解

    题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...

  9. 喵哈哈村的魔法考试 Round #18 (Div.2) 题解

    喵哈哈村的古怪石碑(一) 题解:暴力check一下是等比数列还是等差数列,然后输出答案即可.注意如果数据范围是1e9的话,就要快速幂了. 代码: #include <cstdio> #in ...

随机推荐

  1. 【BZOJ】1610: [Usaco2008 Feb]Line连线游戏

    [算法]计算几何 [题解]计算所有斜率排序去重. 实数判断相等用fabs(...)≤eps. ★斜率题一定要注意斜率不存在的情况!!! 其实我觉得这份代码可以hack的…… #include<c ...

  2. 【洛谷 P2042】 [NOI2005]维护数列(自闭记第一期)

    题目链接 首先,这题我是没A的..太毒瘤了 题目本身不难,都是\(Splay\)的基操,但是细节真的容易挂. 调了好久自闭了,果断放弃.. 希望本节目停更. 放上最终版本 #include <c ...

  3. oracle scott用户不存在

    scott用户拥有一些基础的数据表,可以供我们练习sql.先执行 alter user scott account unlock; 查看scott用户是否存在 当scott用户不存在,我们就需要在$O ...

  4. hdu 1556(线段树之扫描线)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...

  5. 关于RecylerView:1.在ScrollView的RecylerView滑动事件的处理。2.item之间的距离 小数取整

    1.在ScrollView的RecylerView滑动事件的处理. 在布局文件中在RecylerView外包裹一层相对布局 2.RecylerView item之间的距离 (1)编写SpaceItem ...

  6. 模型验证与模型集成(Ensemble)

    作者:吴晓军 原文:https://zhuanlan.zhihu.com/p/27424282 模型验证(Validation) 在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证 ...

  7. 使用EL表达式需要注意的

    1.表达式与Java无关,表达式都是以${开始,以}结束. 2.EL访问java变量不能直接访问,因为得不到数据,要访问数据,需要将其放到作用域中.而使用<%=java变量%>可以访问ja ...

  8. aptitude约等于apt-get的工具

    如题,与之不同的是其会将依赖的程序也给删除. https://baike.baidu.com/item/aptitude/6849487?fr=aladdin 以下是一些常用 aptitude命令,仅 ...

  9. 【转】cve-2013-2094 perf_event_open 漏洞分析

    cve-2013-2094是于2013年4月前后发现的linux kernel本地漏洞,该漏洞影响3.8.9之前开启了PERF_EVENT的linux系统.利用该漏洞,通过perf_event_ope ...

  10. 5-3 Linux内核计时、延时函数与内核定时器【转】

    转自:http://www.xuebuyuan.com/510594.html 5-3 Linux内核计时.延时函数与内核定时器 计时 1. 内核时钟 1.1   内核通过定时器(timer)中断来跟 ...