目录
期间分配
看了三道题,最开始有思路的T2
可以写交集,并判断集合是否相等,但介于操作次数多,TLE在所难免
或者建树,可以用匹配节点,再或按边匹配
哈哈 再见
10++min
T3题意易于理解得像坑
于是拥抱T1
算法不够,硬推来凑
因为所求区间里的每一个数据都只有一个固定的结束位置
(即会在遇到这一位置的二元组时,入栈)
做预处理,求出固定位置
将区间左侧与固定位置比较,求出和
开始思路乱,数组名写颠倒了,导致花时间在这个地方debug(礼貌微笑)
样例及自测数据过,提供数据由于粘贴时无空格,放弃(其实可以用测试器)
时至90min
回头看T3
印象里能在题意里征服数据范围的,分治、矩阵,但抽丝剥茧也挂不上
最后暴力,简化,调试,简化,调试
+30min
决定搞T2的交集和树
交集搞离散化,看到数据范围,弃了
树排序卡了,匹配卡了
得意哈哈,果然不出所料
+40min
之后是大型冥(水)顽(出)抵(自)抗(我)现场
部分题目总结
丹钓战stack
做了一个预处理的简化,再一个简单的函数求值结束,摘取TLE桂冠
#include<bits/stdc++.h>//TLE代码
using namespace std;
const int N=5e5+1;
int T,n,l,r,top,a[N],b[N],stk[N],res[N];
inline int read() {
register int x=0,f=0;
register char ch=getchar();
while(!isdigit(ch)) f=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x; }
void work(int x,int y) {
int total=1,st=x;
for(register int i=x+1; i<=y; i++) {
if(res[i]<st) total++,st=i; }
printf("%d\n",total); }
int main() {
n=read(),T=read();
for(register int i=1; i<=n; i++) a[i]=read();
for(register int i=1; i<=n; i++) b[i]=read();
for(register int i=n; i; i--) {
while(top&&b[stk[top-1]]<b[i]&&a[stk[top-1]]!=a[i])
res[stk[top-1]]=i,top--;
stk[top++]=i; }
while(T--) l=read(),r=read(),work(l,r);
return 0; }
能想到的缩短时间,也只有上述两个操作处
明显求值操作是有工夫可下的,因为操作有重叠,且计算有规律可循
for for的数据,先天可以从一维上的处理变成二维,纵向的搞数位,就爽起来了
貌似就是什么二维偏序
为了配合这一操作的精简,预处理上也有改变
所以AC代码如下
(附:23的边界贴合数据范围)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1;
int T,n,l,r,top,a[N],b[N],stk[N];
int p[N],res[N][24];
inline int read() {
register int x=0,f=0;
register char ch=getchar();
while(!isdigit(ch)) f=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x; }
void work(int x,int y) {
int total=1,st=x;
for(register int i=23; i>=0; i--) {
if(!res[st][i]) continue;
if(res[st][i]>y) continue;
total+=(1<<i),st=res[st][i]; }
printf("%d\n",total); }
int main() {
n=read(),T=read();
for(register int i=1; i<=n; i++) a[i]=read();
for(register int i=1; i<=n; i++) b[i]=read();
for(register int i=1; i<=n; i++) {
while(top&&(a[stk[top]]==a[i]||b[stk[top-1]]<b[i]))
res[stk[top]][0]=i,top--;
stk[++top]=i; }
for(register int i=n; i; i--)
for(register int j=1; j<=23; j++)
if(res[res[i][j-1]][j-1])
res[i][j]=res[res[i][j-1]][j-1];
else break;
while(T--) l=read(),r=read(),work(l,r);
return 0; }
小结
第一次时间长至 4x60 min 写题,T1捞几个点,T3捞一个点
写题时:有被爽到,莫名过瘾
估分时:心塞ing
恢复理智后
无论思路,实现到代码上总是需要调试和debug
(比起前几个月,现在能调试过,可喜可贺)
可以理解有很多算法不会,但至于像雨后春笋一样冒出来不(彻底疯狂)
好吧,很至于
拒绝隔离图论,对各类天马行空say 886