URAL 2080 莫队
题意 有m种卡 给出卡的使用序列 要求每次从卡堆的顶部抽一张出来 刚好符合序列 输出初始 卡堆的排序 再输出每次抽出卡用后 卡插回卡堆的时候 这张卡上面有几张卡
初始排序很容易就可以搞出来 但是需要注意的是 如果我有三种卡 而我只用了第一种 在输出卡堆里 仍然要输出没有用到的2和3
可以想到 既然每张卡都只有一种 那么 由这种规则来看 如果一张卡被抽出之后 接下来还要用 它插回去的位置上面 必须有在这个过程之中 要用的别的卡 很容易的就想到 插回去 上面有几张卡 取决于这次用这张卡和下次用这张卡之间有几种卡 有一种 插回去的位置上面就有几个 如果用了这张卡之后不会再用到了 那就无脑的插到卡堆的最下 即m-1
关于一张卡的两个相邻使用位置 用莫队来搞就好 n是1e5 抽象出来的询问也不到1e5 复杂度还是过的去的 需要注意的是 询问id是该询问的L
其实如果想到了插回取决于什么..就是一道莫队水题了..然而被初始卡堆的输出trick到了..orz 我的绝杀...
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<math.h>
using namespace std;
struct node
{
int l,r,id;
};
int q[100050];
int a[100050];
int pl[100050];
int ans[100050];
node xw[100050];
int pos[100050];
vector<int >v[100050];
int cmp(node a,node b)
{
if(pos[a.l]==pos[b.l])
return a.r<b.r;
return a.l<b.l;
}
int an;
void add(int x)
{
int z = a[x];
if(q[z]==0)
an++;
q[z]++;
}
void del(int x)
{
int z= a[x];
if(q[z]==1)
an--;
q[z]--;
}
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
for(int i=1; i<=m; i++)q[i]=0;
for(int i=1; i<=m; i++)
v[i].clear();
int sz=sqrt(n);
for(int i =1; i<=n; i++)
scanf("%d",&a[i]);
int cnt = 0;
for(int i =1; i<=n; i++)
{
pos[i]=i/sz;
v[a[i]].push_back(i);
if(q[a[i]]==0)
{
pl[++cnt]=a[i];
q[a[i]]++;
}
}
for(int i = 1; i<= m ;i++)
{
if(q[i]==0)
{
pl[++cnt]=i;
q[i]++;
}
}
int res=0;
for(int i=1; i<=m; i++)
{
int siz=v[i].size();
for(int j=0; j<siz; j++)
{
if(j+1==siz)
{
xw[++res].l=-1;
xw[res].r=-1;
}
else
{
xw[++res].l=v[i][j];
xw[res].r=v[i][j+1];
}
xw[res].id=v[i][j];
}
}
sort(xw+1,xw+1+n,cmp);
int l = 1;
int r = 0;
an = 0;
for(int i=1; i<=m; i++)q[i]=0;
for(int i = 1; i<=n; i++)
{
if(xw[i].l==-1)
{
ans[xw[i].id]=m-1;
continue;
}
while(l<xw[i].l)
{
del(l);
l++;
}
while(l>xw[i].l)
{
l--;
add(l);
}
while(r>xw[i].r)
{
del(r);
r--;
}
while(r<xw[i].r)
{
r++;
add(r);
}
ans[xw[i].id]=an-1;
}
for(int i = 1; i<=cnt; i++)
{
printf("%d",pl[i]);
if(i==cnt)
printf("\n");
else printf(" ");
}
for(int i = 1; i<=n; i++)
{
printf("%d\n",ans[i]);
}
}
}
URAL 2080 莫队的更多相关文章
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- NBUT 1457 莫队算法 离散化
Sona Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: Submit Status Practice NBUT 145 ...
- 【填坑向】bzoj2038小Z的袜子 莫队
学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- NPY and girls-HDU5145莫队算法
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- Codeforces617 E . XOR and Favorite Number(莫队算法)
XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...
- Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...
- 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)
2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...
- 【BZOJ 2038】【2009 国家集训队】小Z的袜子(hose) 分块+莫队
$SDOI2016Day-1$临时抱佛脚学习一下莫队算法$233$ 我预感到自己省选要爆0hhh #include<cmath> #include<cstdio> #inclu ...
随机推荐
- css3 -- 渐变
1.Firefox中的线性渐变 E{ background-image:-moz-linear-gradient(point or angle , form-stop, color-stop, to- ...
- 学习 Message(5): 关于 TApplicationEvents.OnMessage 的第二个参数 可以屏蔽 TWebBrowser右键菜单:
http://www.cnblogs.com/del/archive/2008/10/25/1319318.html TApplicationEvents.OnMessage 的第二个参数 Handl ...
- json时间格式化问题
function jsonDateFormat(jsonDate) {//json日期格式转换为正常格式 try { var date = new Date(parseInt(jsonDate.rep ...
- Shell 编程基础之 Until 练习
一.语法 until [ condition ] # 和while相反,当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段 do #执行内容 done 二.练习 输入用户输入 ...
- Money类型转化为String去除小数点后0解决方法
Money类型转化为String去除小数点后0从数据库提取Money类型后,字符串如:1212.0000 如何使其成为1212 注:去掉了小数点 如果是:1212.0100 使 ...
- Android开发环境变量配置总结
每次重装系统或者拿到一台新电脑都得重配Android的环境变量,每次都得上网查,索性就记在这儿吧. “系统属性->高级系统设置->环境变量” 打开环境变量配置窗口. JDK配置: 新建JA ...
- unity 解析tmx 2
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; usin ...
- android service 如何弹出dialog
在service中弹出toast,需要使用handler, handler.post(new Runnable() { @Override public void run() { Toast.make ...
- 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明
13:40 2015/11/20 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明 关键点:现在qq邮箱开通smtp服务后会给你一个很长的独立新密码,发邮件配置中的密码需要 ...
- canvas基础之旅
canvas 主要使用2D rendering context API 实现其功能和特效. canvas 一般浏览器都支持,但在ie9之前的是不支持的.(解决办法:添加IxplorerCanvas ...