cug1699数组反转

来源:互联网 发布:linux查内存 编辑:程序博客网 时间:2024/06/05 18:31

题目大意:

题目描述:


input:


output:




思路:记录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 longtypedef 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 ;}



0 0