重要的不是你做了多少事,而是你放了多少心思进去。

T1 a

解题思路

总结一下,是双指针运用不够熟练(zxb笑了笑)。

其实这个题是可以用树状数组卡过的(众所周知我是一个正直的人),但是一定是要打正解的。

树状数组比较好像,就和 入阵曲 一样只不过这个维护的是个范围。

因此需要树状数组维护前缀和,时间复杂度就多了一个 log

首先,这个数据范围明显是让我们 \(n^2m\) 跑过。

因此先枚举矩形的上边界,接着枚举列。

然后双指针扫比当前左边界为大矩形左边界,右边界为当前扫到列的矩形大的部分刚好在 \([l,r]\) 的列

注意卡一下边界,对于 \(l=0,r=n\times m\) 的需要特殊判断一下。

code

57pts 树状数组

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=40,M=5e4+10,K=N*M;
int n,m,ans,li,ri,s[N][M],pre[N][M],tre[K];
char ch[M];
int lowbit(int x)
{
return x&(-x);
}
void insert(int x,int num)
{
for(int i=x+1;i<=pre[n][m]+1;i+=lowbit(i))
tre[i]+=num;
}
int query(int x)
{
if(x<0) return 0;
int sum=0;
for(int i=x+1;i;i-=lowbit(i))
sum+=tre[i];
return sum;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=m;j++)
s[i][j]=ch[j]-'0';
}
scanf("%lld%lld",&li,&ri);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+s[i][j];
ri=min(ri,pre[n][m]);
insert(0,1);
for(int i=0;i<n;i++)
for(int j=i+1;j<=n;j++)
{
for(int k=1;k<=m;k++)
{
int tmp=pre[j][k]-pre[i][k];
//cout<<i<<' '<<j<<' '<<k<<" "<<tmp<<' '<<query(tmp-li)<<' '<<query(tmp-ri-1)<<endl;
ans+=query(tmp-li)-query(tmp-ri-1);
//if(tmp)
insert(pre[j][k]-pre[i][k],1);
}
//memset(tre,0,sizeof(tre));
for(int k=1;k<=m;k++)
if(pre[j][k]-pre[i][k]>=0)
insert(pre[j][k]-pre[i][k],-1);
}
printf("%lld",ans);
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=40,M=5e4+10,K=N*M;
int n,m,ans,li,ri,s[N][M],pre[N][M],l[M],r[M];
char ch[M];
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=m;j++)
s[i][j]=ch[j]-'0';
}
scanf("%lld%lld",&li,&ri);
if(!li&&ri==m*n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans+=(n-i+1)*(m-j+1);
printf("%lld",ans);
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+s[i][j];
ri=min(ri,pre[n][m]);
for(int i=0;i<n;i++)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(int j=0;j<m;j++)
{
for(int k=i+1;k<=n;k++)
{
int num=pre[k][j]-pre[i][j];
while(l[k]<m&&pre[k][l[k]]-pre[i][l[k]]-num<li) l[k]++;
while(r[k]<m&&pre[k][r[k]+1]-pre[i][r[k]+1]-num<=ri) r[k]++;
if(l[k]==m&&pre[k][l[k]]-pre[i][l[k]]-num<li) continue;
ans+=r[k]-l[k]+1;
}
}
}
printf("%lld",ans);
return 0;
}

T2 b

解题思路

显然是枚举 gcd 。

接下来对于重复的部分直接暴力容斥算回去。

问题转换为: 对于\(i \in [1,10^5]\)求多少种选择方案使得选的所有数均为 i 的倍数。

预处理出每一行中每一个数字的个数 记为 \(cnt_{i,j}\)

最后的答案就是 \(\prod\limits_{i=1}^{n}(cnt_{i,j}+1) -1\) 种方案。

毕竟要算上 0 的情况,去掉都是 0 的情况。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=30,M=1e5+10,mod=1e9+7;
int n,m,ans,mx,s[N][M],cnt[N][M],all[M];
signed main()
{
n=read(); m=read();
for(int i=1,x;i<=n;i++)
for(int j=1;j<=m;j++)
{
x=read();
s[i][x]++;
mx=max(mx,x);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=mx;j++)
for(int k=1;k*j<=mx;k++)
cnt[i][j]+=s[i][j*k];
for(int i=mx;i>=1;i--)
{
bool flag=false;
for(int j=1;j<=n;j++)
flag|=(cnt[j][i]!=0);
if(!flag) goto V;
all[i]=1;
for(int j=1;j<=n;j++)
all[i]=all[i]*(cnt[j][i]+1)%mod;
all[i]=(all[i]-1+mod)%mod;
for(int j=2;i*j<=mx;j++)
all[i]=(all[i]-all[i*j]%mod+mod)%mod;
V:;
}
for(int i=1;i<=mx;i++)
ans=(ans+all[i]*i%mod)%mod;
printf("%lld",ans);
return 0;
}

T3 c

解题思路

点分治

首先可以发现其实这就是一棵树,每一条边可能会有多种颜色。

然后每一条边最多留下三种颜色就不会影响我们的答案(贪心,抽屉原理)。

在对于颜色去重之后离线点分治。

每层跑一遍,\(dp_{i,j,k}\):分治中心 focus 到 i 的路径中,第一条边的颜色为j,最后一条边颜色为 k 的最优解。

首先是点权下放,然后暴力枚举 focus,x,y 的四条边的眼色就好了。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e5+10,M=3e5+10,Q=1e5+10;
int n,m,qus,focus,root,tot,ans[Q],siz[N],rt[N],w[N][5],cnt[N],f[N][5][5];
bool vis[N];
vector<pair<int,int> > v[N],q[N];
vector<pair<int,vector<int> > > e[N];
void pre_dfs(int x,int fat)
{
sort(v[x].begin(),v[x].end());
v[x].erase(unique(v[x].begin(),v[x].end()),v[x].end());
for(int i=0,j;i<v[x].size();i=j)
{
int to=v[x][i].first;
for(j=i+1;j<v[x].size();j++)
if(v[x][j].first!=to)
break;
if(to==fat) continue;
e[x].push_back(make_pair(to,vector<int>()));
e[to].push_back(make_pair(x,vector<int>()));
for(int k=i;k<j&&k<i+3;k++)
{
e[x].back().second.push_back(v[x][k].second);
e[to].back().second.push_back(v[x][k].second);
}
pre_dfs(to,x);
}
}
void get_focus(int x,int all,int fat)
{
siz[x]=1;
int maxn=0;
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].first;
if(to==fat||vis[to]) continue;
get_focus(to,all,x);
maxn=max(maxn,siz[to]);
siz[x]+=siz[to];
}
maxn=max(all-siz[x],maxn);
if(maxn<tot)
tot=maxn,focus=x;
}
void work(int x,int fat)
{
siz[x]=1;
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].first;
if(to==fat||vis[to]) continue;
for(int j=0;j<e[x][i].second.size();j++)
w[to][j+1]=e[x][i].second[j];
cnt[to]=e[x][i].second.size();
for(int l=1;l<=cnt[root];l++)
for(int j=1;j<=cnt[to];j++)
for(int k=1;k<=cnt[x];k++)
if(w[x][k]==w[to][j]) f[to][l][j]=max(f[to][l][j],f[x][l][k]);
else f[to][l][j]=max(f[to][l][j],f[x][l][k]+1);
work(to,x);
siz[x]+=siz[to];
}
}
void query(int x,int fat)
{
for(int i=0;i<q[x].size();i++)
{
int num=q[x][i].second,id=q[x][i].first;
if(!rt[num]&&num!=focus) continue;
if(num==focus)
{
for(int j=1;j<=cnt[root];j++)
for(int k=1;k<=cnt[x];k++)
ans[id]=max(ans[id],f[x][j][k]);
continue;
}
for(int j=1;j<=cnt[root];j++)
for(int k=1;k<=cnt[rt[num]];k++)
for(int a=1;a<=cnt[x];a++)
for(int b=1;b<=cnt[num];b++)
if(w[rt[num]][k]==w[root][j]) ans[id]=max(ans[id],f[x][j][a]+f[num][k][b]-1);
else ans[id]=max(ans[id],f[x][j][a]+f[num][k][b]);
}
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].first;
if(to==fat||vis[to]) continue;
query(to,x);
}
}
void clear(int x,int fat)
{
rt[x]=0;
memset(f[x],0,sizeof(f[x]));
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].first;
if(to==fat||vis[to]) continue;
clear(to,x);
}
}
void mark(int x,int fat)
{
rt[x]=root;
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].first;
if(vis[to]||to==fat) continue;
mark(to,x);
}
}
void solve(int x,int all)
{
tot=all;
get_focus(x,all,0);
clear(focus,0);
vis[focus]=true;
int tmp=focus;
for(int i=0;i<e[tmp].size();i++)
{
int to=e[tmp][i].first;
if(vis[to]) continue;
cnt[to]=e[tmp][i].second.size();
for(int j=0;j<e[tmp][i].second.size();j++)
w[to][j+1]=e[tmp][i].second[j],f[to][j+1][j+1]=1;
root=to;
work(to,tmp);
query(to,tmp);
mark(to,tmp);
}
clear(focus,0);
for(int i=0;i<e[tmp].size();i++)
{
int to=e[tmp][i].first;
if(vis[to]) continue;
solve(to,siz[to]);
}
}
signed main()
{
n=read(); m=read();
for(int i=1,x,y,val;i<=m;i++)
{
x=read(); y=read(); val=read();
v[x].push_back(make_pair(y,val));
v[y].push_back(make_pair(x,val));
}
pre_dfs(1,0);
qus=read();
for(int i=1,x,y;i<=qus;i++)
{
x=read(); y=read();
q[x].push_back(make_pair(i,y));
q[y].push_back(make_pair(i,x));
}
solve(1,n);
for(int i=1;i<=qus;i++)
printf("%lld\n",ans[i]);
return 0;
}

8.13考试总结(NOIP模拟38)[a·b·c]的更多相关文章

  1. 2021.8.13考试总结[NOIP模拟38]

    T1 a 入阵曲.枚举矩形上下界,之后从左到右扫一遍.用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减. $code:$ 1 #include<bits/st ...

  2. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  3. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  4. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  5. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  6. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  7. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  8. 「考试」noip模拟9,11,13

    9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...

  9. Noip模拟38 2021.8.13

    T1 a 跟入阵曲很像,但是忘记入阵曲这题的思路是什么了 这里再提一下,入阵曲是子矩阵和是$k$的倍数,这道题目是子矩阵和是在一段区间内$[L,R]$ 因为这道题$n$特别小,$m$较大,考虑复杂度为 ...

  10. [考试总结]noip模拟13

    因为最近考试频繁,所以咕掉了好长时间... 淦,刚说完又来一场... 先咕了,等以后有时间再写.... 回来了... 首先看到这个题目们,感觉就不存好意... 然后开始开 \(T1\). 只能蒻蒻地按 ...

随机推荐

  1. VulnHub-Jangow-01-1.0.1打靶记录

    知识点 NMAP参数 -sV 获取系统信息 -sT TCP扫描可能会留下日志记录 -sC 使用默认脚本(在-A模式下不需要) -p1-xxx 扫描端口号 -p- ==>等价于 -p1-65535 ...

  2. 前端之多线程 ---webworker

    一.啥是workerJavaScript为单线程,worker则为JavaScript创建多线程环境.使用场景如:计算文件hash,计算大于1G的文件hash过程是很慢的,但由于要将hash传给后端, ...

  3. Flink Standalone集群部署

    Flink Standalone模式部署集群是最简单的一种部署方式,不依赖于其他的组件,另外还支持YARN/Mesos/Docker等模式下的部署,这里使用的flink版本为最新的稳定版1.9.1版本 ...

  4. 力扣657(java & python)-机器人能否返回原点(简单)

    题目: 在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串 moves 表示.字符 move[i] 表示 ...

  5. 基于 Flutter 的 Web 渲染引擎「北海」正式开源!

    简介: 阿里巴巴历时 3 年自研开发的 Web 渲染引擎北海(英文名:Kraken)正式开源,致力打造易扩展,跨平台,高性能的渲染引擎,并已在优酷.大麦.天猫等业务场景中使用. 作者 | 染陌来源 | ...

  6. 深度干货|云原生分布式数据库 PolarDB-X 的技术演进

    简介: 深入解读PolarDB-X的产品架构,以及分布式事务.透明分布式.水平扩展等技术内幕. 一.PolarDB-X是什么 PolarDB-X最早起源于阿里集团2009年提出用分布式架构替代传统商业 ...

  7. 3. ETCD数据备份与恢复

    首先为运行在https://127.0.0.1:2379 上的现有etcd实例创建快照并将快照保存到 /srv/data/etcd-snapshot.db. 注:为给定实例创建快照预计能在几秒钟内完成 ...

  8. C# - 能否让 SortedSet.RemoveWhere 内传入的委托异步执行

    TL;DR; 若想充分利用 RemoveWhere 带来的性能优势,建议传入判断是否删除元素的委托内采取同步操作.若一定要在该委托内使用异步操作,可以采用本文中绕行的方法,但摈弃了 RemoveWhe ...

  9. QT使用外部库

    一.简述 当QT使用第三方库时,编译会报错,哪怕是使用linux下的软件库时都有可能报错,所以在使用的时候需要添加一下外部库的路径,这里我以mosquitto的库函数为例,主要的导入方式有两种. 二. ...

  10. 【爬虫实战】用python爬今日头条热榜TOP50榜单!

    目录 一.爬取目标 二.爬取结果 三.代码讲解 四.技术总结 五.演示视频 六.附完整源码 一.爬取目标 您好!我是@马哥python说,一名10年程序猿. 今天分享一期爬虫案例,爬取的目标是:今日头 ...