Noip模拟71 2021.10.7
T1 签到题
结论题,找到规律就会做
规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 #define out(x) cout<<#x<<":"<<x<<endl
6 #define fuck cout<<"fuck"<<endl
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();}return x*f;
11 }inline void write(int x,char opt='\n'){
12 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
13 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
14 for(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
15 }using namespace AE86;
16 const int NN=1e6+5;
17 int n,m,k,c,deg[NN],ans;
18 namespace WSN{
19 inline short main(){
20 // freopen("in.in","r",stdin); freopen("bao.out","w",stdout);
21 freopen("qiandao.in","r",stdin);
22 freopen("qiandao.out","w",stdout);
23 n=read(); m=read(); k=read(); c=read();
24 if(c==1) return puts("0"),0;
25 for(int i=1;i<=k;i++){
26 int u=read(),v=read()+n;
27 ++deg[u]; ++deg[v];
28 }
29 for(int i=1;i<=n+m;i++){
30 if(deg[i]%c!=0){
31 ++ans;
32 }
33 } write(ans);
34 return 0;
35 }
36 }
37 signed main(){return WSN::main();}
T2 M弟娃
树剖+线段树,每次判断两个点的$lca$是否为其中一个点,如果不是就将两个点的子树内加一
否则找到$lca$到另一个点的链上的那个儿子,分别操作:全局加一,儿子的子树减一,另一个点的子树加一
1 #include<bits/stdc++.h>
2 using namespace std;
3 namespace AE86{
4 #define out(x) cout<<"x="<<x<<endl
5 #define fuck cout<<"fuck"<<endl
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();}return x*f;
10 }inline void write(int x,char opt='\n'){
11 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
12 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
13 for(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
14 }using namespace AE86;
15 const int NN=3e5+1;
16 int n,m;
17 struct SNOW{int to,next;}e[NN<<1]; int head[NN],rp;
18 inline void add(int x,int y){e[++rp]=(SNOW){y,head[x]};head[x]=rp;}
19 struct SNOWtree{
20 #define lid (id<<1)
21 #define rid (id<<1|1)
22 #define mid ((l+r)>>1)
23 int mx[NN<<2],laz[NN<<2];
24 inline void pushdown(int id){
25 laz[lid]+=laz[id];laz[rid]+=laz[id];
26 mx[lid]+=laz[id];mx[rid]+=laz[id];
27 laz[id]=0;
28 }
29 inline void update(int id,int l,int r,int ql,int qr,int v){
30 if(ql<=l&&r<=qr) return mx[id]+=v,laz[id]+=v,void();
31 if(l!=r&&laz[id]!=0) pushdown(id);
32 if(ql<=mid) update(lid,l,mid,ql,qr,v);
33 if(qr>mid) update(rid,mid+1,r,ql,qr,v);
34 if(l!=r) mx[id]=max(mx[lid],mx[rid]);
35 }
36 #undef mid
37 }tr;
38 namespace tree_division{
39 int dfn[NN],rk[NN],son[NN],top[NN],fa[NN],dep[NN],siz[NN],cnt;
40 inline void dfs1(int f,int x){
41 dep[x]=dep[f]+1; fa[x]=f; siz[x]=1;
42 for(int i=head[x];i;i=e[i].next){
43 int y=e[i].to; if(y==f) continue;
44 dfs1(x,y); siz[x]+=siz[y];
45 if(siz[son[x]]<siz[y]) son[x]=y;
46 }
47 }
48 inline void dfs2(int x,int t){
49 top[x]=t; dfn[x]=++cnt; rk[cnt]=x;
50 if(son[x]) dfs2(son[x],t);
51 for(int i=head[x];i;i=e[i].next){
52 int y=e[i].to;
53 if(y!=fa[x] && y!=son[x]) dfs2(y,y);
54 }
55 }
56 inline int LCA(int x,int y){
57 while(top[x]!=top[y]){
58 if(dep[top[x]]<dep[top[y]]) swap(x,y);
59 x=fa[top[x]];
60 }if(dfn[x]>dfn[y]) swap(x,y);
61 return x;
62 }
63 inline int find(int x,int y){
64 while(top[y]!=top[x]){
65 if(fa[top[y]]==x) return top[y];
66 y=fa[top[y]];
67 } return son[x];
68 }
69 }using namespace tree_division;
70
71 namespace WSN{
72 inline short main(){
73 freopen("magic.in","r",stdin);
74 freopen("magic.out","w",stdout);
75 n=read(); m=read();
76 if(n==1){
77 for(int i=1;i<=m;i++) printf("%lld\n",i);
78 return 0;
79 }
80 for(int i=1,u,v;i<n;i++)
81 u=read(),v=read(),add(u,v),add(v,u);
82 dfs1(0,1); dfs2(1,1); int x,y,lca;
83 while(m--){
84 x=read(),y=read();
85 if(x==y){
86 tr.update(1,1,n,1,n,1);write(tr.mx[1]);
87 continue;
88 }
89 lca=LCA(x,y);
90 if(lca!=x&&lca!=y){
91 tr.update(1,1,n,dfn[x],dfn[x]+siz[x]-1,1);
92 tr.update(1,1,n,dfn[y],dfn[y]+siz[y]-1,1);
93 write(tr.mx[1]);
94 continue;
95 }
96 if(lca==x||lca==y){
97 if(dfn[x]>dfn[y]) swap(x,y);
98 tr.update(1,1,n,1,n,1);
99 int sn=find(x,y);
100 tr.update(1,1,n,dfn[sn],dfn[sn]+siz[sn]-1,-1);
101 tr.update(1,1,n,dfn[y],dfn[y]+siz[y]-1,1);
102 write(tr.mx[1]);
103 }
104 }
105 return 0;
106 }
107 }
108 signed main(){return WSN::main();}
T3 变异大老鼠
这题比较容易打挂,而且是要么$100$要么$0$的那种
建树很容易看出,跑个最短路就行
反正我是被$dp$卡死了,调了$n$年没调出来,这一方面还是太弱
最后打的爆搜也是没调出来
设$f[u][k]$表示以$u$为根的子树中用了$k$个警察来抓住杨吞天的最大概率
那么背包合并的时候$f[x][j]=\max (f[x][l]+f[y][j-l] \times (\frac {1}{deg[x]}))$
累加贡献的时候$f[x][j]=\max (f[x][j-l]*(1-p[x][l])+p[x][l])$
关于枚举的时候需要倒序枚举,状态的更新不能用已知更新未知,会造成冲突
需要恶补树形$dp$和书上背包,记下了
1 #include<bits/stdc++.h>
2 using namespace std;
3 namespace AE86{
4 #define out(x) cout<<"x="<<x<<endl
5 #define fuck cout<<"fuck"<<endl
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();}return x*f;
10 }inline void write(int x,char opt='\n'){
11 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
12 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
13 for(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
14 }using namespace AE86;
15 const int MM=3e4+5,NN=305;
16 int n,m,k,deg[NN];
17 struct SNOW{int to,val,next;}e[MM<<1];int head[NN],rp;
18 inline void add(int x,int y,int z){
19 e[++rp]=(SNOW){y,z,head[x]};head[x]=rp;
20 e[++rp]=(SNOW){x,z,head[y]};head[y]=rp;
21 }
22 struct node{
23 int id,data;
24 friend bool operator<(node a,node b){
25 return a.data>b.data;
26 }
27 };priority_queue<node> Q;
28 int dis[NN];bool vis[NN];
29 inline void dij(){
30 int x,y; memset(dis,0x3f,sizeof(dis));
31 dis[1]=0; Q.push((node){1,0});
32 while(!Q.empty()){
33 x=Q.top().id,y=Q.top().data; Q.pop();
34 if(!vis[x]){ vis[x]=1;
35 for(int i=head[x];i;i=e[i].next)
36 if(dis[e[i].to]>dis[x]+e[i].val)
37 Q.push((node){e[i].to,dis[e[i].to]=dis[x]+e[i].val});
38 }
39 }
40 }
41 vector<int> g[NN];
42 inline void build(int f,int x,int d){
43 if(vis[x]) return;
44 if(dis[x]!=d) return;
45 vis[x]=1; g[f].push_back(x); ++deg[f];
46 for(int i=head[x];i;i=e[i].next){
47 int y=e[i].to;build(x,y,d+e[i].val);
48 }
49 }
50 double c[NN][NN];
51 double dp[NN][NN];
52 inline void dfs(int f,int x){
53 for(int i=0;i<g[x].size();i++){
54 int y=g[x][i]; dfs(x,y);
55 for(int j=k;j;--j){
56 for(int l=1;l<=j;l++){
57 dp[x][j]=max(dp[x][j],(1.0/deg[x])*dp[y][l]+dp[x][j-l]);
58 }
59 }
60 }
61 for(int j=k;j;--j){
62 for(int l=1;l<=j;l++){
63 dp[x][j]=max(dp[x][j],c[x][l]+(1.0-c[x][l])*dp[x][j-l]);
64 }
65 }
66 }
67 namespace WSN{
68 inline short main(){
69 // freopen("in.in","r",stdin);freopen("bao.out","w",stdout);
70 freopen("arrest.in","r",stdin);
71 freopen("arrest.out","w",stdout);
72 n=read(); m=read(); k=read();
73 for(int i=1,u,v,w;i<=m;i++){
74 u=read(),v=read(),w=read();
75 add(u,v,w);
76 } dij();
77 memset(vis,0,sizeof(vis));
78 build(0,1,0);
79 for(int i=1;i<=n;i++)
80 for(int j=1;j<=k;j++)
81 scanf("%lf",&c[i][j]);
82 dfs(0,1);
83 printf("%.6lf\n",dp[1][k]);
84 return 0;
85 }
86 }
87 signed main(){return WSN::main();}
T4 朝鲜时蔬
没看到任何关于朝鲜时蔬的信息,就一道纯打表加推式子的分类讨论题
这段不知道为啥老碰见测试点分治的题,就比较没意思
题目翻译:
从$n$个数里面选择$m$个构成的中集合,
要从这些中集合里面找 能除尽中集合总和的$k$个数字的总和,
以所有 可能的$k$个数字的小小集合 合在一起称为小集合,
找到小集合里面包含小小集合最多的那个个数,
最后叫你找到 小集合里面的小小集合的个数正好等于最大值 的中集合的个数
可能你更看不懂了,没事,真看不懂就看这个
没必要粘贴其实,只是为了偷税气氛,真正要理解怎么做也不是没有$pdf$,上面说的解法还是很详细的
不过比较烦的是它又有特判又有推式子,这种确实没啥大意义,给一个真正的纯推式子的题也行
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 #define out(x) cout<<"x="<<x<<endl
6 #define fuck cout<<"fuck"<<endl
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();}return x*f;
11 }inline void write(int x,char opt='\n'){
12 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
13 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
14 for(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
15 }using namespace AE86;
16 const int mod=1e9+7;
17 int n,m,k,v2,v12,v6,v4,v3;
18 inline int ksm(int a,int b,int ans=1){
19 int c=mod;for(;b;b>>=1,a=a*a%c)if(b&1)ans=ans*a%c;
20 return ans;
21 }
22 inline int pws(int n){
23 return (n%mod)*((n+1)%mod)%mod*((2*n+1)%mod)%mod*v6%mod;
24 }
25 inline int sig(int l,int r){
26 return ((l+r)%mod)*((r-l+1)%mod)%mod*v2%mod;
27 }
28 namespace WSN{
29 inline short main(){
30 freopen("vegetable.in","r",stdin);
31 freopen("vegetable.out","w",stdout);
32 n=read(); m=read(); k=read(); v2=ksm(2,mod-2),v12=ksm(12,mod-2),v6=ksm(6,mod-2),v4=ksm(4,mod-2),v3=ksm(3,mod-2);
33 if(m==1&&k==1) n%=mod,cout<<n<<endl;
34 if(m==2&&k==2) n%=mod,cout<<n*(n-1)%mod*ksm(2,mod-2)%mod<<endl;
35 if(m==3&&k==3) n%=mod,cout<<n*(n-1)%mod*(n-2)%mod*ksm(6,mod-2)%mod<<endl;
36 if(m==4&&k==4) n%=mod,cout<<n*(n-1)%mod*(n-2)%mod*(n-3)%mod*ksm(24,mod-2)%mod<<endl;
37 if(m==2&&k==1){
38 int l=1,r,ans=0;
39 while(l<=n){
40 r=min(n/(n/l),n);
41 (ans+=(n/l)%mod*(r-l+1)%mod)%=mod;
42 l=r+1;
43 } write((ans%mod-n%mod+mod)%mod);
44 }
45 if(m==3&&k==1) cout<<(n/3)%mod<<endl;
46 if(m==3&&k==2){
47 int l=1,r,ans=0;
48 while(l<=n){
49 r=min(n/(n/l),n);
50 (ans+=(n/l)%mod*(((l+r-2)%mod)*((r-l+1)%mod)%mod*v2%mod*v2%mod-(r/2-(l-1)/2)%mod*v2%mod+mod)%mod)%=mod;
51 l=r+1;
52 } write(ans);
53 }
54 if(m==4&&k==1){
55 if(n==4||n==5) cout<<1<<endl;
56 else cout<<((n/6)%mod+(n/9)%mod+(n/10)%mod+(n/12)%mod+(n/15)%mod+(n/21)%mod)%mod<<endl;
57 }
58 if(m==4&&k==2){
59 if(n==4||n==5||n==6) cout<<1<<endl;
60 else if(n==7) cout<<3<<endl;
61 else if(n==8) cout<<6<<endl;
62 else if(n==9) cout<<9<<endl;
63 else if(n==10) cout<<10<<endl;
64 else cout<<((n/11)%mod+(n/29)%mod)%mod<<endl;
65 }
66 if(m==4&&k==3){
67 if(n==4) cout<<1<<endl;
68 else if(n==5) cout<<5<<endl;
69 else{
70 int l=1,r,ans=0;
71 while(l<=n){
72 int r=min(n/(n/l),n);
73 (ans+=(n/l)%mod*(((pws(r)-pws(l-1)+mod)%mod*v12%mod-sig(l,r)*v2%mod+mod)%mod+(5*(v12%mod)%mod)%mod*((r-l+1)%mod)%mod+((r/2-(l-1)/2)%mod)*v4%mod+((r/3-(l-1)/3)%mod)%mod*v3%mod)%mod)%=mod;
74 l=r+1;
75 } write(ans);
76 }
77 }
78 return 0;
79 }
80 }
81 signed main(){return WSN::main();}
别点开
稍稍总结一下这次为啥垫底
时间的分配不够好,思考的时间占用过长,导致暴力也没打完,正解也不好打,
然后就是太不自信,感觉想出来的都不是正解,也就不敢下手,其实要是敢打的话前几场也不至于很狼狈
还能把正解给注释掉,也是没谁了,这次的$T2$也是在稿纸上划出正解思路,然后感觉不会这么简单,害怕打到一半发现假了就死掉了
也是没敢打,暴力貌似更不会,就只打了菊花的。。。
以后还是要学着在打代码的同时思考正解,不要把两者的时间分化过偏
Noip模拟71 2021.10.7的更多相关文章
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- Noip模拟81 2021.10.20
T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...
- Noip模拟83 2021.10.26
T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...
- Noip模拟80 2021.10.18
预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...
- Noip模拟79 2021.10.17(题目名字一样)
T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...
- Noip模拟77 2021.10.15
T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移 ...
- Noip模拟75 2021.10.12
T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...
随机推荐
- Linux处理二进制文件工具
处理目标文件的工具 在Linux系统中有大量可用的工具可以帮助我们理解和处理目标文件.特别地,GNU binutils包尤其有帮助,而且可以运行在每一个Linux平台上 序号 命令 说明 1 AR 创 ...
- Mybatis源码解析5—— 接口代理
本篇文章,可乐将为大家介绍通过接口代理的方式去执行SQL操作.话不多说,直接上图: 其实无论哪种方式,我们最终是需要找到对应的 SQL 语句,接口代理的方式就是通过 [包名.方法名] 的方式,去找到 ...
- Python国内镜像源及报错解决方法
国内镜像源: 阿里云:https://mirrors.aliyun.com/pypi/simple/ 清华:https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科技 ...
- 面试官:MySQL的幻读是怎么被解决的?
大家好,我是小林. 我之前写过一篇数据库事务的文章「 事务.事务隔离级别和MVCC」,这篇我说过什么是幻读. 在这里插入图片描述 然后前几天有位读者跟我说,我这个幻读例子不是已经被「可重复读」隔离级别 ...
- STM32,下载HAL库写的代码后J-Link识别不到芯片,必须要按住复位才能下载?
问题描述:最近在学STM32的HAL库,据说可以统一STM32江湖,前途无量.最近一段时间参照STM32CubeMX和原子的资料自己学着建了两个HAL库的工程模板,F4的还好说,F1的出现了一个玄学问 ...
- Appium Android Toast控件
Android Toast控件是Android系统级别的控件,不是App的控件,getPageSource是⽆法找到的. Toast介绍 1.背景 在安卓设备里面,使用各种手机应用程序的时候,需要先进 ...
- 鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作 | 百篇博客分析OpenHarmony源码 | v43.02
百篇博客系列篇.本篇为: v43.xx 鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里 ...
- 使geoJSONLayer能够加载两种数据类型的geojson数据
问题描述 在使用geoJSONLayer加载geojson数据时,官方文档只支持单一类型的geojson数据加载,当一个geojson数据中出现两种类型的数据时可以尝试一下方法进行解决 本场景为:点击 ...
- Python setattr() 函数 ,Python super() 函数: Python 内置函数 Python 内置函数
描述 setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. 语法 setattr 语法: setattr(object, name, value) 参数 object -- ...
- C++学习笔记:07 类的继承与派生
课程<C++语言程序设计进阶>清华大学 郑莉老师) 基本概念 继承与派生的区别: 继承:保持已有类的特性而构造新类的过程称为继承. 派生:在已有类的基础上新增自己的特性(函数方法.数据成员 ...