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的更多相关文章

  1. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  2. Noip模拟53 2021.9.14

    T1 ZYB和售货机 首先这道题有两种做法. 一种是发现每个点都可以先被取到只剩一个,只要收益大于$0$ 然后发现建一个$i->f[i]$的图时出现环,要把它去掉, 那么跑一个$tarjan$枚 ...

  3. Noip模拟15 2021.7.14

    T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...

  4. 2021.8.14考试总结[NOIP模拟39]

    T1 打地鼠 全场就俩人没切,还有一个是忘关$freopen$了. $code:$ 1 #include<bits/stdc++.h> 2 #define rin register sig ...

  5. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  6. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  7. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  8. Noip模拟61 2021.9.25

    T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...

  9. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

随机推荐

  1. RSA及其证明 [原创]

    描述RSA的实现步骤介绍文章非常多,但说明并证明其原理,并进而讨论为什么这样设计的文章不多.本人才疏学浅,不敢说理解了R.S.A.三位泰斗的设计初衷,简单就自己的理解写一写,博大家一笑. 以下原创内容 ...

  2. C语言学习笔记---1.C语言概述

    1.典型C程序结构 2.C程序细节 2.1#include指令和头文件 #include这行代码是一条C预处理器指令(preprocessor directive).通常,C编译器在编译前会对源代码做 ...

  3. 3.8学习总结——Android保存信息

    为了保存软件的设置参数,Android平台为我们提供了一个SharedPreferences接口,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences保存数据, ...

  4. java的运行时数据区域

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 1.程 ...

  5. 【PHP数据结构】顺序表(数组)的相关逻辑操作

    在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...

  6. php move_uploaded_file保存文件失败

    move_uploaded_file保存失败后找错,先使用了try catch,但是没输出信息,才知道该函数在php中是警告属于error,不属于exeption,因此不能通过简单的if(!...)处 ...

  7. 创建一个 Orchard Core CMS 站点

    本文通过引用项目模板的方式创建Orchard CMS站点. 创建项目有不同的方式可以为Orchard Core创建站点和模块.你可以在这里了解更多关于它们的信息.在本指南中,我们将使用我们的" ...

  8. Java面向对象系列(5)- 构造器详解

    构造器: 和类名相同 没有返回值 作用: new本质在调用构造器 初始化对象的值 注意点: 定义了有参构造之后,如果想要使用有参构造,必须显示的定义一个无参构造 IDEA快捷键: Alt + Inse ...

  9. 如何快速下载ubuntu镜像

    使用国内镜像地址下载: 中科大http://mirrors.ustc.edu.cn/ubuntu-releases/ 阿里云开源镜像站http://mirrors.aliyun.com/ubuntu- ...

  10. P6499-[COCI2016-2017#2]Burza【状压dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P6499 题目大意 \(n\)个点的一棵树,开始有一个棋子在根处,开始先手选择一个点封锁,然后后手封锁棋子所在点然后 ...