Submission #395158

# Submission time Handle Problem Language Result Execution time Memory
395158 2021-04-27T23:22:22 Z Pichon5 Fancy Fence (CEOI20_fancyfence) C++17
12 / 100
2 ms 332 KB
#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[10005];
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()
{ 
    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];
        res=(res+T(SUM,h[it]))%MOD;
        res=(res-T(L,h[it]))%MOD;
        res=(res-T(R,h[it]))%MOD;
    }
    res+=MOD;
    res%=MOD;
    cout<<res<<endl;


    
 
    
    return 0;
}
//409336628
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 2 ms 332 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 304 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 304 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 1 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 2 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 2 ms 332 KB Output isn't correct