题目大意:
题目描述:
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 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 ; }