2021.6.29考试总结[NOIP模拟10]
T1 入阵曲
二位前缀和暴力n4可以拿60。
观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列,
开一个桶记录模数出现个数,每枚举到该模数就加上它先前出现个数,表示增添了这么多对可被k整除的前缀和。
code:

1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int NN=405;
5 int n,m,k,a[NN][NN],sum[NN][NN],ans,bot[1000010],res[NN];
6 bool check;
7 inline int read(){
8 int x=0;
9 char ch=getchar();
10 while(ch<'0'||ch>'9') ch=getchar();
11 while(ch>='0'&&ch<='9'){
12 x=(x<<1)+(x<<3)+(ch^48);
13 ch=getchar();
14 }
15 return x;
16 }
17 signed main(){
18 n=read(); m=read(); k=read();
19 for(register int i=1;i<=n;++i)
20 for(register int j=1;j<=m;++j) a[i][j]=read();
21 for(register int i=1;i<=n;++i)
22 for(register int j=1;j<=m;++j) sum[i][j]=(sum[i][j-1]+a[i][j])%k;
23 for(register int i=2;i<=n;++i)
24 for(register int j=1;j<=m;++j) sum[i][j]=(sum[i-1][j]+sum[i][j])%k;
25 for(register int i=1;i<=n;i++)
26 for(register int j=0;j<i;j++){
27 for(register int u=1;u<=m;u++){
28 res[u]=(sum[i][u]-sum[j][u]+k)%k;
29 ans+=bot[res[u]]++;
30 }
31 ans+=bot[0]; bot[0]=0;
32 for(register int u=1;u<=m;u++)
33 bot[res[u]]=0;
34 }
35 printf("%d\n",ans);
36 return 0;
37 }
T1
T2 将军令
一眼看上去像个树形DP,但k<=20忒恶心了,跑DP麻烦至极,我两小时打DP爆拿10分(当然也可以做,大概
正解是一个贪心。观察到在深度较深的点驻扎军队更优。所以按深度逆序遍历。
为避免军队范围被浪费,每次发现点未被覆盖时在它的k级父亲处驻扎军队肯定最优。
驻扎时直接暴力DFS即可。
code:

1 #include<bits/stdc++.h>
2 #define re register
3 using namespace std;
4 const int NN=1e5+5;
5 int n,k,t,to[2*NN],nex[2*NN],head[NN],num,fa[NN][21],ans;
6 bool vis[NN];
7 struct node{
8 int id,dep;
9 }nod[NN];
10 inline int read(){
11 int x=0,f=1;
12 char ch=getchar();
13 while(ch<'0'||ch>'9') ch=getchar();
14 while(ch>='0'&&ch<='9'){
15 x=(x<<1)+(x<<3)+(ch^48);
16 ch=getchar();
17 }
18 return x*f;
19 }
20 inline void add(int a,int b){
21 to[++num]=b; nex[num]=head[a]; head[a]=num;
22 to[++num]=a; nex[num]=head[b]; head[b]=num;
23 }
24 bool cmp(node a,node b){
25 return a.dep>b.dep;
26 }
27 void indfs(int f,int s){
28 nod[s].id=s;
29 for(int i=head[s];i;i=nex[i]){
30 int t=to[i];
31 if(t==f) continue;
32 nod[t].dep=nod[s].dep+1;
33 fa[t][1]=s;
34 for(int j=2;j<=min(k,nod[t].dep);j++) fa[t][j]=fa[fa[t][j-1]][1];
35 indfs(s,t);
36 }
37 }
38 void dfs(int f,int s,int cnt){
39 if(!cnt) return;
40 for(int i=head[s];i;i=nex[i]){
41 int t=to[i];
42 if(t==f) continue;
43 vis[t]=1;
44 dfs(s,t,cnt-1);
45 }
46 }
47 int main(){
48 n=read(); k=read(); t=read();
49 for(int i=1;i<n;i++) add(read(),read());
50 indfs(0,1);
51 sort(nod+1,nod+n+1,cmp);
52 for(int i=1;i<=n;i++){
53 if(vis[nod[i].id]) continue;
54 int st=fa[nod[i].id][min(nod[i].dep,k)];
55 vis[st]=1; ++ans;
56 dfs(0,st,k);
57 }
58 printf("%d\n",ans);
59 return 0;
60 }
T2
T3 星空
考场防AC的题。。至少对我来说。。
m=1的情况贪心扫一遍,碰到灭的就往后开,可以拿到28,再输出个2,36高分到手。
正解真不是人在考场上能想出来的(弱限制了我的想象
考虑对问题进行转化。
首先用差分数组将区间修改转化为单点修改。对[l,r]区间反转就相当于对l与r+1两点的差分值反转。
因为差分涉及r+1,所以要多维护一位。
之后问题就转化为每次异或两位,用最少操作数将01串全变为0。只考虑串里的1即可。
用BFS预处理出把两个1都变为0的最小方案,然后状压。
code:

1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=4e4+5;
4 int n,k,m,to[65],dis[20][20],tmp,f[1<<16];
5 bool a[NN],pre[NN];
6 map<int,int>mp;
7 inline int read(){
8 int x=0,f=1;
9 char ch=getchar();
10 while(ch<'0'||ch>'9') ch=getchar();
11 while(ch>='0'&&ch<='9'){
12 x=(x<<1)+(x<<3)+(ch^48);
13 ch=getchar();
14 }
15 return x*f;
16 }
17 struct node{
18 int id,w;
19 }c;
20 void bfs(int s){
21 queue<node>q;
22 bool vis[NN]={0};
23 c.id=s; c.w=0;
24 q.push(c);
25 while(!q.empty()){
26 int x=q.front().id,y=q.front().w;
27 q.pop();
28 if(vis[x]) continue;
29 vis[x]=1;
30 if(pre[x]&&dis[mp[s]][mp[x]]>999999999) dis[mp[s]][mp[x]]=y;
31 for(int i=1;i<=m;i++){
32 int t1=x-to[i],t2=x+to[i];
33 if(t1>=1&&!vis[t1]){
34 c.id=t1; c.w=y+1;
35 q.push(c);
36 }
37 if(t2<=n+1&&!vis[t2]){
38 c.id=t2; c.w=y+1;
39 q.push(c);
40 }
41 }
42 }
43 }
44 int main(){
45 n=read(); k=read(); m=read();
46 for(int i=1;i<=k;i++) a[read()]=1;
47 for(int i=1;i<=m;i++) to[i]=read();
48 for(int i=1;i<=n+1;i++){
49 pre[i]=a[i-1]^a[i];
50 if(pre[i]) mp[i]=++tmp;
51 }
52 memset(dis,0x3f,sizeof(dis));
53 memset(f,0x3f,sizeof(f));
54 for(int i=1;i<=n+1;i++)
55 if(pre[i]) bfs(i);
56 int all=(1<<tmp)-1;
57 f[all]=0;
58 for(int u=all;u;u--)
59 for(int i=1;i<tmp;i++)
60 for(int j=i+1;j<=tmp;j++){
61 if(i==j) continue;
62 if(!(u&(1<<(j-1)))&&!(u&(1<<(i-1)))) continue;
63 f[u^((1<<(i-1))|(1<<(j-1)))]=min(f[u^((1<<(i-1))|(1<<(j-1)))],f[u]+dis[i][j]);
64 }
65 printf("%d\n",f[0]);
66 return 0;
67 }
T3
2021.6.29考试总结[NOIP模拟10]的更多相关文章
- 2021.7.29考试总结[NOIP模拟27]
T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.8.3考试总结[NOIP模拟29]
T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.8.11考试总结[NOIP模拟36]
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- [考试总结]noip模拟10
不小心有咕掉了一段时间 这次考试咕掉的分数也是太多了 然后就是这次暴力完全没有打满 遗憾啊遗憾 T1 入阵曲 前面的题目背景故意引导我们去往矩阵快速幂的方向去想 然而半毛钱关系没有 其实就是维护前缀和 ...
- 2021.9.20考试总结[NOIP模拟57]
(换个编辑器代码就SB地不自动折叠了.. T1 2A 考察快读的写法. $code:$ T1 #include<bits/stdc++.h> #define scanf SCANF=sca ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
随机推荐
- 依赖注入Bean属性——手动装配Bean
一.构造方法注入 其中,可以根据不同的参数列表调用不同的重载的构造方法: 其中,基本数据类型没有包,引用类型都有包路径,基本类型对应封装类: 二.通过property标签调用类的set方法注入 三.通 ...
- 使用Eclipse对weblogic进行远程调试
一.环境说明 weblogic12c,linux centOS 6.5,eclipse mars. 二.步骤 1.找到weblogic根目录下user_projects/domains/域名/bin/ ...
- .NET 6 RC1 正式发布
昨天晚上微软发布了.NET 6的两个RC版本中的第一个版本,该版本将于11月正式发布,作为在开源MIT协议下整合所有不同的.NET开发模组件的开源跨平台实现.这是一个从2014年开始,持续多年的,以改 ...
- composer 包 slim使用案例,一个简单的路由解决方案
nginx配置文件修改 location / { try_files $uri /index.php$is_args$args; } 设置好nginx伪静态,把所有的请求方式都转向到index.php ...
- linux命令(用户)
一.常用命令 1.1 ls ls 命令是 linux 下最常用的命令,ls 命令就是 list 的缩写. ls 用来打印出当前目录的清单.如果 ls 指定其他目录,那么就会显示指定目录里的文件及文件夹 ...
- Docker Command and Dockerfile
镜像相关命令 # 下载镜像 docker pull xxx # 搜素镜像 docker search xxx # 查看已经下载了哪些镜像 docker images # 查看已下载镜像的id dock ...
- dede图片集关联的数据库用表:
如果在本地的环境中,安装目录不在根目录,搬到外网上的时候,就需要对数据库里的图片路径数据进行字段替换: dede图片集关联的数据库用表:1.dede_addonimages 2.dede_arctin ...
- 鸿蒙内核源码分析(消息队列篇) | 进程间如何异步传递大数据 | 百篇博客分析OpenHarmony源码 | v33.02
百篇博客系列篇.本篇为: v33.xx 鸿蒙内核源码分析(消息队列篇) | 进程间如何异步传递大数据 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁 ...
- Xamarin Android使用自签名证书
背景 项目中后台web服务部署成https服务时,需要使用SSL证书,如果我们不使用公共的CA时,怎么办? 不仅如此,因为是小项目,App应用主要是小范围使用,此时只有IP地址,根本没有域名,怎么办? ...
- Spring技术内幕笔记2--我懒不写了哈哈哈哈。
目录 1.1 关于IOC容器设计的线路区别 1.1.1 BeanFactory 1.1.2 ApplicationContext 2.1 FileSystemXmlApplicationContext ...