제출 #1216410

#제출 시각아이디문제언어결과실행 시간메모리
1216410Adeeb_obedo모임들 (IOI18_meetings)C++20
0 / 100
0 ms320 KiB
#include<bits/stdc++.h>
#define int long long
#define ld   double
#define _1 first
#define _2 second
#define yes cout<<"Yes\n"
#define nah cout<<"No\n"
#define FFF ios_base::sync_with_stdio(0);cin.tie(0);
#define ipr pair<int,int>
#define ret return
#define intt int32_t
#define mid ((l+r)/2)
#define pb push_back
#define lll __int128
#include "meetings.h"


using namespace std;
int tst, ts;
intt mo = 998244353, dx[] = {0, 1, 0, -1}, dy[] = {-1, 0, 1, 0};
int mul( int x, int y ) {
    ret ( ( x % mo ) * ( y % mo ) ) % mo;
    ret x*y;
}
int pwo( int x, int y ) {
    int res = 1;
    for( int i = 63; i + 1; i-- )
        res = mul( res, res * ( ( 1ll << i )&y ? x : 1 ) );
    ret res;
}
int dvii( int x, int y ) {
    ret mul( x, pwo( y, mo - 2 ) );
}
int oo( char x ) {
    ret ( int )x - '0';
}
int lgg( int x, int y ) {
    int u = 0;
    while( x ) {
        u++;
        x /= y;
    }
    ret u;
}
int mun( int x, int y ) {
    while( x < y )x += mo;
    ret ( x - y ) % mo;
}
int add( int x, int y ) {
    ret x + y - ( mo * ( x + y >= mo ) );
    ret x + y;
}
int lcm( int x, int y ) {
    ret ( x * y ) / __gcd( x, y );
}
#define endl '\n';
const int M =1007, N = 2e5+ 7, N2 = 5e3 + 7, inf = 2e18+7 ;
int n,a[N],x;
vector<int>v[21],mv[21];
vector<ipr>vv[21];
ipr b[N][22],tr[N*4][22];
ipr cm(ipr u,ipr p,int o){
	if(p._2<u._2)
		swap(u,p);
	if(u._1+(p._2-u._2)*o>p._1)
		swap(u,p);
	ret u;
}
ipr bll(int l,int r){
	if(l==0&&r==n-1){
		for(int i=0;i<n;i++)
			mv[a[i]].pb(i);
        cout<<" dfsd"<<endl;
    }
	int mx=-inf,mn=inf;
	for(int i=l;i<=r;i++)
		mx=max(mx,a[i]),mn=min(mn,a[i]);
	if(mx==mn)
		ret {(r-l+1)*mx,r-l+1};
	int o;
	ipr u={inf,1};
	for(int i=l;i<=r;i++){
		if(a[i]==mx)
			continue;
		if((i==l||a[i-1]==mx)&&a[i]<mx)
			o=i;
		if(a[i]<mx&&(a[i+1]==mx||i==r)){
			v[mx].pb(o);
			vv[mx].pb({o,i});
			ipr p=bll(o,i);
			b[v[mx].size()-1][mx]=p;
			u=cm(u,p,mx);
		}
	}
	u._1+=(r-l+1-u._2)*mx;
	u._2=r-l+1;
	ret u;
}
void bul(int no,int l,int r,int o){
	if(l==r){
		tr[no][o]=b[l][o];
		ret;
	}
	bul(no*2,l,mid,o);
	bul(no*2+1,mid+1,r,o);
	ipr u=tr[no*2+1][o],p=tr[no*2][o];
	tr[no][o]=cm(u,p,o);
}
ipr qr(int no,int l,int r,int s,int e,int o){
	if(l>e||s>r)
		ret {inf,1};
	if(s<=l&&r<=e)
		ret tr[no][o];
	ipr u=qr(no*2+1,mid+1,r,s,e,o),p=qr(no*2,l,mid,s,e,o);

	ret cm(u,p,o);
}
ipr qrr(int l,int r,int mx){
    //cout<<l<<" "<<r<<" "<<mx<<" ";
	if(mx==1||l==r)
		ret {a[l]*(r-l+1),r-l+1};
	int o=lower_bound(mv[mx].begin(),mv[mx].end(),l)-mv[mx].begin();
	//cout<<o<<" "<<mv[mx][o]<<endl;
	if(mv[mx][o]>r)
		ret qrr(l,r,mx-1);
	int u=upper_bound(mv[mx].begin(),mv[mx].end(),r)-mv[mx].begin()-1;
	ipr an={inf,1};
	if(mv[mx][o]>l)
		an=cm(an,qrr(l,mv[mx][o]-1,mx-1),mx);
	if(mv[mx][u]<r)
		an=cm(an,qrr(mv[mx][u]+1,r,mx-1),mx);
	/**/
	int oo=lower_bound(v[mx].begin(),v[mx].end(),mv[mx][o])-v[mx].begin();
	if(vv[mx][oo]._2>r){
		an._1+=(r-l+1-an._2)*mx;
		an._2=r-l+1;
		ret an;
	}
	int uu=upper_bound(v[mx].begin(),v[mx].end(),mv[mx][u])-v[mx].begin()-1;
	an=cm(an,qr(1,0,v[mx].size(),oo,uu,mx),mx);
an._1+=(r-l+1-an._2)*mx;
	an._2=r-l+1;

	ret an;
}
vector<int>minimum_costs(vector<intt> H, vector<intt> L,vector<intt> R){
	n=H.size();
	for(int i=0;i<n;i++)
		a[i]=H[i];
	bll(0,n-1);

	for(int i=2;i<=20;i++){
		if(v[i].size())
			bul(1,0,v[i].size()-1,i);
        v[i].pb(n);
        mv[i].pb(n);
    }
	vector<int>an;
	for(int i=0;i<L.size();i++)
		an.pb(qrr(L[i],R[i],20)._1);
	ret an;
}

/*
void solve(){

}
intt main() {
	FFF
	//freopen("fcolor.in", "r", stdin);
	//freopen("fcolor.out", "w", stdout);
	tst = 1;
	cin >> tst;
    for ( ts = 1; ts <= tst; ts++ ){
		solve();
   }
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...