考虑计算每个位置的数作为最小值时有多少种情况

方便起见,以位置为第二关键字比较大小,这样就不会出现“相同的”数

可以方便地计算出以i位置为最小值的区间端点的可行位置:[A,i],[i,B]

这是我选的一个区间,那么另一个区间会有两种情况:在[A,B]的范围内或者不在

不妨只考虑另一个区间在i这个区间的右边的情况,设这另一个区间是[l,r]

这种时候第一个区间的左端点是在[A,i]随便选的

第一种情况:

  如果l<=B,那么r显然也<=B,所以i<=第一个区间的右端点<l<=r<=B,发现方案数只与[i,B]这个区间的长度有关,可以由公式算出,或者是提前预处理推出

第二种情况:

  如果l>B,我还要保证[l,r]内的所有数都大于a[i],这种情况和第一个区间绝对不相交,所以第一个区间的右端点也可以随便选。可以用树状数组维护左端点>x的可选的区间个数

那么我可以按照数字从大到小做,给每个位置维护一个并查集,表示从这个点可延伸出的最远的端点(在这个范围内的数都>=now)

这样,A和B也就顺便算出来了

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=2e5+,P=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,l[maxn],r[maxn],a[maxn],ori[maxn];
int stk[maxn],sh,rnk[maxn],tr[][maxn];
pa tmp[maxn];
struct Node{
int f,l,r;
}nd[maxn];
vector<int> pos[maxn];
int ans,c3[maxn];
bool flag[maxn]; inline int lowbit(int x){return x&(-x);}
inline void add(int i,int x,int y){
for(;x<=N;x+=lowbit(x)) tr[i][x]+=y,tr[i][x]%=P;
}
inline int query(int i,int x){
int re=;for(;x;x-=lowbit(x)) re+=tr[i][x],re%=P;return re;
} inline int getf(int x){return x==nd[x].f?x:nd[x].f=getf(nd[x].f);} inline void change(int l,int r,int d){
int n=1ll*(r-l+)*(r-l+)/%P;
add(,l,d*n),add(,r,d*n);
} inline void uni(int x){
flag[x]=;nd[x].l=nd[x].r=x;
int a=,b=;
if(flag[x-]) a=getf(x-);
if(flag[x+]) b=getf(x+);
if(a){
nd[a].f=x;
change(nd[a].l,nd[a].r,-);
nd[x].l=nd[a].l;
}if(b){
nd[b].f=x;
change(nd[b].l,nd[b].r,-);
nd[x].r=nd[b].r;
}
change(nd[x].l,nd[x].r,);
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
c3[]=;
for(i=;i<=N;i++) c3[i]=(c3[i-]+1ll*i*(i-)/)%P;
for(i=;i<=N;i++) ori[i]=a[i]=rd(),tmp[i]=MP(a[i],i),r[i]=N,l[i]=;
sort(tmp+,tmp+N+);
for(i=;i<=N;i++)
a[i]=lower_bound(tmp+,tmp+N,MP(a[i],i))-tmp,pos[a[i]].push_back(i);
for(i=;i<=N;i++) nd[i].f=i; for(i=N;i;i--){
int x=tmp[i].second;
uni(x);
int f=getf(x),l=nd[f].l,r=nd[f].r;
ans+=1ll*(x-l+)*(c3[r-x+]+1ll*(r-x+)*(query(,N)-query(,r+))%P)%P*ori[x]%P,ans%=P;
ans+=1ll*(r-x+)*(c3[x-l+]+1ll*(x-l+)*query(,l-)%P)%P*ori[x]%P,ans%=P;
} printf("%d\n",(ans+P)%P);
return ;
}

noiac26 T1 (并查集)的更多相关文章

  1. NOIP2017 Day2 T1 奶酪(并查集)

    题目描述 现有一块大奶酪,它的高度为 hhh ,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z=0z ...

  2. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  3. HDU 1232 并查集/dfs

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...

  4. 洛谷 P2661 信息传递 Label:并查集||强联通分量

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  5. 图论&数据结构——并查集

    Wikioi 4246 NOIP模拟赛Day2T1 奶牛的身高  题目描述 Description 奶牛们在FJ的养育下茁壮成长.这天,FJ给了奶牛Bessie一个任务,去看看每个奶牛场中若干只奶牛的 ...

  6. POJ 1456 Supermarket 区间问题并查集||贪心

    F - Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  7. POJ 2492 并查集扩展(判断同性恋问题)

    G - A Bug's Life Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  8. HDOJ 1272 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  9. HDOJ并查集题目 HDOJ 1213 HDOJ 1242

    Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. ...

随机推荐

  1. PAT L3-016 二叉搜索树的结构

    https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192 二叉搜索树或者是一棵空树,或者是具有下列性质 ...

  2. 社交CRM SCRM

    社交CRM - 国际版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E7%A4%BE%E4%BA%A4CRM 社交CRM ...

  3. JAVAString初始化的引用问题

    1 String a="Hello JAVA"; 2 3 String b=a; 4 5 System.out.println(a); 6 7 System.out.println ...

  4. 使用docker化的nginx 反向代理 docker化的GSCloud 的方法

    1. 首先将nginx 的image pull 下来. docker pull nginx 2. 将最近的可用的 参数文件 复制过来当一个目录 mkdir /nginx ssh root@linuxs ...

  5. easyUI 数据表格datagrid的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. JavaScript lastIndexOf() 方法

    <script type="text/javascript"> var str="0000.0000.0000.0000.0000.0000.0000.&qu ...

  7. WPF程序中App.Config文件的读与写

    WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...

  8. MyBatis基础:MyBatis动态SQL(3)

    1. 概述 MyBatis中动态SQL包括元素: 元素 作用 备注 if 判断语句 单条件分支判断 choose(when.otherwise) 相当于Java中的case when语句 多条件分支判 ...

  9. JS--dom对象:document object model文档对象模型

    dom对象:document object model文档对象模型 文档:超文本标记文档 html xml 对象:提供了属性和方法 模型:使用属性和方法操作超文本标记性文档 可以使用js里面的DOM提 ...

  10. html class选择器与id选择器

    class选择器: <p class="p1"> .p1{ color:red; ..... } id选择器: <p id="p2"> ...