2019-08-04 总结

2019-08-05  本文已影响0人  saploser

part 1 贪心四题

代码

代码

代码

代码

part 2 2015年普及组

#include<iostream>
#include<cstring>
using namespace std;
long long a[100001] , color[100001];
int tmp[100000] , b[100001] , s[100000] , sum1[3][100000] , sum2[3][100000], sum3[3][100000];
void print ( int a[] , int x)
{
    for ( int i = 1 ; i <= x ; i++)
        cout << a[i] << " " ;
    cout << endl ;
}
int main()
{
    int n , m;
    long long sum = 0;
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
        cin >> a[i];
    for(int i = 1;i <= n;i++)
        cin >> color[i];   
//  print ( a , n) ;
//  print ( color , n) ;
    
        
    for ( int i = 1 ; i <= n ; i++)
        tmp[color[i]]++ ;
    for ( int i = 1 ; i <= m ; i++)
        tmp[i] += tmp[i - 1] ;
//  print ( tmp , m ) ;
    for ( int i = 1 ; i <= m ; i++)
    {
        b[i] = tmp[i] ;
    }
    for ( int i = n ; i > 0 ; i--)
    {
        s[tmp[color[i]]] = i ;
        tmp[color[i]]-- ;
    }
//  print ( s , n) ;
    for ( int i = 1 ; i <= m ; i++)
    {
        
        for ( int j = b[i - 1] + 1 ; j <= b[i] ; j++)
        {
            sum1[s[j] % 2][i] = (sum1[s[j] % 2][i] + s[j] * a[s[j]]) % 10007 ;
            sum += (sum1[s[j] % 2][i] + a[s[j]] * sum2[s[j] % 2][i] + s[j] * sum3[s[j] % 2][i] + a[s[j]] * s[j]);
            sum %= 10007 ;
            sum2[s[j] % 2][i] = ( sum2[s[j] % 2][i] + s[j] ) % 10007 ;
            sum3[s[j] % 2][i] = ( sum3[s[j] % 2][i] + a[s[j]]) % 10007 ;
            
        }
//      cout << sum0[1][i] << " " ;
//      cout << sum1[1][i] << " " ;
//      cout << sum2[1][i] << " " ;
//      cout << sum3[1][i] << " " ;
//      cout << sum0[0][i] << " " ;
//      cout << sum1[0][i] << " " ;
//      cout << sum2[0][i] << " " ;
//      cout << sum3[0][i] << " " ;
    }
    sum %= 10007 ;
    cout << sum ;
    return 0 ; 
}

法二:先将所有东西全加好,再做操作

代码

new question

1.queue() : l( 1 ) , r( 0 ) {}
2.循环队列
3.位运算
C语言位运算符知识总结和实例分析

位运算应用口诀和实例

取模运算总结 - 数论

技巧三.a ^ b ^ b=a

4. image.png

看不懂

RE了四个点 没看出哪里错了
P1739 表达式括号匹配 提交记录

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std ;



const int MAXN = 1e6 ;



char x[MAXN] ;
int m ;
stack<char> s ;
bool check()
{

    for ( int i = 0 ; i < m ; i++)
    {
        if ( x[i] == '(')
        {
            s.push(x[i]) ;
        }
        else
        {
            if ( x[i] == ')' && s.top() != '(')
                return 0 ;
            if ( x[i] == ')')
                s.pop() ;
        }
    }
    if (!s.empty()) 
        return 0 ;
    
    return 1 ;
}

int main()
{
    while(x[m] != '@')
    {
        cin >> x[++m] ;
    } 
    if ( check() == true)
        printf("YES\n") ;
    else 
        printf("NO\n") ;
    return 0 ;
}

6.并查集
并查集例题,想看老师如何写

代码


#include<iostream>
#include<cstdio>

using namespace std ;

int fa[5001] ;

int search(int x)
{
    if ( fa[x] == x) return x ;
    
search(fa[x]) ;
}

void merge(int x , int y)
{
    if ( search(x) == search(y)) return ;
    if ( x > y )
    {
        int t = x ;
        x = y ;
        y = t ;
    }
    fa[search(x)] = y ;
    return ;
}

int n , m , p ; 


int main()
{
    scanf("%d%d%d" , &n , &m , &p) ;//n = 6 , m = 5 , p = 3
    
    
    for ( int i = 1 ; i <= n ; i++)
        fa[i] = i ;
    
    
    for ( int i = 1 ; i <= m ; i++)
    {
        int x , y ;
        scanf("%d%d" , &x , &y) ;
        merge(x , y) ;
    }
    for ( int i = 1 ; i <= p ; i++)
    {
        int x , y ;
        scanf("%d%d" , &x , &y) ;
        if ( search(x) == search(y))
            printf("Yes\n") ;
        else
            printf("No\n") ;
    }
    
    return 0 ;
}

按秩合并


image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读