codeforces 387C George and Number
这道题目的意思是对于每个要删除的数字,向前或向后找到一块连续的数字,而它是其中最小的;
很容易看出对于所有要先删除的数字要从大到小删除;
然后对于每个要删除的字母,要找到比他小的,但是在原数列中又靠它最近的数字;
这样的话,很直观最多只能用lg n的复杂度来处理这个问题;
可以用二分查找,也可以用set来代替;
考虑到前面删除的一些数字不能计算进去,还要一个快速计算区间和的算法,用树状数组和线段树都可以;
不过看到tags,上面写着还可以用dsu(disjoint set union)并查集来做;
感觉挺神奇的,想到了之后再补上!
#include<cstdio>
#include<cstring>
#include<set>
#include<iostream>
#define maxn 1000009
using namespace std;
int n,m;
int pos[maxn];
bool vis[maxn];
long long value[maxn];
set<int>st;
set<int>::iterator it; void add(int x,int v)
{
while(x<=n)
{
value[x]+=v;
x+=x&(-x);
}
} long long sum(int x)
{
long long ret=;
while(x>)
{
ret+=value[x];
x-=x&(-x);
}
return ret;
} int main()
{
int num;
long long ans=;
scanf("%d%d",&n,&m);
st.insert();
st.insert(n+);
for(int i=;i<=n;i++)
{
scanf("%d",&num);
pos[num]=i;
add(i,);
}
for(int i=;i<=m;i++)
{
scanf("%d",&num);
vis[num]=;
}
for(int i=;i<=n;i++)
{
if(vis[i]==)//need be moved
{
it=st.upper_bound(pos[i]);
int r=*it-;
int l=*(--it);
ans+=sum(r)-sum(l);
add(pos[i],-);
}
else
{
st.insert(pos[i]);
}
}
cout<<ans;
}
经过hza大神的指点才明白用并差集的方法来做;
其实这个思路也比较简单。
我们从小到大来顺序来消灭数字的时候,我们总是找到它左右两边比它小的数字;
由于是从小到大的顺序,所以找到的数组只可能是不能被消灭的;
这样的话,就可以把整个数组分成几个小片。
就可以用并差集来处理;
最后从大到小来处理结果;
#include<cstdio>
#include<iostream>
#define maxn 1000006
using namespace std;
int n,m;
int pos[maxn];
bool can[maxn];
int size[maxn];
int f[maxn];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
} void dsu_union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b)return;
f[b]=a;
size[a]+=size[b];
size[b]=;
} void interval_union(int p)
{
if(p>&&!can[p-])
dsu_union(p,p-);
if(p<n&&!can[p+])
dsu_union(p,p+);
} int main()
{
int num,p;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&num);
pos[num]=i;
f[i]=i;
}
for(int i=;i<=m;i++)
{
scanf("%d",&num);
can[pos[num]]=;
}
for(int i=;i<=n;i++)
if(!can[i])
interval_union(i);
long long ans=;
for(int i=n;i>=;i--)
{
p=pos[i];
num=find(p);
size[num]++;
if(!can[p])
ans+=size[num];
else
{
can[p]=;
interval_union(p);
}
}
cout<<ans;
}
codeforces 387C George and Number的更多相关文章
- Codeforces 467C George and Job(DP)
题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...
- dp --- Codeforces 245H :Queries for Number of Palindromes
Queries for Number of Palindromes Problem's Link: http://codeforces.com/problemset/problem/245/H M ...
- Educational Codeforces Round 11 D. Number of Parallelograms 暴力
D. Number of Parallelograms 题目连接: http://www.codeforces.com/contest/660/problem/D Description You ar ...
- Codeforces 980 E. The Number Games
\(>Codeforces \space 980 E. The Number Games<\) 题目大意 : 有一棵点数为 \(n\) 的数,第 \(i\) 个点的点权是 \(2^i\) ...
- Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ...
- codeforces B. George and Round 解题报告
题目链接:http://codeforces.com/contest/387/problem/B 题目意思:给出1-n个问题,以及要满足是good rounde条件下这n个问题分别需要达到的compl ...
- 【codeforces 805D】Minimum number of steps
[题目链接]:http://codeforces.com/contest/805/problem/D [题意] 给你一个字符串; 里面只包括a和b; 让你把里面的"ab"子串全都去 ...
- Codeforces C. Split a Number(贪心大数运算)
题目描述: time limit per test 2 seconds memory limit per test 512 megabytes input standard input output ...
- codeforces 467C.George and Job 解题报告
题目链接:http://codeforces.com/problemset/problem/467/C 题目意思:给出一条含有 n 个数的序列,需要从中找出 k 对,每对长度为 m 的子序列,使得 找 ...
随机推荐
- Java 线程的状态
Java Thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...
- li 水平排列并自动填满 ul
找了li 如何水平排列并自动填满 ul,同时 li 宽度平均?资料,里面有提到"请用js动态计算保证兼容性", 因为我想实现的是,水平滚动条,ul的上级div是固定的宽度1000p ...
- div中的img垂直居中
<html> <head> <style type="text/css"> .imgDiv { overflow: hidden; displa ...
- http请求之referer头与防盗链
在网页中的占用大流量的信息可以写成这个信息在网络上的url位置,这样就会减少本网站的流量,但是其他网站也 不会随意让你使用人家的资源,因为这样的情对人家的网站没有好处,会增加人家网站的流量,所以要防止 ...
- 汉诺塔的问题:4个柱子,如果塔的个数变位a,b,c,d四个,现要将n个圆盘从a全部移到d,移动规则不变
四柱汉诺塔问题的求解程序.解题思路:如a,b,c,d四柱. 要把a柱第n个盘移到目标柱子(d柱),先把上层 分两为两部份,上半部份移到b柱,下半部分移到c柱,再把第n盘移到 目标柱子,然后,c柱盘子再 ...
- 2015年校园招聘12家IT公司面试体验
背景 2015年注定是一个不平凡的年头,作为一个应届毕业生,我也算是经历了工作上的大起大落.下面我先简单讲述一下自己的遭遇,然后根据自己亲身的面试经历,从一个学生的角度去谈谈自己对面试过的公司的一些看 ...
- 第四章 jQuery中的事件
1.加载DOM jQuery中,在$(document).ready()方法内注册的事件,只要DOM就绪就会被执行,此时可能元素的关联文件未下载完. jQuery中的 load()方法,会在元素的on ...
- Google 常用镜像收集
1`下面列出几个目前常用的 公共DNS 服务器地址: 名称 DNS 服务器 IP 地址 OpenerDNS 42.120.21.30 百度 DuDNS 180.76.76.76 阿里 AliD ...
- mysql innodb 数据打捞(三)innodb 簇不连接页的扫描提取(计划)
操作系统簇大小一般是4K,而innoDB的页大小一般是16K,那么就有可能16K的页没有存储在连续的簇中,这样扫描软件就不会扫描出来这样的页面.为了解决这个问题,决定给软件增加半页扫描功能. 在第一次 ...
- InstallShield Custom Dialog
InstallShield 2008 Screen Layout is designed as below. Use toolbox to edit screen layout. 1> Set ...