其他分享
首页 > 其他分享> > [机房测试]10.21

[机房测试]10.21

作者:互联网

[机房测试]10.21

ssw02为了保持csp前rp的稳定,又来写博客了

欢迎转载ssw02的博客:


斐波那契

题目传送门

思路很不错的一道题。

第一眼,waa好难啊。然后,等等,这几项的差怎么都是斐波拉契数呢?然后ssw02模拟了一下,好像是找第一个小于这个数的斐波拉契数,他们的差值就是他的父亲节点。然后写了个暴力对拍掉即可。

代码

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
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 f[61] , N , m1 , m2 ;//59 
void  prepare(){
    f[0] = f[1] = 1LL ;
    for( int i = 2 ; i <= 60 ; ++i )f[i] = f[i-1] + f[i-2] ;  
}
inline ll find( ll x ){
    int l = 1 , r = 60 , ans = r , mid ;
    while( l <= r ){
        mid = (l+r)>>1 ; 
        if( f[mid] < x )ans = mid , l = mid+1 ; else r = mid-1 ;
    }
    return f[ans] ;
}
inline ll work( ll x , ll y ){ 
    while( x != y ){
        if( x < y)swap( x , y ) ;
        x -= find(x) ;
    }
    return x ;
}
int main(){
    freopen("fibonacci.in","r",stdin);
    freopen("fibonacci.out","w",stdout);
    prepare() ; 
    N = read() ; 
    while( N-- ){
        m1 = read() , m2 = read() ; 
        printf("%lld\n",work(m1,m2) ) ;  
    }
    return 0 ;
}

数颜色

题目传送门

ssw02学数据结构学疯了。

最早开的就是T2,当时先看到,嗯嗯嗯,这不是树套树吗?不可做。。

等等,好像这个相邻交换有点东西,好像有点思路。。。

苦思冥想半天想不出数据结构的优化。。

然后形心态崩了,分块空间不够啊,然后ssw02写了个65分带修莫队,最后还多了5分,改块大小2600后还得了75分。。

#include<bits/stdc++.h>
using namespace std ;
const int MAXN = 300005 ; 
inline int read(){
    int 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 ;
}
int N , M , block , a[ MAXN ] , cnt[ MAXN ] , pos[ MAXN ] , ans[MAXN];
int ask , tim ;
struct ap{
    int l , r , id , tim , col ;
}t[MAXN];
struct sp{
    int pos , aft ;
}q[MAXN]; 
inline bool cmp( ap x , ap y ){
    if( pos[x.l]!=pos[y.l] )return pos[x.l]<pos[y.l] ;
    if( pos[x.r]!=pos[y.r] )return pos[x.r]<pos[y.r] ;
    return x.tim < y.tim ;
}
void  updata( int x , int opt ){
    if( opt ){cnt[ a[x] ]++ ;return ;}
    cnt[a[x]]-- ;
}
inline void  change( int now , int i  ){
    if( q[now].pos == t[i].l-1 )cnt[ a[ q[now].pos ] ]++ , cnt[ a[ q[now].aft ] ]-- ;
    else if( q[now].pos == t[i].r )cnt[ a[ q[now].pos ] ]-- , cnt[ a[ q[now].aft ] ]++ ;
    swap( a[ q[now].pos ] , a[ q[now].aft ] ) ;
}
void  Mo(){
    for( register int i=1,l=1,r=0,now=0;i<=ask;++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 ) ; 
        while( now < t[i].tim )change( ++now , i ) ; while( now > t[i].tim )change( now-- , i ) ;
        ans[ t[i].id ] = cnt[ t[i].col ] ;
    }
}
int main(){
    N = read() , M = read() , block = 2600 ; int m1 , m2 , m3 ; 
    for( register int i = 1 ; i <= N ; ++i )a[i] = read(),pos[i] = (i-1)/block+1 ;
    for( register int i = 1 ; i <= M ; ++i ){
        m1 = read() ;
        if( m1==1 )t[++ask].l=read(),t[ask].r=read(),t[ask].col=read(),t[ask].id=ask,t[ask].tim=tim ; 
        else q[++tim].pos = read() , q[tim].aft = q[tim].pos+1 ; 
    }
    sort( t+1 , t+ask+1 , cmp ) ; 
    Mo() ;
    for( register int i = 1 ; i <= ask ; ++i )printf("%d\n",ans[i]) ;
}

正解嘛,用vector,由于相邻交换仍然具有单调性。然后就暴力修改vector。

ssw02 STL菜出水平啊。

#include<bits/stdc++.h>
using namespace std ;
const int MAXN = 300005 ;
inline int read(){
    int 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 ;
}
int N , M , a[MAXN] ; 
vector<int>q[MAXN] ;
int main(){
    freopen("color.in","r",stdin);
    freopen("color.out","w",stdout);
    N = read() , M = read() ; int m1 , m2 , m3 , m4 ; 
    for( int i = 1 ; i <= N ; ++i ){
        a[i] = read() ; q[ a[i] ].push_back(i) ; 
    }
    while( M-- ){
        m1 = read() ; 
        if( m1 == 1 ){
            m2 = read() , m3 = read() , m4 = read() ; 
            int l = lower_bound( q[m4].begin() , q[m4].end() , m2 ) - q[m4].begin() ;
            int r = upper_bound( q[m4].begin() , q[m4].end() , m3 ) - q[m4].begin()-1 ;
            printf("%d\n",max( r-l+1,0 ) ) ;
        }
        else{
            m2 = read() ; 
            m3 = lower_bound( q[a[m2]].begin(),q[a[m2]].end(),m2)-q[a[m2]].begin() ;
            q[ a[m2] ][ m3 ]++ ;
            m2++ ;
            m3 = lower_bound( q[a[m2]].begin(),q[a[m2]].end(),m2)-q[a[m2]].begin() ;
            q[ a[m2] ][ m3 ]-- ;
            swap( a[m2],a[m2-1] ) ;
        }
    }
    return 0 ;
}

分组

题目传送门

其实ssw02是打了40分的,不过ssw02菜得精彩,然后爆0了。

K = 1 和 K = 2 肯定是不同算法。

K = 1 ,我们只要暴力枚举 1~512 的平方数即可(这个思想和 小清新人渣的本愿 有点像)

最小字典序,倒叙枚举即可,否则我们会多维护一个之前每个数不切实际的冲突位置。

K = 2 , 用数值并查集维护一个类似 关押罪犯 的敌对关系 。 多想想存在2个数重复的情况,细节很多。(必经我们维护的是下标)。

标签:10.21,测试,int,ll,read,while,机房,ssw02,now
来源: https://www.cnblogs.com/ssw02/p/11716560.html