题解 CF896E 【Welcome home, Chtholly】
rui_er
2020-09-06 14:32:12
**注:由于暂时没写正解,因此本文暂不提交题解,且可能没有严格遵守题解规范。**
题意简述:$n$ 个数,$m$ 次操作。操作一,将 $l\sim r$ 间所有大于 $x$ 的数减去 $x$;操作二,查询 $l\sim r$ 间恰好等于 $x$ 的数的个数。
---
思路:
由乃题有啥好想的,直接去分块+卡常!但是……这题就有那么亿点点毒瘤,你怎么都不会。根据
> 没有什么是暴力解决不了的,如果有,那就去卡常。
的思想,你就去写了一个 $O(m\times n)$ 的暴力。~~然后去看看数据范围,发现是 $10^5$,就把写的东西删掉了。~~
等等,你真的打算删掉?那你可能不知道**指令集**的强大之处!指令集可以帮你:
> $n$ 方过百万,暴力碾标算!
正如第一篇题解 [Link](/blog/finder-iot/solution-cf896e) 所说:
> 对于这一题来说,在不更改数据大小,时间限制和内存限制的时候,如果我这个程序是正解,那么你可能可以很轻松地卡掉;但如果这个程序用的是指令集暴力,那么你想都别想。
不过我中间 TLE 过一次,原因也很简单:指令集没加够。
最终代码:
```cpp
//By: Luogu@rui_er(122461)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("unroll-loops")
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, m, a[N];
int main() {
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++) scanf("%d", &a[i]);
while(m--) {
int op, l, r, x;
scanf("%d%d%d%d", &op, &l, &r, &x);
if(op == 1) {
for(int i=l;i<=r;i++) a[i] -= (a[i] > x) ? x : 0;
}
else {
int ans = 0;
for(int i=l;i<=r;i++) ans += (a[i] == x);
printf("%d\n", ans);
}
}
return 0;
}
```
---
但是以我们优(du)秀(liu)的品质,只把这题暴力过去怎么行呢?刚好有一道加强版:\[Ynoi2018\]五彩斑斓的世界 [Link](/problem/P4117)
我们发现内存限制缩小了,数据范围扩大了,只好去写正解。
思路:
【未完待续,以后有时间补】