T1 路径


考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$。

$code:$

 1 #include<bits/stdc++.h>
2 #define int unsigned long long
3 using namespace std;
4
5 namespace IO{
6 inline int read(){
7 char ch=getchar(); int x=0,f=1;
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[50]; int len=0;
14 if(x<0){ putchar('-'); x=~x+1; }
15 do{ ch[len++]=x%10+(1<<4)+(1<<5); x/=10; }while(x);
16 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
17 }
18 inline int max(int x,int y){ return x<y?y:x; }
19 inline int min(int x,int y){ return x<y?x:y; }
20 inline void swap(int &x,int &y){ x^=y^=x^=y; }
21 inline void chmax(int &x,int y){ x=x<y?y:x; }
22 inline void chmin(int &x,int y){ x=x<y?x:y; }
23 } using namespace IO;
24
25 const int NN=70;
26 int x,n,ext,ans;
27
28 signed main(){
29 x=n=read();
30 while(n){ ++ext; n>>=1; }
31 for(int i=0;i<ext;i++) ans+=x/(1ll<<i);
32 write(ans,'\n');
33 return 0;
34 }

T1

考场思路:

考虑式子实际意义,其实为每个数末尾连续$1$的个数加一的和。

于是可以数位$DP$。

但我没有。考虑上界$n-1$,扫描每一二进制位,将每个$1$变成$0$,都会给答案带来贡献。

具体来说,由低数第$i$为是$1$,会给末尾有$j$个连续$1$的数的个数带来$2^(i-j)$的贡献。最后容斥,统计答案。

注意如果扫到的$1$到末尾一直是$1$,则会给当前位带来额外$1$的贡献。以及

左移要写$1LL$!!

$code:$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 namespace IO{
6 inline int read(){
7 char ch=getchar(); int x=0,f=1;
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<<4)+(1<<5); x/=10; }while(x);
16 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
17 }
18 inline int max(int x,int y){ return x<y?y:x; }
19 inline int min(int x,int y){ return x<y?x:y; }
20 inline void swap(int &x,int &y){ x^=y^=x^=y; }
21 inline void chmax(int &x,int y){ x=x<y?y:x; }
22 inline void chmin(int &x,int y){ x=x<y?x:y; }
23 } using namespace IO;
24
25 const int NN=70;
26 int x,n,ans,ext,sum,lmt[NN],num[NN];
27 bool link;
28
29 signed main(){
30 x=ans=n=read(); --n; --x; link=1;
31 while(x){
32 lmt[++ext]=x&1;
33 x>>=1;
34 }
35 for(int i=1;i<=ext;i++){
36 if(!lmt[i]){ link=0; continue;}
37 if(lmt[i]) for(int j=1;j<i;j++) num[j]+=1ll<<(i-j-1);
38 if(link) ++num[i];
39 }
40 for(int i=ext;i;i--){
41 num[i]-=sum;
42 sum+=num[i];
43 ans+=i*num[i];
44 }
45 write(ans,'\n');
46 return 0;
47 }

T1考场

T2 赌神


大力推式子(但我不会

玄学做法:

考虑自己的最优方案,一定是要尽力令颜色数减少,但同时自己不能亏损,所以每次应按比例下注。

幕后黑手要尽力使颜色数不减少,所以每次投出颜色最多的球。

模拟即可。

其实由于自己每次取最优策略,不管幕后黑手怎样处理结果都不会改变。

$code:$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 namespace IO{
6 inline int read(){
7 char ch=getchar(); int x=0,f=1;
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<<4)+(1<<5); x/=10; }while(x);
16 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
17 }
18 inline int max(int x,int y){ return x<y?y:x; }
19 inline int min(int x,int y){ return x<y?x:y; }
20 inline void swap(int &x,int &y){ x^=y^=x^=y; }
21 inline void chmax(int &x,int y){ x=x<y?y:x; }
22 inline void chmin(int &x,int y){ x=x<y?x:y; }
23 } using namespace IO;
24
25 const int NN=1e6+5,p=998244353;
26 int n,ans,sum,num;
27 priority_queue<int>q;
28
29 inline int inv(int x){
30 int res=1,b=p-2;
31 while(b){
32 if(b&1) res=res*x%p;
33 x=x*x%p;
34 b>>=1;
35 }
36 return res;
37 }
38
39 signed main(){
40 n=read(); ans=1;
41 for(int i=1;i<=n;i++){
42 num=read();
43 sum+=num;
44 q.push(num);
45 }
46 while(sum){
47 int x=q.top(); q.pop();
48 if(x-1) q.push(x-1);
49 ans=ans*n%p*x%p*inv(sum)%p;
50 --sum;
51 }
52 write(ans,'\n');
53 return 0;
54 }

T2

T3 路径


数据太弱,$O(n^2log)$点分治都能A。。

点分治带个$fft$或$ntt$可以到$O(nlog^2)$,可A。但不会。

正解斯特林数+换根$DP$。

$x^k=\sum_{i=1}^k \begin{Bmatrix}k\\ i\end{Bmatrix}\times x^{\underline i}$

有$(x+1)^{\underline i}=i\times x^{\underline{i-1}}+x^{\underline i}$。

设$f_{i,j}$为$i$子树中所有点到$i$距离的$j$次下降幂之和,$g_{i,j}$为$i$子树中所有点到$i$父亲距离的$j$次下降幂之和。那么有

$f_{i,j}=\sum_{u\in son_i}g_{u,j}$,$g_{i,j}=j\times f_{i,j-1}+f_{i,j}$。

换根时考虑原来根的$f$,减去新根的$g$;新根的$f$加上由原来根的$f$通过上面式子算出的$g$。

$code:$

 1 #include<bits/stdc++.h>
2 using namespace std;
3
4 namespace IO{
5 inline int read(){
6 char ch=getchar(); int x=0,f=1;
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<<4)+(1<<5); x/=10; }while(x);
15 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
16 }
17 inline int max(int x,int y){ return x<y?y:x; }
18 inline int min(int x,int y){ return x<y?x:y; }
19 inline void swap(int &x,int &y){ x^=y^=x^=y; }
20 inline void chmax(int &x,int y){ x=x<y?y:x; }
21 inline void chmin(int &x,int y){ x=x<y?x:y; }
22 } using namespace IO;
23
24 const int NN=1e6+5,p=998244353,inv2=499122177;
25 int n,k,ans,f[NN][105],g[NN][105],sum[105];
26 int idx,to[NN<<1],nex[NN<<1],head[NN],s[105][105];
27
28 inline void add(int a,int b){
29 to[++idx]=b; nex[idx]=head[a]; head[a]=idx;
30 to[++idx]=a; nex[idx]=head[b]; head[b]=idx;
31 }
32
33 void init(){
34 s[1][1]=1;
35 for(int i=2;i<=k;i++) for(int j=1;j<=i;j++)
36 s[i][j]=(s[i-1][j-1]+1ll*j*s[i-1][j]%p)%p;
37 }
38
39 void dfs(int st,int fa){
40 int ext=0;
41 for(int i=head[st];i;i=nex[i]){
42 int v=to[i];
43 if(v==fa) continue;
44 dfs(v,st);
45 for(int i=0;i<=k;i++){
46 if(!g[v][i]) break;
47 chmax(ext,i);
48 (f[st][i]+=g[v][i])%=p;
49 }
50 }
51 ++f[st][0]; ext=min(k,ext+1);
52 for(int i=ext;i;i--)
53 g[st][i]=(1ll*i*f[st][i-1]%p+f[st][i])%p;
54 g[st][0]=f[st][0];
55 }
56
57 void getans(int st,int fa){
58 int ext=0,tmp[105];
59 for(int i=0;i<=k;i++){
60 if(!f[st][i]) break;
61 chmax(ext,i);
62 (sum[i]+=f[st][i])%=p;
63 }
64 ext=min(k,ext+1);
65 for(int i=head[st];i;i=nex[i]){
66 int v=to[i];
67 if(v==fa) continue;
68 for(int j=0;j<=ext;j++) tmp[j]=(f[st][j]-g[v][j]+p)%p;
69 for(int j=ext;j;j--) tmp[j]=(1ll*tmp[j-1]*j%p+tmp[j])%p;
70 for(int j=0;j<=ext;j++) (f[v][j]+=tmp[j])%=p;
71 getans(v,st);
72 }
73 }
74
75 signed main(){
76 n=read(); k=read(); init();
77 for(int a,b,i=1;i<n;i++)
78 a=read(),b=read(), add(a,b);
79 dfs(1,0); getans(1,0);
80 for(int i=0;i<=k;i++) (ans+=1ll*s[k][i]*sum[i]%p)%=p;
81 ans=1ll*ans*inv2%p;
82 write(ans,'\n');
83 return 0;
84 }

T3

T4 树


暴力分层动态开点线段树:

$code:$

 1 #include<bits/stdc++.h>
2 using namespace std;
3
4 namespace IO{
5 inline int read(){
6 char ch=getchar(); int x=0,f=1;
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<<4)+(1<<5); x/=10; }while(x);
15 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
16 }
17 inline int max(int x,int y){ return x<y?y:x; }
18 inline int min(int x,int y){ return x<y?x:y; }
19 inline void swap(int &x,int &y){ x^=y^=x^=y; }
20 inline void chmax(int &x,int y){ x=x<y?y:x; }
21 inline void chmin(int &x,int y){ x=x<y?x:y; }
22 } using namespace IO;
23
24 const int NN=3e5+5;
25 int n,q,x,y,z,v,mx,op,cnt,idx,siz[NN],dfn[NN],to[NN<<1],nex[NN<<1],head[NN],w[NN],dep[NN];
26
27 inline void add(int a,int b){
28 to[++idx]=b; nex[idx]=head[a]; head[a]=idx;
29 to[++idx]=a; nex[idx]=head[b]; head[b]=idx;
30 }
31
32 void dfs(int s,int f){
33 dfn[s]=++cnt; dep[s]=dep[f]+1; siz[s]=1;
34 chmax(mx,dep[s]);
35 for(int i=head[s];i;i=nex[i])
36 if(to[i]!=f) dfs(to[i],s), siz[s]+=siz[to[i]];
37 }
38
39 namespace segment_tree{
40 int tot,root[NN],lc[NN*80],rc[NN*80],val[NN*80];
41 void insert(int &rt,int l,int r,int opl,int opr,int vv){
42 if(!rt) rt=++tot;
43 if(l>=opl&&r<=opr) return val[rt]+=vv,void();
44 int mid=l+r>>1;
45 if(opl<=mid) insert(lc[rt],l,mid,opl,opr,vv);
46 if(opr>mid) insert(rc[rt],mid+1,r,opl,opr,vv);
47 }
48 int query(int rt,int l,int r,int pos,int ans){
49 ans+=val[rt];
50 if(l==r) return ans;
51 int mid=l+r>>1;
52 if(pos<=mid) return query(lc[rt],l,mid,pos,ans);
53 else return query(rc[rt],mid+1,r,pos,ans);
54 }
55 } using namespace segment_tree;
56
57 signed main(){
58 n=read(); q=read();
59 for(int a,b,i=1;i<n;i++)
60 a=read(),b=read(), add(a,b);
61 dfs(1,0);
62 while(q--){
63 op=read();
64 if(op==1){
65 v=read(); x=read(); y=read(); z=read();
66 int tmp=y+dep[v];
67 while(tmp<=mx){
68 insert(root[tmp],1,n,dfn[v],dfn[v]+siz[v]-1,z);
69 tmp+=x;
70 }
71 }
72 else{
73 v=read();
74 write(query(root[dep[v]],1,n,dfn[v],0),'\n');
75 }
76 }
77 return 0;
78 }

T4暴力

正解离线分块,待补(不补

2021.9.13考试总结[NOIP模拟52]的更多相关文章

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

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

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

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

  3. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  4. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  5. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  6. 2021.9.14考试总结[NOIP模拟53]

    T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...

  7. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  8. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

  9. 2021.9.7考试总结[NOIP模拟49]

    T1 Reverse $BFS$暴力$O(n^2)$ 过程中重复枚举了很多点,考虑用链表记录当前点后面可到达的第一个未更新点. 搜索时枚举翻转子串的左端点,之后便可以算出翻转后$1$的位置. $cod ...

随机推荐

  1. redis存取数据Hash

    一.概念 二.存取散列Hash值 1. 2.JSON字符串存取,没有更新值的字段资源浪费 使用散列Hash存取,可以单独到一个或多个字段: 3.hsetnx,属性不存在就新增并赋值,属性已存在啥也不干 ...

  2. java版gRPC实战之四:客户端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. js 之k个一组翻转链表

    题目描述 将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身.要求空间复杂度 \ O ...

  4. Docker系列(9)- 常用其他命令(2) | 进入容器和拷贝的命令

    进入当前正在运行的容器 #我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置#方法一 命令docker exec -it 容器ID bashShell#测试[root@localhost ...

  5. CLion远程调试嵌入式开发板程序

    CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...

  6. python继承细节

    不要子类化内置类型 内置类型(由C语言编写)不会调用用户定义的类覆盖的特殊方法. 例如,子类化dict作为测验: class DoppeDict(dict): def __setitem__(self ...

  7. css Table 表格宽度失效解决方案

    使用div包裹内容进行支撑 <table cellspacing="0"> <caption>89 HOLLAND ROAD SINGAPORE 27575 ...

  8. 『Python』列表生成式、生成器与迭代器

    1. 迭代 在 Python中, 迭代是通过 for ... in 来完成的, 而很多语言比如 C 语言, 迭代 list 是通过下标完成的. Python 的 for 循环抽象程度要高于 C 的 f ...

  9. 我在学习Blazor当中踩的巨坑!Blazor WebAssembly调试

    最近嘛,看看Blazor已经蛮成熟的.顺便想在自家的框架里使用这个东西,毕竟我还是很念旧的,而且Blazor的技术栈也不麻烦.然后呢,在调试这一关我可是踩了大坑. 我的VS是2019,很早以前装的.然 ...

  10. 鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅 | 百篇博客分析OpenHarmony源码 | v37.03

    百篇博客系列篇.本篇为: v37.xx 鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...