2021.8.13考试总结[NOIP模拟38]
T1 a
入阵曲。枚举矩形上下界,之后从左到右扫一遍。用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减。
$code:$


1 #include<bits/stdc++.h>
2 #define LL long long
3 #define rin register signed
4 using namespace std;
5 const int NN=5e4+5;
6 int n,m,l,r,mat[35][NN],pre[35][NN],ext;
7 LL ans;
8 char zo[NN];
9 bool jz,jo,skip;
10 inline int read(){
11 int x=0,f=1; char ch=getchar();
12 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
13 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
14 return x*f;
15 }
16 inline void write(LL x,char sp){
17 char ch[20]; int len=0;
18 if(x<0){ putchar('-'); x=~x+1; }
19 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
20 for(rin i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
21 }
22 struct tree_array{
23 int c[35*NN];
24 inline int lowbit(int x){ return x&(-x); }
25 inline void insert(int pos){
26 while(pos<=max(r,pre[n][m]+1)){
27 c[pos]++;
28 pos+=lowbit(pos);
29 }
30 }
31 inline int query(int pos){
32 int res=0;
33 while(pos>0){
34 res+=c[pos];
35 pos-=lowbit(pos);
36 }
37 return res;
38 }
39 inline void clear(int pos){
40 while(pos<=max(r,pre[n][m]+1)){
41 if(!c[pos]) break;
42 c[pos]=0;
43 pos+=lowbit(pos);
44 }
45 }
46 }t;
47 void spj(){
48 if(!jo){ puts("0"); skip=1; return; }
49 if(l==0&&r==m*n){
50 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
51 ans+=(n-i+1)*(m-j+1);
52 write(ans,'\n'); skip=1;
53 return;
54 }
55 if(!jz){
56 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
57 if(i*j>=l&&i*j<=r) ans+=(n-i+1)*(m-j+1);
58 write(ans,'\n'); skip=1;
59 return;
60 }
61 }
62 signed main(){
63 n=read(); m=read();
64 for(rin i=1;i<=n;i++){
65 scanf("%s",zo+1);
66 for(rin j=1;j<=m;j++){
67 mat[i][j]=(zo[j]=='1');
68 if(mat[i][j]) jo=1;
69 if(!mat[i][j]) jz=1;
70 pre[i][j]=pre[i][j-1]+mat[i][j];
71 }
72 for(rin j=1;j<=m;j++) pre[i][j]+=pre[i-1][j];
73 }
74 l=read(); r=read();
75 spj(); if(skip) return 0;
76 for(rin i=0;i<n;i++) for(rin j=i+1;j<=n;j++){
77 for(rin k=1;k<=m;k++){
78 int res=pre[j][k]-pre[i][k]+1;
79 ans+=t.query(res-l)-t.query(res-r-1);
80 t.insert(res);
81 }
82 ans+=t.query(r+1)-t.query(l);
83 for(rin k=1;k<=m;k++) t.clear(pre[j][k]-pre[i][k]+1);
84 }
85 write(ans,'\n');
86 return 0;
87 }
T1
T2 b
单独考虑每个$gcd$的贡献,问题转化为求每个$gcd$的方案数。
值域只有$1e5$,可以直接约数分解,统计每行中有几个$j$的倍数,记为$cnt_{i,j}$。
对每个$i$,令最终$gcd$为$i$的倍数的方案为$(\prod_{i=1}^{i\leq n}(cnt_{i,j}+1))-1$。
之后容斥求出最终$gcd$为$i$的方案数即可。
$code:$


1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int NN=1e5+5,p=1e9+7;
5 int a[21][NN],n,m,ans,cnt[21][NN],sum[NN];
6 vector<int>vec[NN];
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 inline void write(int x,char sp){
14 char ch[20]; int len=0;
15 if(x<0){ putchar('-'); x=~x+1; }
16 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
17 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
18 }
19 signed main(){
20 n=read(); m=read();
21 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
22 a[i][j]=read(), vec[a[i][j]].push_back(i);
23 for(int i=1e5,sq,ext;i;i--) if(vec[i].size()){
24 sq=sqrt(i); ext=vec[i].size();
25 for(int j=1;j<=sq;j++) if(!(i%j))
26 for(int k=0;k<ext;k++){
27 ++cnt[vec[i][k]][j];
28 if(j*j!=i) ++cnt[vec[i][k]][i/j];
29 }
30 }
31 for(int i=1;i<=1e5;i++){
32 sum[i]=1;
33 for(int j=1;j<=n;j++) (sum[i]*=(cnt[j][i]+1))%=p;
34 sum[i]=(sum[i]-1+p)%p;
35 }
36 for(int i=1e5;i;i--){
37 int tmp=i<<1;
38 while(tmp<=1e5){ sum[i]=(sum[i]-sum[tmp]+p)%p; tmp+=i; }
39 (ans+=sum[i]*i%p)%=p;
40 }
41 write(ans,'\n');
42 return 0;
43 }
T2
T3 c
最小环长度不超过二,其实就是树上有一些重边。发现对于多种颜色重边,只剩下三种不同颜色即可。
点分治,$DP$。建出点分树后将问题转化到$x$,$y$在点分树上的$LCA$上。
设$f_{i,j,k}$表示$i$到当前重心路径上重心端边颜色为$j$,$i$端边颜色为$k$的方案。
$DFS$时记$son_i$为$i$到重心路径中重心的儿子,用于更新答案。
具体见代码。应该很好理解。
$code:$


1 #include<bits/stdc++.h>
2 #define x first
3 #define y second
4 #define pb push_back
5 #define mp make_pair
6 using namespace std;
7 typedef pair<int,int> ii;
8 typedef vector<int> vi;
9 const int NN=2e5+5;
10 struct node{ int id,x,y; };
11 int n,m,q,S,root,ans[NN],f[NN][3][3],dep[NN],fa[NN][20],wt[NN],siz[NN],son[NN];
12 bool vis[NN];
13 vector<ii>vec[NN];
14 vector<int>col[NN];
15 vector<pair<int,vector<int> > >e[NN];
16 vector<node>ask[NN];
17 inline int read(){
18 int x=0,f=1; char ch=getchar();
19 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
20 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
21 return x*f;
22 }
23 inline void write(int x,char sp){
24 char ch[25]; int len=0;
25 if(x<0){ putchar('-'); x=~x+1; }
26 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
27 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
28 }
29 void dfa(int s,int fa){
30 sort(vec[s].begin(),vec[s].end());
31 vec[s].erase(unique(vec[s].begin(),vec[s].end()),vec[s].end());
32 for(int i=0,j;i<vec[s].size();i=j){
33 int v=vec[s][i].x;
34 j=i+1;
35 while(j<vec[s].size()&&vec[s][j].x==v) j++;
36 if(v==fa) continue;
37 e[s].pb(mp(v,vector<int>()));
38 e[v].pb(mp(s,vector<int>()));
39 for(int k=i;k<j&&k<i+3;k++){
40 e[s].back().y.pb(vec[s][k].y);
41 e[v].back().y.pb(vec[s][k].y);
42 }
43 dfa(v,s);
44 }
45 }
46 void getroot(int s,int ff){
47 siz[s]=1; wt[s]=0;
48 for(int i=0;i<e[s].size();i++){
49 int v=e[s][i].x;
50 if(v==ff||vis[v]) continue;
51 getroot(v,s);
52 siz[s]+=siz[v];
53 wt[s]=max(wt[s],siz[v]);
54 }
55 wt[s]=max(wt[s],S-siz[s]);
56 if(wt[s]<wt[root]) root=s;
57 }
58 void build(int s,int ff){
59 fa[s][0]=ff; vis[s]=1; dep[s]=dep[ff]+1;
60 for(int i=1;i<20;i++)
61 fa[s][i]=fa[fa[s][i-1]][i-1];
62 for(int i=0;i<e[s].size();i++){
63 int v=e[s][i].x;
64 if(vis[v]) continue;
65 wt[root=0]=1e9; S=siz[v];
66 getroot(v,0);
67 build(root,s);
68 }
69 }
70 inline int LCA(int x,int y){
71 if(dep[x]>dep[y]) swap(x,y);
72 for(int i=19;~i;i--)
73 if(dep[fa[y][i]]>=dep[x]) y=fa[y][i];
74 if(x==y) return x;
75 for(int i=19;~i;i--)
76 if(fa[x][i]!=fa[y][i]) x=fa[x][i], y=fa[y][i];
77 return fa[x][0];
78 }
79 void dfs(int s,int ff,int rtson){
80 son[s]=rtson;
81 for(int i=0;i<e[s].size();i++){
82 int v=e[s][i].x;
83 if(v==ff||vis[v]) continue;
84 col[v]=e[s][i].y;
85 for(int j=0;j<col[rtson].size();j++)
86 for(int k=0;k<col[v].size();k++){
87 f[v][j][k]=-1e9;
88 for(int l=0;l<col[s].size();l++)
89 f[v][j][k]=max(f[v][j][k],f[s][j][l]+(col[s][l]!=col[v][k]));
90 }
91 dfs(v,s,rtson);
92 }
93 }
94 void calc(int s){
95 vis[s]=1;
96 for(int i=0;i<e[s].size();i++){
97 int v=e[s][i].x;
98 if(vis[v]) continue;
99 col[v]=e[s][i].y;
100 for(int j=0;j<col[v].size();j++)
101 for(int k=0;k<col[v].size();k++)
102 f[v][j][k]=(j==k)?1:-1e9;
103 dfs(v,s,v);
104 }
105 for(int i=0;i<ask[s].size();i++){
106 int x=ask[s][i].x,y=ask[s][i].y,id=ask[s][i].id;
107 if(y==s) swap(x,y);
108 if(x==y) ans[id]=0;
109 else if(x==s)
110 for(int j=0;j<col[son[y]].size();j++)
111 for(int k=0;k<col[y].size();k++)
112 ans[id]=max(ans[id],f[y][j][k]);
113 else
114 for(int j=0;j<col[son[x]].size();j++)
115 for(int k=0;k<col[son[y]].size();k++)
116 for(int l=0;l<col[x].size();l++)
117 for(int o=0;o<col[y].size();o++)
118 ans[id]=max(ans[id],f[x][j][l]+f[y][k][o]-(col[son[x]][j]==col[son[y]][k]));
119 }
120 for(int i=0;i<e[s].size();i++){
121 int v=e[s][i].x;
122 if(vis[v]) continue;
123 S=siz[v]; wt[root=0]=1e9;
124 getroot(v,0);calc(root);
125 }
126 }
127 signed main(){
128 n=read(); m=read();
129 for(int i=1,u,v,w;i<=m;i++){
130 u=read(); v=read(); w=read();
131 vec[u].pb(mp(v,w)); vec[v].pb(mp(u,w));
132 }
133 dfa(1,0);
134 wt[root=0]=S=n;
135 getroot(1,0); build(root,0);
136 q=read();
137 for(int i=1;i<=q;i++){
138 int x=read(),y=read();
139 ask[LCA(x,y)].pb((node){i,x,y});
140 }
141 memset(vis,0,sizeof(vis));
142 wt[root=0]=S=n;
143 getroot(1,0);
144 calc(root);
145 for(int i=1;i<=q;i++) write(ans[i],'\n');
146 return 0;
147 }
T3
2021.8.13考试总结[NOIP模拟38]的更多相关文章
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.8.11考试总结[NOIP模拟36]
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
- 2021.7.29考试总结[NOIP模拟27]
T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.12考试总结[NOIP模拟51]
T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
- 2021.9.7考试总结[NOIP模拟49]
T1 Reverse $BFS$暴力$O(n^2)$ 过程中重复枚举了很多点,考虑用链表记录当前点后面可到达的第一个未更新点. 搜索时枚举翻转子串的左端点,之后便可以算出翻转后$1$的位置. $cod ...
随机推荐
- C# Dapper基本三层架构使用 (四、Web UI层)
三层架构的好处,一套代码无论WinForm还是Web都可以通用,只写前台逻辑就可以了,现在展示Web调用三层的示例 首先在项目中创建一个Web MVC5项目,目前项目目录如下 在Web项目Web.co ...
- FastAPI(2)- 快速入门
安装 FastAPI pip install fastapi # 将来需要将应用程序部署到生产环境可以安装 uvicorn 作为服务器 pip install uvicorn 最简单的代码栗子 fro ...
- Linux内核下包过滤框架——iptables&netfilter
iptables & netfilter 1.简介 netfilter/iptables(下文中简称为iptables)组成Linux内核下的包过滤防火墙,完成封包过滤.封包重定向和网络地址转 ...
- django报错外理收集
网址指向同一地址后: Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message be ...
- 【简单数据结构】二叉树的建立和递归遍历--洛谷 P1305
题目描述 输入一串二叉树,用遍历前序打出. 输入格式 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式 前序 ...
- PDO操作大数据对象
一般在数据库中,我们保存的都只是 int . varchar 类型的数据,一是因为现代的关系型数据库对于这些内容会有很多的优化,二是大部分的索引也无法施加在内容过多的字段上,比如说 text 类型的字 ...
- 一文让你掌握软件测试工程师SQL面试题
数据结构说明 已知有如下4张表: 学生表:student(学号,学生姓名,出生年月,性别) 成绩表:score(学号,课程号,成绩) 课程表:course(课程号,课程名称,教师号) 教师表:teac ...
- python并发与futures模块
非并发程序(用于对比) 从网上下载20个国家的国旗图像: import os import time import sys import requests # 导入requests库 POP20_CC ...
- three.js 纹理动画实现
需求: 1.使用一张长图.分别播放这张长图的不同位置 来达到动态内容的目的 解决方案: 1.纹理创建并指定重复方向:this.texture.wrapS = this.texture.wrapT = ...
- 剑指offer计划27(栈与队列困难)---java
1.1.题目1 剑指 Offer 59 - I. 滑动窗口的最大值 1.2.解法 解题思路:(来自作者bigbeats) 相当于维护一个最大队列(队头元素最大,向队尾非严格递减) 在未形成窗口前,先构 ...