【CF652C】Foe Pairs(线性扫描)

题意:给你1-n的一个排列和m组数对,问有多少区间不包含任意一个数对。 (1?≤?n,?m?≤?3·105)

思路:数据范围过大,不能用容斥原理

f[i]表示以位置i上的数为左端点,右端点最小到哪里

不包含=总数-包含即可

 1 var f,c:array[1..310000]of int64;
 2     n,m,x,y,t:int64;
 3     i:longint;
 4     ans:int64;
 5
 6 function min(x,y:int64):int64;
 7 begin
 8  if x<y then exit(x);
 9  exit(y);
10 end;
11
12 begin
13  //assign(input,‘cf652C.in‘); reset(input);
14 // assign(output,‘cf652C.out‘); rewrite(output);
15  read(n,m);
16  for i:=1 to n do
17  begin
18   read(x);
19   c[x]:=i; f[i]:=n+1;
20  end;
21  ans:=n*(n+1) div 2;
22  for i:=1 to m do
23  begin
24   read(x,y);
25   if c[x]>c[y] then begin t:=x; x:=y; y:=t; end;
26   f[c[x]]:=min(f[c[x]],c[y]);
27  end;
28  for i:=n-1 downto 1 do f[i]:=min(f[i],f[i+1]);
29  for i:=1 to n-1 do ans:=ans-(n-f[i]+1);
30  writeln(ans);
31 // close(input);
32 // close(output);
33 end.
时间: 2024-10-19 12:00:09

【CF652C】Foe Pairs(线性扫描)的相关文章

[hihocoder 1249 Xiongnu&#39;s Land]线性扫描

2015区域赛北京赛区的三水,当时在赛场上没做出的原因是复杂度分析不正确导致把方法想复杂了.近来复习复杂度分析,觉得不能只是笼统地看渐进复杂度(big-O),更应根据算法的伪码计算真正的以基本操作数为变量的时间复杂度T(n). 题意:在二维坐标系第一象限中,将一块顶点在原点边长为R的正方形土地用直线x=n一分为二,左侧分给Wei,右侧分给Huo. 土地中包含N个绿洲,每个绿洲是一个矩形,其位置和大小用四元组(L,T,W,H)表示,其中(L,T)为其左上方顶点的坐标,W,H为其宽度和高度.绿洲互不

[ An Ac a Day ^_^ ] HihoCoder 1249 Xiongnu&#39;s Land 线性扫描

拿到了icpc北京站的参赛名额 感谢亮哥~ 虽然是地狱之战 但也要全力以赴! 题意: 有一片沙漠 n片绿洲 让你用一条线分成两部分 左≥右 而且分割线要尽量靠右 问线的位置 思路: 网上说可以二分 没太看懂…… 还有一种思路就是线性扫描 将二维的图化成一维的线 然后从头扫一遍 遇到左≥sum/2时试探着向右继续扫 最后输出答案 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #includ

【CF676C】Vasya and String(二分查找,线性扫描尺取法)

题意: 给出一个长度为n的字符串,只有字符'a'和'b'.最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'. 问改变后的最长连续相同字符的字串长度为多少. 首先是二分查找,好想也好写 1 var s:array[0..100000]of longint; 2 ch:ansistring; 3 n,k,i,l,r,mid,last,ans:longint; 4 5 function max(x,y:longint):longint; 6 begin 7 if x>y then exit

线性扫描寄存器分配算法--相关论文

http://cs.au.dk/~mis/dOvs/slides/Kevin-linear-scan-reg-alloc.pdf ftp://ftp.ssw.uni-linz.ac.at/pub/Papers/Moe02.PDF Greedy Register Allocation in LLVM 3.0 http://blog.llvm.org/2011/09/greedy-register-allocation-in-llvm-30.html http://lists.cs.uiuc.edu

75.Sort Colors(法1快排法2线性扫描统计赋值)

Given an array with n objects colored red, white or blue,sort them so that objects of the same color are adjacent, with the colors inthe order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red,white, and blue

UVa 1442 (线性扫描) Cave

对于一个水坑,水平面肯定是相等的.(废话,不然为什么叫水ping面) 因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去. 设h(i)表示向左延伸不会碰到天花板的最高水平面,可以线性从左往右扫描计算出来. 用level标记当前水平面高度,level初始为s[0] 如果p[i] > level,说明水遇到墙壁了,需要把水面提到p[i]上来 如果s[i] < level,说明水遇到天花板了,需要把水面降到s[i]去 否则,他们都在同一个水坑里面,水位高度不变 同理,从右往

线性扫描算法求数组中的最大子序列

在看pat上的题目思考许久,还是久久不能完全实现怎么去求子序列中的首位.先贴出个还有点bug的代码: #include <stdio.h> int main() { int i, size = 0, maxEle = 0, currEle = 0; int currEleStart = 0, currEleEnd = 0; scanf("%d", &size); int arr[size]; for(i = 0; i < size; i++) { scanf(

codeforces 652C Foe Pairs 水题

题意:给你若干个数对,给你一个序列,保证数对中的数都在序列中 对于这个序列,询问有多少个区间,不包含这些数对 分析:然后把这些数对转化成区间,然后对于这些区间排序,然后扫一遍,记录最靠右的左端点就好 这是一场cf edu 然后当时做的时候想都没想就树状数组了,SB了,其实不需要 #include<cstdio> #include<cstring> #include<queue> #include<cstdlib> #include<algorithm&

CodeForces 652C Foe Pairs

只要计算每个位置最多能到哪个位置,累加即可,DP从后往前预处理一下每个位置到达的最远位置. 有坑点:输入的时候如果同一个点出发的,需要保存最小值. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=4*100000+10; int n,m; int a[maxn],b[maxn]; int p[m