题意 有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 莫队的更多相关文章

  1. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  2. NBUT 1457 莫队算法 离散化

    Sona Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format: Submit Status Practice NBUT 145 ...

  3. 【填坑向】bzoj2038小Z的袜子 莫队

    学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  5. NPY and girls-HDU5145莫队算法

    Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  6. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  7. Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...

  8. 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)

    2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...

  9. 【BZOJ 2038】【2009 国家集训队】小Z的袜子(hose) 分块+莫队

    $SDOI2016Day-1$临时抱佛脚学习一下莫队算法$233$ 我预感到自己省选要爆0hhh #include<cmath> #include<cstdio> #inclu ...

随机推荐

  1. jquery笔记(效果)

    显示/隐藏: $(selector).hide(speed, function()):隐藏 $(selector).show(speed, function()):隐藏 $(selector).tog ...

  2. list操作 foreach和for的区别

    foreach只是简单的遍历读取,不能在循环中进行remove等操作. for可以

  3. hdu 5727 Necklace dfs+二分图匹配

    Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...

  4. Android自动化测试 - 自动化测试工具比较

  5. #ASP.NET Core 1.0 Key Features

    Cross platform support and flexible runtime engine(跨平台支持和灵活的运行时引擎) ASP.NET Core 1.0 offers support f ...

  6. xampp的Apache无法启动解决方法

    XAMPP Apache 无法启动原因1(缺少VC运行库): 这个就是我遇到的问题原因,下载安装的XAMPP版本是xampp-win32-1.7.7-VC9,而现有的Windows XP系统又没有安装 ...

  7. HDU5772 String problem(最大权闭合子图)

    题目..说了很多东西 官方题解是这么说的: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得分) 第二类:原串中的n个点每个 ...

  8. React组件

    React组件 组件是React中的基本单位,在每个组件里面又封装了程序逻辑,通过reader标出界面片段或者回传一段描述,组件再通过React.renderComponent将组件展示在浏览器中.每 ...

  9. Storm与Spark:谁才是我们的实时处理利器

    Storm与Spark:谁才是我们的实时处理利器 ——实时商务智能目前已经逐步迈入主流,而Storm与Spark开源项目的支持无疑在其中起到了显著的推动作用.那么问题来了:实时处理到底哪家强? 实时商 ...

  10. webpack: require.ensure与require AMD的区别

    http://blog.csdn.net/zhbhun/article/details/46826129