이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define lcm(a,b) (a/__gcd(a,b))*b
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long int
#define vi vector<int>
#define vll vector<ll>
#define pb push_back
#define F first
#define S second
#define mp make_pair
//salida rapida "\n"
//DECIMALES fixed<<sp(n)<<x<<endl;
//gcd(a,b)= ax + by
//lCB x&-x
//set.erase(it) - ersases the element present at the required index//auto it = s.find(element)
//set.find(element) - iterator pointing to the given element if it is present else return pointer pointing to set.end()
//set.lower_bound(element) - iterator pointing to element greater than or equal to the given element
//set.upper_bound(element) - iterator pointing to element greater than the given element
// | ^
//__builtin_popcount(x)
using namespace std;
const ll MOD=1e9+7;
vll h,w;
ll res=0;
vi ind;
vector<bool>vis;
int P[1000005];
ll bin(ll x){
x%=MOD;
return ((x*(x+1))/2)%MOD;
}
ll T(ll x,ll y){
return (bin(x)%MOD*bin(y)%MOD)%MOD;
}
bool comp(int x,int y){
return h[x]>h[y];
}
int _find(int x){
if(P[x]==x)return x;
return P[x]=_find(P[x]);
}
void _union(int x,int y){
x=_find(x),y=_find(y);
if(x==y)return;
P[x]=y;
w[y]=(w[y]+w[x])%MOD;
}
int sum(int x){
x=_find(x);
return w[x];
}
int main()
{
freopen("input1.txt","r",stdin);
ll n,x;
cin>>n;vis.assign(n+1,false);
for(int i=0;i<n;i++){
P[i]=i;
cin>>x;
h.pb(x);
}
for(int i=0;i<n;i++){
cin>>x;ind.pb(i);
w.pb(x);
}
ll res=0;
sort(ind.begin(),ind.end(),comp);
for(int i=0;i<n;i++){
int it=ind[i],L=0,R=0;
vis[it]=true;
//siempre me "conecto" con uno de mayor o igual altitud
if(it && vis[it-1]){
L=sum(it-1);
_union(it,it-1);
}
if(it<n-1 && vis[it+1]){
R=sum(it+1);
//cout<<"padre "<<_find(it+1)<<endl;
_union(it,it+1);
}
//cout<<L<<" " <<R<<endl;
int SUM=(L+R+w[it])%MOD;
res=(res+T(SUM,h[it])+MOD)%MOD;
res=(res-T(L,h[it])+MOD)%MOD;
res=(res-T(R,h[it])+MOD)%MOD;
}
res+=MOD;
res%=MOD;
cout<<res<<endl;
return 0;
}
//409336628
컴파일 시 표준 에러 (stderr) 메시지
fancyfence.cpp: In function 'int main()':
fancyfence.cpp:54:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
54 | freopen("input1.txt","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |