/* 此题最初太过想当然了,非常不好,当初TLE的时候,也没有想想能不能用更好的方法,毕竟排序的效率应该没有查找快,而我...每次都要用memcpy复制页数的顺序,每次都要调用一次sort()函数,应该会产生不小的时间开销 后来发现,真的有简单的思路,而且不止一种 1. 可以找到[l,r]区间对应的位置的数组元素中,页码比x对应的页码小的个数,记作tot,若l+tot==x,则没有变动,否则变动 2. 也可以分别统计,[l,x]区间对应的位置的数组元素中,页码比x大的,和[x,r]区间对应的位置的数组元素中,页码比x小的个数,若两者相等,则不会变动,否则变动 参考借鉴至网址: http://blog.csdn.net/szh_0808/article/details/72793597 再次提醒: 不要想当然,不要想当然!!!第一时间能想到的方法,往往不是效率最高的 再贴上自己的TLE代码,以防止重蹈覆辙! //Time limit exceeded on test 35 #include <bits/stdc++.h> using namespace std; const int N = 10005; int a[N], b[N]; struct change { int l, r, x; int notchanged() { sort(b+l-1, b+r); return (b[x-1] == a[x-1])?1:0; } }c[N]; istream& operator >> (istream&in, change &d) { in >> d.l >> d.r >> d.x; return in; } int main() { cin.tie(0); cin.sync_with_stdio(false); int n, m; cin >> n >> m; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < m; i++) { cin >> c[i]; } for (int i = 0; i < m; i++) { if (c[i].l == c[i].r || c[i].x < c[i].l || c[i].x > c[i].r) { cout << "Yes" << endl; continue; } memcpy(b, a, sizeof(int)*n); if (c[i].notchanged()) cout << "Yes" << endl; else cout << "No" << endl; } return 0; } 另外注意这句话的理解: For every of such sorting Vladik knows number x — what index of page in permutation he should read. x表示的是,它是在整个全排列中的第几个,而不是表示在[l,r]中的第几个 */
#include <bits/stdc++.h> using namespace std; const int N = 1e4 + 10; int a[N]; struct change { int l, r, x; void solve1() { if (l == r) { cout << "Yes" << endl; return; } int s1 = 0, s2 = 0; for (int i = l; i <= x; i++) { if ( a[i] > a[x] ) s1++; } for (int i = x; i <= r; i++) { if ( a[i] < a[x] ) s2++; } if (s1 == s2) cout << "Yes" << endl; else cout << "No" << endl; } void solve2() { if ( l == r ) { cout << "Yes" << endl; return; } int s = 0; for (int i = l; i <= r; i++) if ( a[i] < a[x] ) s++; if ( s + l == x ) cout << "Yes" << endl; else cout << "No" << endl; } }c[N]; istream& operator >> (istream&in, change &d) { in >> d.l >> d.r >> d.x; return in; } int main() { int n, m; while (cin >> n >> m) { for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= m; i++) cin >> c[i]; for (int i = 1; i <= m; i++) c[i].solve2(); } return 0; }