noiac26 T1 (并查集)
考虑计算每个位置的数作为最小值时有多少种情况
方便起见,以位置为第二关键字比较大小,这样就不会出现“相同的”数
可以方便地计算出以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 (并查集)的更多相关文章
- NOIP2017 Day2 T1 奶酪(并查集)
题目描述 现有一块大奶酪,它的高度为 hhh ,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z=0z ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- HDU 1232 并查集/dfs
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...
- 洛谷 P2661 信息传递 Label:并查集||强联通分量
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 图论&数据结构——并查集
Wikioi 4246 NOIP模拟赛Day2T1 奶牛的身高 题目描述 Description 奶牛们在FJ的养育下茁壮成长.这天,FJ给了奶牛Bessie一个任务,去看看每个奶牛场中若干只奶牛的 ...
- POJ 1456 Supermarket 区间问题并查集||贪心
F - Supermarket Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- HDOJ 1272 并查集
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDOJ并查集题目 HDOJ 1213 HDOJ 1242
Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. ...
随机推荐
- MYSQL行号
mysql 实现行号的方法——如何获取当前记录所在行号 - senly - 博客园http://www.cnblogs.com/xinlei/archive/2011/12/16/2290349.ht ...
- Windows10下安装VMware虚拟机并搭建CentOS系统环境
转载: http://blog.51cto.com/10085711/2069270 操作系统 Windows 10专业版(64位) VMware虚拟机 产品:VMware® Workstation ...
- 移动端和PC端页面常用的弹出层
我们在页面的时候,很多时候用到了弹出层,消息提醒,确认框等等,统一样式的弹出框可以使页面更加优美.在此,我整理一下我们项目的移动端和PC端页面常用的弹出层. 一.移动端 我们需在页面引入弹出框的样式和 ...
- CMake--常用指令
1 . ADD_DEFINITIONS 向 C/C++ 编译器添加 -D 定义,比如 在CMakeList.txt文件中添加: ADD_DEFINITIONS(-DENABLE_DEBUG -DABC ...
- 临时的ThisCall
// 获取当前定位 changeCity: function () { let that = this; that.locationClose(); Upj._changeCity().then((d ...
- python之路--内置函数, 匿名函数
一 . 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. 字符串类型代码的执⾏ eval() 执⾏字符串类型的代码. 并返回最终结果( ...
- Golang的时间生成,格式化,以及获取函数执行时间的方法
最近都在通过完成一些列功能强化自己对常用api的熟悉. 然而关于时间的api几乎是最常用的api类型,所以总结一些常用的. 以YY-mm-dd HH:MM:SS.9位 输出当前时间: func mai ...
- umount -fl用法
umount, 老是提示:device is busy, 服务又不能停止的.可以用"umount -fl"解决! 挂载: mount - mount a filesystem mo ...
- Java多线程3:Thread中的实例方法
一.Thread类中的方法调用方式 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: ...
- 关于 flask 实现数据库迁移以后 如何根据创建的模型类添加新的表?
在此之前 我们先说一下常规的flask运用第三方扩展来实现数据库的迁移的三个步骤以及每步的目的. 数据库的迁移的三个步骤:(cd 到run.py所在路径) python run.py db init ...