本文主要是介绍【Codeforces Round 263 (Div 2)E】【坐标映射 脑洞】Appleman and a Sheet of Paper 折纸游戏 区间查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 1e5+10, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int n, q;
int o, p, l, r;
int a[N];
int s[N];
int L, R; bool flip;
void init()
{L = 1; R = n;for (int i = 1; i <= n; ++i){a[i] = 1;s[i] = s[i - 1] + a[i];}flip = 0;
}
void solve()
{while (q--){scanf("%d", &o);if (o == 1){int len = R - L + 1;scanf("%d", &p);if (!flip){//翻转部分更少,我们进行翻转if (p <= len - p){int l = L + p;int r = L + p + p - 1;int U = l + l - 1;s[l - 1] = 0;for (int i = l; i <= r; ++i){a[i] += a[U - i];s[i] = s[i - 1] + a[i];}L += p;}//不翻转部分更少,我们反向操作else{p = len - p;int l = R - p - p + 1;int r = R - p;int U = r + r + 1;for (int i = l; i <= r; ++i){a[i] += a[U - i];s[i] = s[i - 1] + a[i];}R -= p;flip = 1;}}else{//翻转部分更少,我们进行翻转if (p <= len - p){int l = R - p - p + 1;int r = R - p;int U = r + r + 1;for (int i = l; i <= r; ++i){a[i] += a[U - i];s[i] = s[i - 1] + a[i];}R -= p;}//不翻转部分更少,我们反向操作else{p = len - p;int l = L + p;int r = L + p + p - 1;int U = l + l - 1;s[l - 1] = 0;for (int i = l; i <= r; ++i){a[i] += a[U - i];s[i] = s[i - 1] + a[i];}L += p;flip = 0;}}}else{scanf("%d%d", &l, &r); --r;int ans;if (!flip)ans = s[L + r] - s[L + l - 1];else ans = s[R - l] - s[R - r - 1];printf("%d\n", ans);}}
}
int main()
{while (~scanf("%d%d", &n, &q)){init();solve();}return 0;
}
/*
【trick&&吐槽】
CFdiv2E并不一定很难。毕竟诗诗都想出来怎么做了233>_<【题意】
给你一张1*n(1e5)的纸条,纸条上有0~n共计n个刻度。
我们有q(1e5)个操作。
对于每个操作,有两种类型:
(1,pi),表示我们把纸条的[0,pi]向右翻转。
(2,l,r),表示我们查询l~r区间段有多少个纸条单位【类型】
复杂度分析 坐标映射【分析】
其实,我们每次只要翻转较小的一侧就好了。
唯一需要处理的是坐标映射。
我们只要记录一个实际区间,同时记录flip表示是否翻转过。
如果未翻转过,操作从从左往右翻转,从左往右查询。
如果翻转过,操作从右向左翻转,从右向左查询【时间复杂度&&优化】
总翻转长度不会超过n,复杂度为O(n)【数据】
10 100
1 9
2 0 1
2 0 2
2 0 3
2 0 9*/
这篇关于【Codeforces Round 263 (Div 2)E】【坐标映射 脑洞】Appleman and a Sheet of Paper 折纸游戏 区间查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!