2021.8.17考试总结[NOIP42]
$\huge{取模不能比大小!}$
$\huge{取模不能比大小!}$
$\huge{取模不能比大小!}$
有了打地鼠的前车之鉴,我深信树规板子是可以出现在联赛题里的。
所以T1十分钟码完直接溜了,后两道肉眼可见的不可做,最后半小时百无聊赖地胡乱打表,心想有二百差不多了,于是T1光速保龄。哈哈
赛后十分钟直接$rk3$超爽的好吗(哭
T1 卷
就像上文所说的。$DP$时带个对数加和就行。
$code:$
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int NN=2e5+5,p=1e9+7;
5 int n,idx,to[NN<<1],nex[NN<<1],head[NN],w[NN];
6 int f[NN][2];
7 double l[NN][2];
8 inline int read(){
9 int x=0,f=1; char ch=getchar();
10 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
11 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
12 return x*f;
13 }
14 inline void write(int x,char sp){
15 char ch[20]; int len=0;
16 if(x<0){ putchar('-'); x=~x+1; }
17 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
18 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
19 }
20 inline void add(int a,int b){
21 to[++idx]=b; nex[idx]=head[a]; head[a]=idx;
22 to[++idx]=a; nex[idx]=head[b]; head[b]=idx;
23 }
24 void dfs(int s,int fa){
25 int w1=1,w2=1;
26 double l1=log(w[s]),l2=0;
27 for(int i=head[s];i;i=nex[i]){
28 int v=to[i];
29 if(v==fa) continue;
30 dfs(v,s);
31 (w1*=f[v][0])%=p; l1+=l[v][0];
32 (w2*=((l[v][1]>l[v][0])?f[v][1]:f[v][0]))%=p; l2+=max(l[v][1],l[v][0]);
33 }
34 f[s][1]=w1*w[s]%p; f[s][0]=w2;
35 l[s][1]=l1; l[s][0]=l2;
36 }
37 signed main(){
38 n=read();
39 for(int i=1;i<=n;i++) w[i]=read();
40 for(int a,b,i=1;i<n;i++){
41 a=read(); b=read();
42 add(a,b);
43 }
44 dfs(1,0);
45 if(l[1][1]<l[1][0]) write(f[1][0],'\n');
46 else write(f[1][1],'\n');
47 return 0;
48 }
T1
T2 简单题
不难发现其实就是选择奇数。偶数会随奇数被安排位置。
通过简单容斥可以算出奇数被选时的贡献对应的奇数数量,计算一共是$log$级的。
发现每个奇数选与不选都会有相应的贡献,且两者最多差$1$。可以求出贡献差$1$的奇数数量$x$以及奇数全被选时的集合大小$sum$。
于是每次询问中$m$与$sum$的差就是有几个贡献差$1$的奇数没有被选。贡献无差别的奇数选不选皆可,记这种奇数数量为$tmp$,答案为$C_x^{sum-m}\times 2^{tmp}$。
$code:$
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int p=1e7+19;
5 int n,m,q,ext,sum,x,base,num[60],fac[p],inv[p];
6 inline int read(){
7 int x=0,f=1; char ch=getchar();
8 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
9 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
10 return x*f;
11 }
12 inline void write(int x,char sp){
13 char ch[20]; int len=0;
14 if(x<0){ putchar('-'); x=~x+1; }
15 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
16 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
17 }
18 inline int qpow(int a,int b){
19 int res=1;
20 while(b){
21 if(b&1) res=res*a%p;
22 a=a*a%p;
23 b>>=1;
24 }
25 return res;
26 }
27 inline int cc(int n,int m){ if(n<m) return 0; return fac[n]*inv[m]%p*inv[n-m]%p; }
28 inline int C(int n,int m){
29 if(!m) return 1;
30 return C(n/p,m/p)*cc(n%p,m%p)%p;
31 }
32 signed main(){
33 n=read(); q=read(); sum=n+1>>1; ext=log(n)/log(4); x=sum-((n>>1)+1>>1);
34 fac[0]=inv[0]=1;
35 for(int i=1;i<p;i++) fac[i]=fac[i-1]*i%p; inv[p-1]=qpow(fac[p-1],p-2);
36 for(int i=p-2;i;i--) inv[i]=inv[i+1]*(i+1)%p;
37 for(int i=1;i<=ext;i++){
38 int tmp=(n>>i)>>i;
39 num[i]=tmp+1>>1;
40 num[i-1]-=num[i];
41 x+=num[i]-(((tmp>>1)+1)>>1);
42 }
43 for(int i=1;i<=ext;i++) sum+=i*num[i];
44 base=qpow(2,(n+1>>1)-x);
45 while(q--){
46 m=read();
47 if(m>sum||m<sum-x){ puts("0"); continue; }
48 write(C(x,sum-m)*base%p,'\n');
49 }
50 return 0;
51 }
T2
T3 粉丝
把大于等于$x$与小于等于$y$的限制拆为大于等于$x$与大于等于$y$,计算两者后作差即可。于是转化为划分数$DP$。
直接$DP$复杂度$O(n^2)$,可以把$DP$拆为两部分,以$\sqrt n$为界。
前一部分用完全背包,后一部分用好像很经典的划分数$DP$。
$g_{i,j}$为划分为$i$个数,加和为$j$的方案数。有$g_{i,j}=g_{i-1,j}+g(i,j-i)$。前一部分是新增一个$0$,后一部分是对所有划分出的数$+1$。
由于单纯$DP$时不能保证下界,因此最后应将$g_{i,j}$转为$g_{i,j-i*\sqrt n}$,$DP$时要注意。
因为从$\sqrt n$开始,因此最多划分出$\frac{n}{\sqrt n}$个数。
最后把两个$DP$合并。
$code:$
1 #include<bits/stdc++.h>
2 using namespace std;
3
4 namespace IO{
5 inline int read(){
6 int x=0,f=1; char ch=getchar();
7 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
8 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
9 return x*f;
10 }
11 inline void write(int x,char sp){
12 char ch[20]; int len=0;
13 if(x<0){ putchar('-'); x=~x+1; }
14 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
15 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
16 }
17 }using namespace IO;
18
19 const int NN=1e9;
20 int n,p,x,y,b,B,f[100005],g[100005],G[100005];
21
22 int calc(int dwn){
23 int ans=0;
24 if(dwn>n) return 0;
25 memset(f,0,sizeof(f));
26 memset(g,0,sizeof(g));
27 memset(G,0,sizeof(G));
28 b=max(B,dwn);
29 f[0]=g[0]=G[0]=1;
30 for(int i=dwn;i<b;i++)
31 for(int j=i;j<=n;j++) (f[j]+=f[j-i])%=p;
32 for(int i=1;i<=n/b;i++){
33 int tmp=i*b;
34 for(int j=i;j+tmp<=n;j++) (g[j]+=g[j-i])%=p;
35 for(int j=0;j+tmp<=n;j++) (G[j+tmp]+=g[j])%=p;
36 }
37 for(int i=0;i<=n;i++)
38 (ans+=(1ll*f[i]*G[n-i]%p))%=p;
39 return ans;
40 }
41 signed main(){
42 x=read(); y=read(); n=read(); p=read(); B=sqrt(n);
43 write((calc(x)-calc(y+1)+p)%p,'\n');
44 return 0;
45 }
T3
2021.8.17考试总结[NOIP42]的更多相关文章
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.6.17考试总结[NOIP模拟8]
T1 星际旅行 其实就是求两条只走一遍的边的方案数. 考场上第一眼就感觉不可做,后来画了几个图,发现好像只要两个边是相连的就可以只走一遍,居然还真拿了30.. 其实是一道欧拉路的题,把每条非自环的边看 ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...
- 2021.07.17 P4170 染色(区间DP)
2021.07.17 P4170 染色(区间DP) [P4170 CQOI2007]涂色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.目标状态可以由哪些状态转移过来. ...
- 2021.07.17 P3177 树上染色(树形DP)
2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...
- 2021.10.27考试总结[冲刺NOIP模拟17]
T1 宝藏 发现每个数成为中位数的长度是关于权值单调的.线段树二分判断是否合法,单调指针扫即可. 考场上写了二分,平添\(\log\). \(code:\) T1 #include<bits/s ...
- Noip模拟79 2021.10.17(题目名字一样)
T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...
- Noip模拟8 2021.6.17
T1 星际旅行 仔细一看,发现像一个欧拉路(简称一笔画). 满足"可以一笔画"的条件是: 1.所有点都有偶数条连边; 2.有偶数个点连奇数条边; 满足以上两个条件的任意一个即可一笔 ...
随机推荐
- json包中的Marshal&Unmarshal 文档译本
Marshal func Marshal(v interface{})([]byte, error) Marshal returns the JSON encoding of v. Marshal返回 ...
- 手把手教你如何玩转消息中间件(ActiveMQ)
手把手教你如何玩转消息中间件(ActiveMQ) 2018年07月15日 18:07:39 Cs_hnu_scw 阅读数 12270 标签: 中间件消息中间件ActiveMQ分布式集群 更多 个人分类 ...
- 洛谷P1583——魔法照片(结构体排序)
https://www.luogu.org/problem/show?pid=1583#sub 题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人. ...
- Redis限流
在电商开发过程中,我们很多地方需要做限流,有的是从Nginx上面做限流,有的是从代码层面限流等,这里我们就是从代码层面用Redis计数器做限流,这里我们用C#语言来编写,且用特性(过滤器,拦截器)的形 ...
- jmeter压测学习12-设置持续压测时间(调度器的使用)
前言 使用jmeter 做压测的时候,希望对一个接口持续压测 10 分钟或者半小时,可以使用调度器设置持续压测时间. 设置样本总数 压测方式有2种,一种是设置线程组和循环次数,这样可以设置一个样本总数 ...
- python读取文件编码转换问题
encode(编码) decode(解码) encoding(编码格式) #-*- coding:utf-8 -*- import chardet #用于查看编码 with open(&quo ...
- 『GoLang』string及其相关操作
目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...
- 关于python中的可哈希与不可哈希
可哈希:简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects).它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间 ...
- 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01
百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...
- 鸿蒙内核源码分析(汇编汇总篇) | 所有的汇编代码都在这里 | 百篇博客分析OpenHarmony源码 | v40.03
百篇博客系列篇.本篇为: v40.xx 鸿蒙内核源码分析(汇编汇总篇) | 汇编可爱如邻家女孩 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...