zoukankan      html  css  js  c++  java
  • [机房测试]10.21

    [机房测试]10.21

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

    欢迎转载ssw02的博客:https://www.cnblogs.com/ssw02/p/11716560.html


    斐波那契

    题目传送门

    思路很不错的一道题。

    第一眼,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
    ",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
    ",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
    ",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个数重复的情况,细节很多。(毕竟我们维护的是下标)。

  • 相关阅读:
    mybatis-plus 相关
    Nginx 相关
    Docker 相关
    shiro & jwt
    Java GC
    C++ Q&A
    epoll ET & LT
    关于 free 命令显示内存使用情况问题
    Metaprogramming in Ruby: It’s All About the Self
    On The Value Of Fundamentals In Software Development (基础知识在软件开发中的价值)
  • 原文地址:https://www.cnblogs.com/ssw02/p/11716560.html
Copyright © 2011-2022 走看看