[考试反思]0507省选模拟90:信任

[考试反思]0507省选模拟90:信任

$STL$这种东西你真是不用还不行用了出锅了你还没话说。。。

$T1$想到正解的一半(而且也写了一半)突然发现不对劲就扔了。

$T2$是个构造。$yy$了半小时虽然不会严谨证但是大概是对的。

写完之后发现过不了样例就懵了,发现少考虑一种边界情况。

结果判这个边界用了好久好久。

并没有给$T3$时间然后我就结束了。

结果$T2$莫名$RE$。把$sort$改成$stable\ sort$就行了。到现在还不明白原理。

反正以后尽量用$stable\ sort$吧。

 

T1:洛希极限

大意:网格图有$q$矩形,可以从任意点出发任意点结束,每次可以从$(x_1,y_1)$跳到$(x_2,y_2)$当且仅当$x_1<x_2,y_1<y_2$且两个点同时存在于某一个矩形中。

求最多跳几步以及跳这么多步的方案数。多测$T \le 10^5,n,m \le 2 \times 10^3,\sum q \le 5 \times 10^5$

设$dp[i][j]$表示最后一次跳到$(i,j)$的最多步数及方案数。枚举点枚举矩形$O(n^2m^2q)$。

发现最优决策下每一步中,都至少有一个维度的变化量恰好为$1$。

所以我们只要预处理出每个点能从上一行/列的最左/上端那个位置开始转移,然后枚举就好了。$O(qnm+nm^2)$

复杂度变成了两部分。后面这个比较要命(是吗。。?)先来优化这个:

可以发现当你枚举的点右移一个时,转移的左端点不可能左移。也就是说具有单调性,可以单调队列优化。

但是比较麻烦的一点在于,最大值很好统计,但是你还要方案数,也就是说队列里可能堆着很多最大值一样的点。

然后你每次查询的是与最大值相等的点的方案数的和,偶尔还要弹掉队首的一个点。

其实只需要额外维护一个桶来存每种权值的方案数,出入队的时候更新一下桶就行了。

维护了$n+m$个桶和队列,但并不是更新完一个点的权值就加入,而是用到的时候再插入。我思维僵化了。

这样$dp$部分的复杂度下降至线性。总复杂度$O(qn+nm)$。理论很大但是$cbx$实测可以$AC$

(自然也用到了下边这种思想,只不过暴力标记了每一行而已)

考虑优化前半部分。可以拆分成若干这样的问题:对于第$[u,d]$行,每行的$[l,r]$区间对$l$取$min$

我思维僵化,最开始的想法是从上到下($u \rightarrow d$方向)扫描线,$u$时插入$d+1$时删除。然而发现自己并不会删除。

但是由于这道题的特殊性,如果我们从右到左($r \rightarrow l$方向)做扫描线,发现就不需要删除了。

因为可以发现对于$i \le l$的点,你说更新它们的左端点是$l$,显然是没有意义的。反正最后都可以对$i$取$min$

所以就直接做区间取$min$的线段树,每行列扫到的时候遍历一下线段树是$O(n)$的。

所以这一部分的总复杂度就是$O(nm+q\ log\ n)$了。总复杂度也就对了。然而我跑不过$cbx$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int mod=1e9+7,N=2002;
 4 vector<int>ql[N],qr[N],qv[N],Ql[N],Qr[N],Qv[N];
 5 int t,n,m,q;
 6 int mo(int x){return x>=mod?x-mod:x;}
 7 int add(int&x,int y){x=mo(x+y);}
 8 int dec(int&x,int y){x=mo(x-y+mod);}
 9 struct D{
10     int w,p;
11     D operator+(D x){return w==x.w?(D){w,mo(p+x.p)}:(w>x.w?*this:x);}
12 }w[N][N],E,ans;
13 int nt[N<<2],lim[N],lp[N][N],up[N][N];
14 #define lc p<<1
15 #define rc lc|1
16 #define md (L+R>>1)
17 void build(int p=1,int L=1,int R=1){
18     nt[p]=N;if(L==R)return;
19     build(lc,L,md);build(rc,md+1,R);
20 }
21 void add(int l,int r,int x,int p,int L,int R){
22     if(x>nt[p])return;
23     if(l<=L&&R<=r){nt[p]=min(nt[p],x);return;}
24     if(l<=md)add(l,r,x,lc,L,md); if(r>md)add(l,r,x,rc,md+1,R);
25 }
26 void print(int x,int p,int L,int R){
27     x=min(x,nt[p]);if(L==R){lim[L]=x;return;}
28     print(x,lc,L,md);print(x,rc,md+1,R);
29 }
30 struct que{
31     int buc[N],pos[N],h,t;D v[N];
32     void push(int i,D x){
33         while(t>=h&&v[t].w<x.w)buc[v[t--].w]=0;
34         add(buc[x.w],x.p);v[++t]=x;pos[t]=i;
35     }
36     D top(int l){
37         while(t>=h&&pos[h]<l)dec(buc[v[h].w],v[h].p),h++;
38         return h>t?(D){0,0}:(D){v[h].w,buc[v[h].w]};
39     }
40     void clear(){while(t>=h)buc[v[t--].w]=0;h=1;t=0;}
41 }qC[N],qR[N];
42 int main(){scanf("%d",&t);while(t--){
43     scanf("%d%d%d",&n,&m,&q);
44     for(int i=1;i<=m;++i)ql[i].clear(),qr[i].clear(),qv[i].clear(),qC[i].clear();
45     for(int i=1;i<=n;++i)Ql[i].clear(),Qr[i].clear(),Qv[i].clear(),qR[i].clear();
46     for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)w[i][j]=E;ans=E;
47     for(int i=1;i<=q;++i){
48         int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
49         if(a==c||b==d)continue;
50         Ql[c].push_back(b+1);Qr[c].push_back(d);Qv[c].push_back(a);
51         ql[d].push_back(a+1);qr[d].push_back(c);qv[d].push_back(b);
52     }
53     build(1,1,n);
54     for(int i=m;i;--i){
55         for(int j=0;j<ql[i].size();++j)add(ql[i][j],qr[i][j],qv[i][j],1,1,n);
56         print(m,1,1,n); for(int j=1;j<=n;++j)lp[j][i]=min(i,lim[j]);
57     }
58     build(1,1,m);
59     for(int i=n;i;--i){
60         for(int j=0;j<Ql[i].size();++j)add(Ql[i][j],Qr[i][j],Qv[i][j],1,1,m);
61         print(n,1,1,m); for(int j=1;j<=m;++j)up[i][j]=min(i,lim[j]);
62     }
63     for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
64         w[i][j]=(D){0,1};
65         if(i>1&&j>1)qR[i-1].push(j-1,w[i-1][j-1]); if(j>1&&i>2)qC[j-1].push(i-2,w[i-2][j-1]);
66         w[i][j]=w[i][j]+qR[i-1].top(lp[i][j])+qC[j-1].top(up[i][j]);
67         w[i][j].w++;ans=ans+w[i][j];
68     }printf("%d %d\n",ans.w,ans.p);
69 }}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案