問題への解決策 - [NOIPシミュレーション]は、通常の家族のバケットではありません

問題の解決策 - ではない通常のシーケンスのギャング+州+

背景まともな賞賛
ssw02に、彼は爆撃しました


異常なギャング

主なアイデア

50分の練習

暴力のオープンバレル、統計がすることができます。

60分の練習

ツリープラス暴力の会長

100練習

Moはそれをクリック練習班オフラインから入手できる50点。(ところで、ここでZYC先輩コード最適化彼のチームのMo板ssw02ビット)

60点、場所に記録されている木の社長から入手することができます。

セグメントツリーのアプローチは、場所に記録されています。(これらの方法は、染色それ範囲)

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int MAXN = 100005 ;
inline int read(){
   int s=0 , w=1 ; char g=getchar() ;while(g>'9'||g<'0'){if(g=='-')w=-1;g=getchar();}
   while(g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ;return w*s ;
}
struct Seg{
   int l , r , id ;
}t[ MAXN ];
int N , M , block , a[ MAXN ] , pos[ MAXN ] , num[ MAXN ]  ;
ll tot = 0 , ans[ MAXN ] ;
inline bool cmp( Seg x , Seg y ){
   return ( pos[ x.l ]==pos[ y.l ] )?( x.r < y.r ) : ( pos[x.l] < pos[y.l] ) ;
}
inline void updata( int x , int  opt ){
   if( !opt ){//收缩 扩张 
       --num[ a[ x ] ] ;
       if( num[ a[ x ] ] > 2 ) tot -= a[ x ];
       else if(num[ a[ x ] ] == 2) tot -= a[ x ]*3 ;  
       else if(num[ a[ x ] ] == 1) tot += a[ x ] ;
       else tot -= a[ x ] ; 
       return;
   }
   ++num[ a[ x ] ] ;
   if( num[ a[ x ] ] > 3 )  tot += a[ x ];
   else if( num[ a[ x ] ] == 3 ) tot += a[ x ]*3 ;
   else if( num[ a[ x ] ] == 2 ) tot -= a[ x ] ;
   else tot += a[ x ];
}
void  Mo(){
   for( int l = 1 , r = 0 , i = 1 ; i <= M  ; ++i ){
       while( l < t[ i ].l )updata( l++ , 0 ) ;
       while( l > t[ i ].l )updata( --l , 1 ) ;
       while( r < t[ i ].r )updata( ++r , 1 ) ;
       while( r > t[ i ].r )updata( r-- , 0 ) ;
       ans[ t[ i ].id ] = tot ;
   }
}
int main(){
   freopen("abnormal.in","r",stdin);
   freopen("abnormal.out","w",stdout);
   N = read() , M = read() , block = sqrt(N) ;
   for( int i = 1 ; i <= N ; ++i )a[ i ] = read() ;
   block = sqrt( N ) ;
   for( int i = 1 ; i <= N ; ++i )pos[ i ] = (i-1) / block+1 ;
   for( int i = 1 ; i <= M ; ++i )
       t[ i ].l = read() , t[ i ].r = read() , t[ i ].id = i ;
   sort( t+1 , t+M+1 , cmp ) ;
   Mo() ;
   for( int i = 1 ; i <= M ; ++i )printf("%lld\n",ans[ i ] ) ;
   return 0 ;
} 

OIerとして、質問のうち、特に学校の先輩の金、人々のために尊敬の話題を維持します。

ではない通常の国

トライ木分割重鎖+ +ヒューリスティックマージ(SXK、STD)
トライ木削除+いいえヒューリスティックマージ(ZYC)
ツリー断面+ +ヒューリスティック(実際には、第一とほぼ)トライ木をマージ

ではない通常のシーケンス

話題のがんと人々すべて完璧にバランスの取れたツリーカード。(最後のカードがhzy過去にマング)

ダブルスタックそれで、中央値を求めて。一定レベルよりも小さいです。

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int MAXN = 1000005 , mod = 1e9+7 ;
inline ll read(){
    ll s=0 ; char g=getchar() ; while(g>'9'||g<'0')g=getchar() ;
    while( g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s ;
}
ll ans = 0 ;
ll a[ MAXN ] , N , A , B , C ; 
priority_queue<ll>ma,mi ;
int  deal( int N ){
    if( N%2 )return N/2+1 ;
    else return N/2 ;
}
void  insert( int x ){
    int u = mi.top() ;
    if( x < u )mi.push( x ) ;
    else ma.push( -x ) ;
    while( mi.size() < ma.size() ){
        int u = -ma.top() ; ma.pop() ;
        mi.push( u ) ;
    }
    while( mi.size()-1 > ma.size() ){
        int u = mi.top() ; mi.pop() ;
        ma.push( -u ) ;
    }
}
int main(){
    freopen("unnormal.in","r",stdin) ;
    freopen("unnormal.out","w",stdout) ;
    A = read() , B = read() , C = read() , N = read() ;
    mi.push(1) ;
    ans = 1LL ;
    for( ll i = 2 ; i <= N ; ++i ){
        ll op = mi.top() ;
        op = ( op*A%mod + B*i%mod + C )%mod ; 
        insert(op);ans += (ll)op ;
    }
    cout<<ans<<endl ;
}

不十分な場合は、ギャングを明記してください

おすすめ

転載: www.cnblogs.com/ssw02/p/11593657.html