7.2

//单调队列

#include<deque>
using namespace std;
deque<int> 
int main( ){
    int a[1000];
    for( itn i=0 ;i<1000 ;i++){
    if(q.empty()){
        q.push_back( a[i] );
    }
    else if( q.back()>a[i]){
        while( !q.empty() && q.back()>a[i]){
            q.pop_back();
        }
        q.push_back( a[i] );
    }
    else q.push_back( a[i] );
    }
    return 0;
}

#include <bits/stdc++.h> using namespace std; deque<int> dq; const int inf =0x3f3f3f3f; int pic[550][550] ,m ,n ,k ,q; int mx[550][550] , r, c; vector <int> mn; void init(){ for(int j=1 ;j<=m; j++){ dq.clear(); for( int i=1 ;i<=k ;i++){ //cout<<"now "<<pic[i][j]<<endl; if( dq.empty() )dq.push_back( pic[i][j] ); else{ while( !dq.empty() && dq.back()<pic[i][j] ){ //cout<<"pop "<<dq.back()<<endl; dq.pop_back(); } dq.push_back( pic[i][j] ); } } for( int i=1+k ;i<=n ;i++){ mx[i-k][j] = dq.front(); //cout<<i-k<<" "<<j<<" "<<dq.front()<<endl; if( pic[i-k][j] == dq.front() )dq.pop_front(); if( dq.empty() )dq.push_back( pic[i][j] ); else{ while( !dq.empty() && dq.back()<pic[i][j] ){ //cout<<"pop "<<dq.back()<<endl; dq.pop_back(); } dq.push_back( pic[i][j] ); } } mx[n+1-k][j] = dq.front(); //cout<<n+1-k<<" "<<j<<" "<<dq.front()<<endl; //cout<<"here "; } return; } int main( ){ ios::sync_with_stdio( false ); memset( pic ,inf ,sizeof( pic )); cin>>n>>m>>k>>q; while( q--){ cin>>r>>c; cin>>pic[r][c]; } init(); //cout<<"here"<<endl; for( int i=1 ;i<=n-k+1 ;i++){ dq.clear(); for( int j=1 ;j<=k ;j++ ){ //cout<<"now "<<mx[i][j]<<endl; if( dq.empty() )dq.push_back( mx[i][j] ); else{ while( !dq.empty() && dq.back()<mx[i][j] ){ dq.pop_back(); //cout<<"pop "<<dq.back()<<endl; } dq.push_back( mx[i][j] ); } } for( int j=1+k ;j<=m ;j++ ){ mn.push_back( dq.front() ); //cout<<i<<" "<<j-k<<" "<<dq.front()<<endl; if( mx[i][j-k]==dq.front() )dq.pop_front(); if( dq.empty() )dq.push_back( mx[i][j] ); else{ while( !dq.empty() && dq.back()<mx[i][j] ){ dq.pop_back(); } dq.push_back( mx[i][j] ); } } mn.push_back( dq.front() ); //cout<<i<<" "<<m+1-k<<" "<<dq.front()<<endl; } sort(mn.begin() ,mn.end()); if(mn[0]==inf)cout<<"-1 "; else cout<<mn[0]; return 0; }

//
技巧暴力 #include <bits/stdc++.h> #define N 100005 using namespace std; typedef long long ll; ll n ,k ,ans=0; ll a[N] ,sum[N]={0}; vector<ll> pk; map<ll ,int> mp; int main(){ ios :: sync_with_stdio( false ); cin >>n>>k; for( int i=1 ;i<=n ;i++){ cin>>a[i]; sum[i] = sum[i-1]+a[i]; } pk.push_back(1); ll t = k; while( abs(k) < 1e14+5 && k!=1 ){ pk.push_back(k); k *= t; //cout<<k<<endl; } sort( pk.begin(), pk.end()); int sz = pk.size(); mp[0] = 1; for( int i=1 ;i<=n ;i++){ ll tmp; for( int j=0; j<sz ;j++){ tmp = sum[j] - sum[i]; //cout<< tmp%t<<endl; ans +=mp[sum[i] - pk[j]]; } mp[sum[i]]++; } cout<<ans; return 0; }

//
思维 快速幂 #include<bits/stdc++.h> #define MOD 1000000000+7 using namespace std; typedef long long ll; ll pow(ll n ,ll p){ ll ans = 1; while( p ){ if( p&1 )ans*=n; ans %= MOD; n *= n; n %= MOD; p >>= 1; } return ans; } int main( ){ ios :: sync_with_stdio( false ); ll n; ll a=0 ,g=0 ,c=0 ,t=0 ,mx ,k; string s; cin >>n >>s; for( int i=0 ;i<n ;i++){ if( s[i]=='A' )a++; else if( s[i]=='G' )g++; else if( s[i]=='C' )c++; else t++; } mx = max(a ,max( g ,max( c ,t ) ) ); k = (a==mx)+(g==mx)+(c==mx)+(t==mx); cout<<pow(k ,n); }
//

C - Elections


//三分
//意想不到的错误!a!wsl!
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
int n ,m;
struct Voter{
    int a,b; 
    bool operator < (const Voter & s)const{
         return b < s.b;
    }
} voter[100050];
int can_vote[100050]={0};
int tem_vote[100050];
int vis[100050];

// 检查对象:最优票数,使得花费最少
// 1,其他候选人不得高于此票数
// 2,自身不得低于此票数
// 3,满足规则1,2的基础上,
// 不难发现,最终结果最优时自身票数一定恰达到此标准 
int check( int level){
    //cout<<"level "<<level<<endl;
    int sum = 0;
    
    memset( vis ,0 ,sizeof(vis));
    
tem_vote[0] = 0;
for( int i=0 ;i<n ;i++) tem_vote[ voter[i].a ] = can_vote[ voter[i].a ]; //难以debug的错误语句,原:tem_vote[i] = can_vote[i]; for( int i=0 ;i<n ;i++){ int can = voter[i].a, mny = voter[i].b; if( can == 0)vis[i] = 1; else{ // cout<<tem_vote[can]<<endl; if( tem_vote[can] >= level){ sum += mny; tem_vote[ can ]--; tem_vote[ 0 ]++; vis[i] = 1; //cout<<"a i "<<i<<" "<<can<<" "<<mny<<endl; //cout<<tem_vote[can]<<endl; } } } // cout<<tem_vote[0]<<endl; if( tem_vote[0] < level) for( int i=0 ;i<n ;i++){ if( vis[i] )continue; int can = voter[i].a, mny = voter[i].b; tem_vote[0]++; sum += mny; //cout<<"i "<<i<<" "<<can<<" "<<mny<<endl; if( tem_vote[0] >= level) break; } //cout<<"sum "<<sum<<endl; return sum; } int main(void){ ios::sync_with_stdio( false ); memset( can_vote ,0 ,sizeof(can_vote)); cin >> n; for( int i=0 ;i<n ;i++){ cin >>voter[i].a >>voter[i].b; //cout<< voter[i].a<<' '<<voter[i].b<<endl; can_vote[ voter[i].a ]++; } sort( voter ,voter+n ); int l = 1 ,r = n ,ans; while( l<=r ){ int l_mid = l+(r-l)/3; int r_mid = r-(r-l)/3; if( check(l_mid)<=check(r_mid) ){ ans = check(l_mid); r= r_mid-1; } else{ ans = check(r_mid); l = l_mid+1; } } cout << ans << endl; return 0; }
//cf - edu40 -D 
//图论 bfs球最短路的应用 

#include <bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
int sp[1500][1500] ,edge[1500][1500] ,vis[1500];
int n ,m ,s ,t;

void bfs( int x ){
    memset( vis ,0 ,sizeof(vis) );
    queue<int> q;
    q.push( x );
    vis[x] = 1;
    while( !q.empty() ){
        int t = q.front(); q.pop();
        for( int i=1 ;i<=n ;i++){
            if( edge[t][i] && !vis[i] ){
                vis[i] = 1;
                sp[i][x] = sp[x][i] = sp[t][x]+1;
                q.push(i);
            }
        }
    }
    return ;
}

int main( ){
    memset( sp ,inf ,sizeof(sp) );
    memset( edge ,0 ,sizeof(edge) );
    ios::sync_with_stdio( false );
    cin >>n >>m >>s >>t;
    while( m-- ){
        int a, b;
        cin>>a >>b;
        sp[a][b]=edge[a][b]=1;
        sp[b][a]=edge[b][a]=1;
    }
    //init
    for( int i=1 ;i<=n ;i++){
        sp[i][i] = 0;
    }
    bfs( s ); bfs( t );
    
    int ans = 0;
    for( int i=1 ;i<=n ;i++){
        for( int j=i+1 ;j<=n ;j++){
            if( !edge[i][j] )
                //增边后对新增s->t路径的长度判断 
                if( sp[s][i]+sp[t][j]+1>=sp[s][t] && sp[s][j]+sp[t][i]+1>=sp[s][t])
                ans++;
        }
    }    
    cout<<ans;
    return 0;
}


/*
16 
0 12
0 12
0 12
0 12
2 1
2 1
3 500
3 500
3 500
3 500
3 500
4 500
4 500
4 500
4 500
4 500
*/
//巧用与标准相对+-的贪心 
// E-tap 
#include<bits/stdc++.h>
#define rep(i ,x ,y) for(int i=x ;i<=y ;++i)
#define repd(i ,x ,y) for(int i=y ;i>=x ;--i)
#define N 200050
using namespace std;

typedef long long ll;
typedef long double ld;
int n ,T ,a[N] ,t[N];

struct Tap{
    int a ,t;
    Tap( int a ,int t):a(a) ,t(t){}
    bool operator < (const Tap & s)const{
         return t < s.t;
    }
};
vector<Tap> x[2];

int main( ){
    ld ans = 0;
    ll sum[2] = {0 ,0};
    scanf( "%d%d" ,&n ,&T);
    rep(i ,1 ,n)scanf( "%d" ,&a[i]);
    rep(i ,1 ,n){
        scanf( "%d" ,&t[i] );
        t[i] -= T;
        if( t[i]==0 )ans += a[i];
        else x[t[i]<0].push_back( Tap( a[i] ,abs( t[i] )) );
    }
    //cout<<"1 "<<ans<<endl;
    
    rep( i, 0 ,1){
        for( vector<Tap>::iterator it= x[i].begin() ;it!=x[i].end() ;it++ )
           sum[i] += 1ll * (* it).a * (*it).t;
    }
    
    if( sum[0] >sum[1] ){
        swap(x[0] ,x[1]);
        swap(sum[0] ,sum[1]);
    }
    
    sort( x[1].begin() ,x[1].end() );
    
    for( vector<Tap>::iterator it= x[0].begin() ;it!=x[0].end() ;it++ )
       ans += (* it).a;
    
    //cout<<"2 "<<ans<<endl;   
    for( vector<Tap>::iterator it= x[1].begin() ;it!=x[1].end() ;it++ ){
        if( 1ll * (* it).t *(* it).a >= sum[0] ){
            //cout << ans<<" "<<sum[0]<<" "<<1ll*(* it).t *(* it).a<<endl;
            ans += 1.0* sum[0]/(* it).t; 
            //cout<<ans<<endl;
            break;
        }
        //cout << ans<<" "<<sum[0]<<" "<<1ll*(* it).t *(* it).a<<endl;
        ans += (* it).a ,sum[0] -= 1ll*(* it).t *(* it).a;
    }
    printf("%Lf
" ,ans);
    return 0;
}
原文地址:https://www.cnblogs.com/-ifrush/p/11120327.html