2021.09.09am

--- 预期 实际
A 100 25
B 100 100
C 100 0
D 100 0
E 100 100
F 100 100
G 100 50
H 100 100
S 800 475

可能水,一定菜

A 查找二叉树 \(\blacktriangle\)

  1. 简单模拟。
  2. 按照要求遍历再输出就好了。
  3. 时间复杂度轻轻松松\(O(n)\)

B 找树根和孩子 \(\blacktriangle\)

  1. 简单模拟
  2. 树根看入度是否为\(0\)
  3. 孩子最多即出度最多

C 铲雪车 \(\blacktriangle\)

  1. 简单模拟
  2. 欧拉回路(但是双向路太白给了吧)
  3. 只不过四舍五入太恶心人了

D 分糖果 \(\blacktriangle\)

  1. 简单模拟(据说样例解释错了,数据范围也很有毛病)
  2. 可以 \(BFS\),我用的 \(DFS\),没有正确性
  3. 最大深度再加上吃糖果的时间就是答案

E 刻录光盘 \(\blacktriangle\!\blacktriangledown\)

  1. \(DFS\)+微量拓扑思路
  2. 首先找到入度为\(0\)的点,这类点必须得要消耗光盘,这些点进行 \(dfs\)覆盖尽可能多的点。
  3. 然后对于环,我们只需要随便挑一个点放一个光盘即可。

F 烦人的幻灯片 \(\blacktriangle\!\blacktriangledown\)

我站在强度至上的第一排
拓扑排序入门题
这里尝试一下题解的新水法

#include<cstdio>
#include<queue>
using namespace std;
int n;
struct u2004{
	int x1,y1,x2,y2;
}p[30];
int deg[30],ys[30];//ys->映射 
bool used[30];
queue<int> q[30],_q[30];
inline void scan(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d%d%d",&p[i].x1,&p[i].x2,&p[i].y1,&p[i].y2);
	int x,y;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&x,&y);
		for(int j=1;j<=n;j++){
			if(p[j].x1<=x&&x<=p[j].x2&&p[j].y1<=y&&y<=p[j].y2){//在幻灯片范围内 
				q[j].push(i);//chae->number 
				_q[i].push(j);//number->char(反图 
				deg[j]++;//一个字符的可能数字数目,或者叫度 
			}
		}	
	}
}
queue<int> dui;
inline void suan(){
	int xx;
	for(int i=1;i<=n;i++){
		if(deg[i]==1){//华点。这个字符只用一个数字为可能 
			ys[i]=xx=q[i].front();//我们取出这个一定的数字,并且把它存起来 
			dui.push(xx);//将它放到堆里面 
			used[xx]=1;//标记已经被用掉了 
		}
	}
	int x,y;
	while(!dui.empty()){
		x=dui.front();
		dui.pop();
		while(!_q[x].empty()){//_q:num->char
			y=_q[x].front();//取出这个数字覆盖到的所有幻灯片 
			_q[x].pop();
			deg[y]--;//幻灯片的可行数字数目-1 
			if(deg[y]==1){
				while(!q[y].empty()){//q:char->num 
					int z=q[y].front();
					q[y].pop();
					if(!used[z]){//用过了就跳过,用queue的弊端 
						used[z]=1;//一直好奇有没有O(1)删除内部任意元素,O(1)在末尾插入一个数的数据结构 
						ys[y]=z;//存起来 
						dui.push(z);
						break;
					}
				}
			}
		}
	}
}
inline void print(){
	for(int i=1;i<=n;i++)
		if(!ys[i]){
			puts("None");//一旦出现没有答案的情况就是无解 
			return;
		}
	for(int i=1;i<=n;i++)
		printf("%c %d\n",i+'A'-1,ys[i]);
}
int main(){
	scan();
	suan();
	print();
	return 0;//再见 
}

G 构造完全树 \(\blacktriangle\!\blacktriangledown\)

  1. 昨天原题啊(数组开挂了)

H Intervals \(\blacktriangle\!\blacktriangledown\)

  1. 可以贪心,也可以建图
  2. 建图我记得讲过,忘了
  3. 这道题又和之前有一道很像,可以说是加强版,我就按上次的方法写了个贪心
  4. 唯一要注意的是要找位置进行标记,要支持区间查询与区间或单点修改
  5. 容易想到用线段树维护
  6. 但是,我用的树状数组+分治(感觉和线段树差不多)
  7. 分治子区间内空位,优先选择把靠后的区间填满,若有剩余再填靠前的区间
  8. 时间复杂度\(O(n\log n)\),也是比较优秀的
    image
    \(\cal {Made} \ {by} \ {YuGe}\)
posted @ 2021-09-09 18:27  u2003  阅读(39)  评论(0)    收藏  举报