2021.8.14考试总结[NOIP模拟39]
T1 打地鼠
全场就俩人没切,还有一个是忘关$freopen$了。
$code:$
1 #include<bits/stdc++.h>
2 #define rin register signed
3 using namespace std;
4 const int NN=2e3+5;
5 int n,k,pre[NN][NN],ans;
6 char ch[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[25]; 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(); k=read();
21 for(rin i=1;i<=n;i++){
22 scanf("%s",ch+1);
23 for(rin j=1;j<=n;j++)
24 pre[i][j]=pre[i][j-1]+(ch[j]=='1');
25 for(rin j=1;j<=n;j++) pre[i][j]+=pre[i-1][j];
26 }
27 for(int i=0;i<=n-k;i++)
28 for(int j=0;j<=n-k;j++)
29 ans=max(ans,pre[i+k][j+k]+pre[i][j]-pre[i][j+k]-pre[i+k][j]);
30 write(ans,'\n');
31 return 0;
32 }
T1
T2 竞赛图
竞赛图缩点后会形成一条链,因此对一个不强联通的子图$S$,必然存在且只有一个强联通的子图$T$,满足$S-T$中点的边都是$S \to T$的。
考虑通过这个性质用强联通子图更新不强联通子图。预处理出每个子集所有点出边的交集即可。
$code:$
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=24;
4 int t,n,to[1<<NN],S,ans;
5 bool is[1<<NN];
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 signed main(){
19 t=read();
20 while(t--){
21 memset(to,0,sizeof(to)); memset(is,1,sizeof(is));
22 n=read(); to[0]=S=(1<<n)-1; ans=0;
23 for(int i=0;i<n;i++) for(int j=0;j<n;j++)
24 if(read()) to[1<<i]|=1<<j;
25 for(int i=1;i<=S;i++) to[i]=to[i^(i&(-i))]&to[i&(-i)];
26 for(int i=1;i<=S;i++)
27 if(is[i])
28 for(int j=to[i];j;j=(j-1)&to[i]) is[i|j]=0;
29 for(int i=0;i<=S;i++) if(is[i]) ++ans;
30 write(ans,'\n');
31 }
32 return 0;
33 }
T2
T3 糖果
神仙$DP$,没改出来,钴了。
T4 树
$\textit{NOI D1T1}$原题,把黑白边反过来了。
树剖,边权下放,每次修改将路径上点打上时间戳,发现黑边数量其实就是相邻两边时间戳不同的边对数。
一开始建树时要保证所有点的时间戳不同。
$code:$
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=3e5+5;
4 int q,n,idx,to[NN<<1],nex[NN<<1],head[NN],tp,x,y;
5 int siz[NN],son[NN],top[NN],dfn[NN],fa[NN],dep[NN],cnt,tim;
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 void add(int a,int b){
19 to[++idx]=b; nex[idx]=head[a]; head[a]=idx;
20 to[++idx]=a; nex[idx]=head[b]; head[b]=idx;
21 }
22 void dfs1(int s,int f){
23 siz[s]=1; fa[s]=f; dep[s]=dep[f]+1;
24 for(int i=head[s];i;i=nex[i]){
25 int v=to[i];
26 if(v==f) continue;
27 dfs1(v,s);
28 siz[s]+=siz[v];
29 if(siz[v]>siz[son[s]]) son[s]=v;
30 }
31 }
32 void dfs2(int s,int t){
33 dfn[s]=++cnt; top[s]=t;
34 if(!son[s]) return;
35 dfs2(son[s],t);
36 for(int i=head[s];i;i=nex[i]){
37 int v=to[i];
38 if(v!=fa[s]&&v!=son[s]) dfs2(v,v);
39 }
40 }
41 struct segment_tree{
42 #define ld rt<<1
43 #define rd (rt<<1)|1
44 int sum[NN<<2],lc[NN<<2],rc[NN<<2],laz[NN<<2];
45 void pushup(int rt){
46 sum[rt]=sum[ld]+sum[rd]+(rc[ld]!=lc[rd]);
47 lc[rt]=lc[ld]; rc[rt]=rc[rd];
48 }
49 void pushdown(int rt){
50 if(!laz[rt]) return;
51 laz[ld]=laz[rt]; laz[rd]=laz[rt];
52 sum[ld]=sum[rd]=0;
53 lc[ld]=lc[rd]=rc[ld]=rc[rd]=laz[rt];
54 laz[rt]=0;
55 }
56 void build(int rt,int l,int r){
57 if(l==r){ lc[rt]=rc[rt]=l; return; }
58 int mid=l+r>>1;
59 build(ld,l,mid);
60 build(rd,mid+1,r);
61 pushup(rt);
62 }
63 void modify(int rt,int l,int r,int opl,int opr,int v){
64 if(l>=opl&&r<=opr){
65 sum[rt]=0;
66 lc[rt]=rc[rt]=laz[rt]=v;
67 return;
68 }
69 pushdown(rt);
70 int mid=l+r>>1;
71 if(opl<=mid) modify(ld,l,mid,opl,opr,v);
72 if(opr>mid) modify(rd,mid+1,r,opl,opr,v);
73 pushup(rt);
74 }
75 int query(int rt,int l,int r,int opl,int opr){
76 if(l>=opl&&r<=opr) return sum[rt];
77 pushdown(rt);
78 int mid=l+r>>1;
79 if(opr<=mid) return query(ld,l,mid,opl,opr);
80 else if(opl>mid) return query(rd,mid+1,r,opl,opr);
81 else return query(ld,l,mid,opl,mid)+query(rd,mid+1,r,mid+1,opr)+(lc[rd]!=rc[ld]);
82 }
83 int look(int rt,int l,int r,int pos){
84 if(l==r) return lc[rt];
85 pushdown(rt);
86 int mid=l+r>>1;
87 if(pos<=mid) return look(ld,l,mid,pos);
88 else return look(rd,mid+1,r,pos);
89 }
90 }s;
91 void UPD(int x,int y){
92 int fx=top[x],fy=top[y]; ++tim;
93 while(fx!=fy)
94 if(dep[fx]>dep[fy]){
95 s.modify(1,1,n,dfn[fx],dfn[x],tim);
96 x=fa[fx]; fx=top[x];
97 }
98 else{
99 s.modify(1,1,n,dfn[fy],dfn[y],tim);
100 y=fa[fy]; fy=top[y];
101 }
102 if(dep[x]>dep[y]) s.modify(1,1,n,dfn[y],dfn[x],tim);
103 else s.modify(1,1,n,dfn[x],dfn[y],tim);
104 }
105 int ANS(int x,int y){
106 int ans=0,fx=top[x],fy=top[y];
107 while(fx!=fy)
108 if(dep[fx]>dep[fy]){
109 ans+=s.query(1,1,n,dfn[fx],dfn[x]);
110 ans+=(s.look(1,1,n,dfn[fx])!=s.look(1,1,n,dfn[fa[fx]]));
111 x=fa[fx]; fx=top[x];
112 }
113 else{
114 ans+=s.query(1,1,n,dfn[fy],dfn[y]);
115 ans+=(s.look(1,1,n,dfn[fy])!=s.look(1,1,n,dfn[fa[fy]]));
116 y=fa[fy]; fy=top[y];
117 }
118 if(dep[x]<dep[y]) ans+=s.query(1,1,n,dfn[x],dfn[y]);
119 else ans+=s.query(1,1,n,dfn[y],dfn[x]);
120 return ans;
121 }
122 signed main(){
123 tim=n=read();
124 for(int i=1;i<n;i++) add(read(),read());
125 dfs1(1,0); dfs2(1,1);
126 s.build(1,1,n);
127 q=read();
128 while(q--){
129 tp=read(); x=read(); y=read();
130 if(tp==1) UPD(x,y);
131 if(tp==2) write(ANS(x,y),'\n');
132 }
133 return 0;
134 }
T4
2021.8.14考试总结[NOIP模拟39]的更多相关文章
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 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.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.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 ...
随机推荐
- 【第六篇】- Maven 仓库之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 仓库 在 Maven 的术语中,仓库是一个位置(place). Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库. 在 Maven 中,任何一个依赖.插件或者项目构建的输出 ...
- windows许可证更新
slmgr /ipk 许可证 slmgr /skms 服务器(kms.xspace.in) slmgr /ato 查看许可证 slmgr /xpr
- Java一般命名规范
一.项目名称 最好用英文,所有单词全部用小写,如testjavaproject.studentmanagement等,当然也也可以用中文,如"学生管理系统"等. 二.Java pr ...
- cnblogs-theme-silence 主题设置简约风格
本文参考 更改博客皮肤 更改博客皮肤为Custom 页面定制CSS代码 勾选禁用模板默认CSS 导入复制该文件内容到代码框中 配置代码块复制功能 样式 和 右侧滑动条样式 /*复制功能添加按钮 beg ...
- 入坑微信小程序必经之路(六)图片上传服务器——WebSercice接口
wxml文件 <view class="weui-uploader"> <view class="img-v weui-uploader__bd&quo ...
- PHP的加密伪随机数生成器的使用
今天我们来介绍的是 PHP 中的加密伪随机数生成器(CSPRNG 扩展).随机数的生成其实非常简单,使用 rand() 或者 mt_rand() 函数就可以了,但是我们今天说的这个则是使用了更复杂算法 ...
- 一些PHP选项参数相关的函数
关于 PHP 的配置,我们大多数情况下都是去查看 php.ini 文件或者通过命令行来查询某些信息,其实,PHP 的一些内置函数也可以帮助我们去查看或操作这些配置参数.比如之前我们学习过的 关于php ...
- PHP垃圾回收机制的一些浅薄理解
相信只要入门学习过一点开发的同学都知道,不管任何编程语言,一个变量都会保存在内存中.其实,我们这些开发者就是在来回不停地操纵内存,相应地,我们如果一直增加新的变量,内存就会一直增加,如果没有一个好的机 ...
- Linux系列(33)- rpm命令管理之RPM包校验提取(5)
校验 格式 rpm -V 已安装的包名 选项: - -V:校验指定RPM包中的文件(verify) 例子 rpm -V httpd 后, 无任何提示, 代表该文件没有被做任何修改 # 判断本地的apa ...
- P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
正题 题目链接:https://www.luogu.com.cn/problem/P3507 题目大意 \(n\)个数,没人轮流取若干个并获得取走的数中最小数的权值,两人的目标都是自己的权值\(-\) ...