cug1699数组反转

题目大意:

题目描述:

cug1699数组反转_第1张图片

input:

cug1699数组反转_第2张图片

output:

cug1699数组反转_第3张图片



思路:记录n次操作后每次的结果数组,因为k很小,可以存下。然后在q次询问时,每次查询a[l-1] 和a[r]的同一个数的相对位置即可。比赛的时候太慌,没有静心想


#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>

using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 100050
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
typedef pair<int , int> pii;
const long long INF= 0x3fffffff;
int  k , n , q , l , r;
int a[maxn][22] , ans[22];

int main()
{
    int t;
    scanf("%d" , &t);
    while(t--)
    {
        scanf("%d %d" , &k , &n);
        for(int i = 1 ; i <= k ; i ++) a[0][i] = i;
        for(int i = 1 ; i <= n ; i ++)
        {
            scanf("%d %d" , &l , &r);
            for(int j = 1 ; j <= k ; j ++) a[i][j] = a[i-1][j];
            for(int j = l , s = r; j <= s ; j ++ , s -- )
            {
                swap(a[i][j] , a[i][s]);
            }
        }
        scanf("%d" , &q);
        mem(ans , 0);
        long long res , tmp , cnt = 0;
        for(int i = 0 ; i < q ; i ++)
        {
            scanf("%d %d" , &l , &r);
            l--;
            //cout << l <<
            for(int j = 1 ; j <= k ; j ++)
            {
                for(int s = 1 ; s <= k ; s ++)
                {
                    if(a[l][j] == a[r][s])
                    {
                        ans[s] = j;
                        //cout << ans[s] << endl;
                        break;
                    }
                }
            }
            tmp = 23 , res = 0;
            for(int j = 1 ; j <= k ; j ++)
            {
                //cout << ans[j] << " ";
                res = (res + tmp * ans[j] % MOD) % MOD;
                tmp *= 23;
                tmp %= MOD;
            }
            //cout << endl;
            cnt += res;
            cnt %= MOD;
           // printf("%lld\n" , res);
        }
        printf("%lld\n" , cnt);
    }
    return 0 ;
}



你可能感兴趣的:(cug1699数组反转)