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

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

可以方便地计算出以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. LINUX操作系统(centos6.9)安装与配置

    LINUX操作系统(centos6.9)安装与配置_百度经验 https://jingyan.baidu.com/article/acf728fd6bdba1f8e510a3f7.html cento ...

  2. python文件封装成*.exe文件(单文件和多文件)

    环境:win10 64位  python3.7 单*.py文件打包Python GUI:程序打包为exe 一.安装Pyinstaller,命令pip install Pyinstaller,(大写的P ...

  3. Laravel 5.6 模型关联 user 表后查询 user 表数据只能获取第一条数据,不知道怎么获取第二条

    按照开发手册的说法,肯定是指令不够全,附代码图 如果, tests 是文章表, users 是用户表 test.com/tests/1 是 id 为 1 的文章地址( get 访问) 假如 Tests ...

  4. mac下virtualbox中centos6.5虚拟机实现全屏和调整分辨率

    在visualbox里安装好centos后,发现不能分辨率与原屏幕不一致,很多解决方法是:安装增强包.可是安装增强包后依然达不到效果. 究其原因,原来因为没有安装显卡驱动导致安装了增强包后无法实现分辨 ...

  5. select2 简单解析

    <select name="supplierId" class="customsBrokerSel select2 absOpacity select2-hidde ...

  6. 爬虫 之Requests库的详细使用

    1.什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约我 ...

  7. 集合之ArrayList(含JDK1.8源码分析)

    一.ArrayList的数据结构 ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据.我们对ArrayList类的实例的所有的操作(增删改查等),其底层都 ...

  8. Detected problems with API compatibility(visit g.co/dev/appcompat for more info)

    应用开启了debug模式导致Android 9提示如此,使用release模式即可解决.

  9. WebStorm开发React项目,修代码之后运行的项目不更新

    昨天遇到一个恶心的问题,我新建了一个React.js项目,想做一点关于Pc端的开发,习惯性的用了WebStorm,可是发现一个问题,就是代码修改之后,浏览器上根本不会刷新.然后,我把方向定位在没有正确 ...

  10. Zero to Build: Create new Xamarin apps in minutes with AppMap

    Creating a new Xamarin.Forms app can be an intimidating task, especially if you add in content pages ...