Noip模拟39 2021.8.14
T1 打地鼠
都切掉了的简单题

1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int NN=2005;
5 int n,k,g[NN][NN],ans,sum[NN][NN];
6 char s[NN];
7 inline int calc(int x1,int y1,int x2,int y2){
8 return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
9 }
10 namespace WSN{
11 inline short main(){
12 scanf("%lld%lld",&n,&k);
13 for(int i=1;i<=n;i++){
14 scanf("%s",s+1);
15 for(int j=1;j<=n;j++){
16 g[i][j]=s[j]-'0';
17 sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+g[i][j];
18 }
19 }
20 for(int i=1;i<=n-k+1;i++)
21 for(int j=1;j<=n-k+1;j++)
22 ans=max(ans,calc(i,j,i+k-1,j+k-1));
23 printf("%lld\n",ans);
24 return 0;
25 }
26 }
27 signed main(){return WSN::main();}
T2 竞赛图
首先把图中能够当作强联通图的部分缩点来看,
这样化简后的图,如果两个点之间只有一种方向的边,那么他们形成的子图是不合法的
转移的时候用强联通的子集更新非强联通的点集,枚举所有从强联通图出来的边,考虑记录当前枚举的点集合法与否即可

1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=25;
4 int T,n,ans,U,to[1<<24];
5 bool bin[1<<24];
6 namespace WSN{
7 inline short main(){
8 scanf("%d",&T);
9 while(T--){
10 memset(to,0,sizeof(to)); memset(bin,1,sizeof(bin));
11 scanf("%d",&n);ans=0;U=(1<<n)-1; to[0]=U;
12 for(int i=0;i<n;i++) for(int j=0,t;j<n;j++){scanf("%d",&t);if(t) to[1<<i]|=1<<j;}
13 for(int s=1,ss;s<=U;s++) ss=s&(-s),to[s]=to[s^ss]&to[ss];
14 for(int s=1;s<=U;s++) if(bin[s])
15 for(int i=to[s];i;i--,i&=to[s]) bin[s|i]=0;
16 for(int s=0;s<=U;s++) ans+=bin[s]; printf("%d\n",ans);
17 }
18 return 0;
19 }
20 }
21 signed main(){return WSN::main();}
T3 糖果
沽沽沽
T4 树
极其类似染色这道题,
我们可以在初始建树的时候给每个点附上一个自己的编号为点权
那么图中的点权范围是从一到$n$的
考虑每次修改操作将路径上的所有点赋值成一个大于$n$的新数,
这样我们可以发现每次对于黑边的查找,实质上是找路径上有几个点对点权不一样
线段树上维护一个$lc,rc,sum$分别表示区间首点权,区间尾点权,区间内黑色边数即可

1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=300001;
4 int n,q,du[NN];
5 int dfn[NN],rk[NN],son[NN],fa[NN],top[NN],siz[NN],dep[NN],cnt;
6 struct SNOW{int to,next;};SNOW e[NN<<1]; int head[NN],rp;
7
8 inline void add(int x,int y){e[++rp]=(SNOW){y,head[x]}; head[x]=rp;}
9 inline void dfs1(int f,int x){
10 fa[x]=f; dep[x]=dep[f]+1; siz[x]=1;
11 for(int i=head[x];i;i=e[i].next){
12 int y=e[i].to;if(y==f) continue;
13 dfs1(x,y);
14 siz[x]+=siz[y];
15 if(siz[son[x]]<siz[y]) son[x]=y;
16 }
17 }
18 inline void dfs2(int x,int t){
19 top[x]=t; dfn[x]=++cnt; rk[cnt]=x;
20 if(son[x]) dfs2(son[x],t);
21 for(int i=head[x];i;i=e[i].next){
22 int y=e[i].to;
23 if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
24 }
25 }
26 struct SNOWtree{
27 #define lid (id<<1)
28 #define rid (id<<1|1)
29 int ll[NN<<2],rr[NN<<2],sm[NN<<2],laz[NN<<2];
30 int lc[NN<<2],rc[NN<<2];
31 inline void pushup(int id){
32 lc[id]=lc[lid]; rc[id]=rc[rid];
33 sm[id]=sm[lid]+sm[rid]+(lc[rid]!=rc[lid]);
34 }
35 inline void pushdown(int id){
36 if(laz[id]==-1 || ll[id]==rr[id]) return;
37 laz[lid]=laz[rid]=laz[id];
38 sm[lid]=sm[rid]=0;
39 lc[lid]=rc[lid]=laz[id];
40 lc[rid]=rc[rid]=laz[id];
41 laz[id]=-1;
42 }
43 inline void build(int id,int l,int r){
44 ll[id]=l; rr[id]=r; laz[id]=-1;
45 if(l==r){lc[id]=rc[id]=l;return;}
46 int mid=l+r>>1;
47 build(lid,l,mid); build(rid,mid+1,r);
48 pushup(id);
49 }
50 inline void change(int id,int l,int r,int v){
51 if(l<=ll[id]&&rr[id]<=r){lc[id]=rc[id]=laz[id]=v;sm[id]=0;return;}
52 pushdown(id); int mid=ll[id]+rr[id]>>1;
53 if(l<=mid) change(lid,l,r,v);
54 if(r>mid) change(rid,l,r,v);
55 pushup(id);
56 }
57 inline int query(int id,int l,int r){
58 if(l<=ll[id]&&rr[id]<=r) return sm[id];
59 pushdown(id); int mid=ll[id]+rr[id]>>1,ans=0;
60 if(r<=mid) return query(lid,l,r);
61 if(l>mid) return query(rid,l,r);
62 return query(lid,l,mid)+query(rid,mid+1,r)+(lc[rid]!=rc[lid]);
63 }
64 inline int look(int id,int pos){
65 if(ll[id]==rr[id]) return lc[id];
66 pushdown(id); int mid=ll[id]+rr[id]>>1;
67 if(pos<=mid) return look(lid,pos);
68 else return look(rid,pos);
69 }
70 }tr;
71 inline void update(int x,int y,int v){
72 while(top[x]!=top[y]){
73 if(dep[top[x]]<dep[top[y]]) swap(x,y);
74 tr.change(1,dfn[top[x]],dfn[x],v);
75 x=fa[top[x]];
76 }if(dfn[x]>dfn[y]) swap(x,y);
77 tr.change(1,dfn[x],dfn[y],v);
78 }
79 inline int query(int x,int y){
80 int sum=0;
81 while(top[x]!=top[y]){
82 if(dep[top[x]]<dep[top[y]]) swap(x,y);
83 sum+=tr.query(1,dfn[top[x]],dfn[x])+(tr.look(1,dfn[top[x]])!=tr.look(1,dfn[fa[top[x]]]));
84 x=fa[top[x]];
85 }if(dfn[x]>dfn[y]) swap(x,y);
86 sum+=tr.query(1,dfn[x],dfn[y]);
87 return sum;
88 }
89 namespace WSN{
90 inline short main(){
91 /* freopen("1.in","r",stdin);
92 freopen("1.out","w",stdout);*/
93 scanf("%d",&n);
94 for(int i=1,x,y;i<n;i++){
95 scanf("%d%d",&x,&y);
96 add(x,y); add(y,x);
97 }
98 int color=n; scanf("%d",&q);
99 dfs1(0,1); dfs2(1,1); tr.build(1,1,n);
100 while(q--){
101 int typ,x,y;scanf("%d%d%d",&typ,&x,&y);
102 if(typ==1){
103 update(x,y,++color);
104 /*for(int i=1;i<=n*4;i++) if(tr.ll[i]) cout<<tr.ll[i]<<" "<<tr.rr[i]<<" "<<tr.pr[i]<<" "<<tr.nx[i]<<" "<<tr.co[i]<<" "<<tr.laz[i]<<endl;*/
105 }
106 if(typ==2) printf("%d\n",query(x,y));
107 }
108 return 0;
109 }
110 }
111 signed main(){return WSN::main();}
Noip模拟39 2021.8.14的更多相关文章
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- Noip模拟53 2021.9.14
T1 ZYB和售货机 首先这道题有两种做法. 一种是发现每个点都可以先被取到只剩一个,只要收益大于$0$ 然后发现建一个$i->f[i]$的图时出现环,要把它去掉, 那么跑一个$tarjan$枚 ...
- Noip模拟15 2021.7.14
T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...
- 2021.8.14考试总结[NOIP模拟39]
T1 打地鼠 全场就俩人没切,还有一个是忘关$freopen$了. $code:$ 1 #include<bits/stdc++.h> 2 #define rin register sig ...
- 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模拟63 2021.9.27(考场惊现无限之环)
T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...
- Noip模拟61 2021.9.25
T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...
- Noip模拟59 2021.9.22
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...
随机推荐
- C#中的“等待窗体”对话框
这篇文章向您展示了如何在c#.net Windows窗体应用程序中创建一个等待窗体对话框.创建一个新表单,然后输入您的表单名称为frmWaitForm.接下来,将Label,Progress Bar控 ...
- redis存取数据String
一.连接不同数据库和存取String类型值 1.连接数据库 2.set和get多个 3.取值并赋值 取值返回的是赋值改变之前的值: 4.递增和递减 5.字符串尾部加值 6.商品编号自增应用
- Selenium系列4-元素定位
前言 说起元素定位,一定是学习自动化测试绕不开的第一道关,无论是web端的UI自动化还是移动端的自动化,在需要首先对元素进行定位才可以完成对元素的操作已达成测试目的,在Selenium中,可以使用fi ...
- python工作中总结
以下方法平时很少用,用其它解决方法,只是总结了一些其它同事的技巧 1 如何自动生成列表,加一个条件还能筛选 [x for x in range(10) if x>5 ] 来生一个字典试试 d ...
- Maven专题3——生命周期与插件
三套生命周期 Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响. 每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的 ...
- 分布式搜索引擎Elasticsearch在CentOS7中的安装
1. 概述 随着企业业务量的不断增大,业务数据随之增加,传统的基于关系型数据库的搜索已经不能满足需要. 在关系型数据库中搜索,只能支持简单的关键字搜索,做不到分词和统计的功能,而且当单表数据量到达上百 ...
- python matplotlib.pyplot 条形图详解
python matplotlib.pyplot 条形图详解 一.创建直方图 可以用bar函数来创建直方图 然后用show函数显示直方图 比如: import matplotlib.pyplot as ...
- 使用 VSCode 开发调试 STM32 单片机尝试
使用 VSCode 开发调试 STM32 单片机尝试 本文记录基于 Windows + DAP-Link 开发 STM32F103C8T6 的实践过程,其他操作系统或芯片应该也只是大同小异的问题. 注 ...
- JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)
1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...
- 踩坑系列《二》NewProxyResultSet.isClosed()Z is abstract 报错踩坑
在运行测试类的时候莫名其妙的报了个 NewProxyResultSet.isClosed()Z is abstract 这个错误,之前出现过这个错误,以为是版本出现了问题 就将版本 0.9.1.2 改 ...