noip 模拟 7


我花了我多久的rp啊……
考试经过
这次是三道题,依旧先看一遍,然后从头开始做
T1一看,这好像是KMP?等等,我好像忘了啊你个废,没事哈希也能做,On似乎可以呀,一波操作,我是不是要A题了?
转到T2,图论题,应该和tarjan有关,好像是割点,但板又双叒叕忘了不长记性,看见数据范围,先拿10分树分,前6个点可以暴力,40不少,过
T3,乍一看不太可做,一开始想到图论后来发现不对,然后想到一个n2的做法,觉得正确性有了直接开打,觉得最好是40分,但感觉常数有点大,估了25
剩下时间主要在检查,发现了包括return 0写进循环里面的sb错误,优化了几个常数虽然基本是负优化
考完了从后往前找自己,结果:100+30+20=150,就水成rank1了……
但真的很菜啊,教练说上届学长们都200多,自闭了……
太弱了,还是太弱了
T1 匹配
签到题,哈希模板直接带走,罗列几个常见错误:
1.模数取小的
2.数组没开够的
3.while写成if的
4.忘了清空的
5.板子没记住的
6.快读写挂的
觉得能过主要是忘了KMP,要是记得的话可能我也写假了,淦
T2 回家
题面就是让你求无向图两点之间的必经点,暴力有30,正解是tarjan求割点
注意答案一定是割点,但割点不一定是答案,因为一个割点去掉后图分成两个连通块,可能1和n仍然在一个连通块里,所以直接输出割点不对
法一
先求割点,再用点双缩点,建新图,建出来的肯定是树,以包含1节点的点双(任选一个)为根,dfs一遍,从包含n节点的点双(任选一个)回溯,我用的是跳父亲,回到根节点,途中经过的割点就是答案,答案排遍序输出就行
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct node{
int from,to,next;
}a[900005];
int head[200050],mm=1;
inline void add(int x,int y)
{
a[mm].from=x;a[mm].to=y;
a[mm].next=head[x];head[x]=mm++;
}
bool v[400005];int num[200050],nu=0;
inline void get(int x){num[++nu]=x;}
int dfn[200050],low[200050],p;
bool ge[200050];stack <int> s;
vector <int>dcc[200050];int dnum,gen1,genn;
void tarjan(int x)
{
dfn[x]=low[x]=++p;s.push(x);
int ch=0;
for(int i=head[x];i;i=a[i].next)
{
int y=a[i].to;
if(!dfn[y])
{
tarjan(y);low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x])
{
ch++;
if(x!=1||ch>1)ge[x]=1;
dnum++;int temp;
do{
temp=s.top();
s.pop();
if(temp==1)gen1=dnum;
if(temp==n)genn=dnum;
dcc[dnum].push_back(temp);
}while(temp!=y);
dcc[dnum].push_back(x);
if(x==1)gen1=dnum;
if(x==n)genn=dnum;
}
}
else low[x]=min(low[x],dfn[y]);
}
}
struct newnode{
int from,to,next;
}b[1000005];
int nhead[500005],nmm=1;
inline void nadd(int x,int y)
{
b[nmm].from=x;b[nmm].to=y;
b[nmm].next=nhead[x];nhead[x]=nmm++;
}
int mp[400005],sb[200500];
inline void getnu()
{
int ga=dnum;
for(int i=1;i<=n;i++)
if(ge[i])sb[i]=++ga,mp[sb[i]]=i;
for(int i=1;i<=dnum;i++)
for(int j=0;j<dcc[i].size();j++)
{
int y=dcc[i][j];
if(ge[y])nadd(i,sb[y]),nadd(sb[y],i);
}
}
int fa[200500];
inline void dfs(int x)
{
v[x]=1;
for(int i=nhead[x];i;i=b[i].next)
{
int y=b[i].to;
if(v[y])continue;
fa[y]=x;dfs(y);
}
}
inline void clear()
{
memset(a,0,sizeof(a));mm=1;
memset(head,0,sizeof(head));
memset(v,0,sizeof(v));
memset(num,0,sizeof(num));nu=0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(0));p=0;
memset(ge,0,sizeof(ge));
while(!s.empty())s.pop();
for(int i=1;i<=n;i++)dcc[i].clear();
gen1=genn=0;dnum=0;
memset(b,0,sizeof(b));nmm=1;
memset(nhead,0,sizeof(nhead));
memset(mp,0,sizeof(mp));
memset(fa,0,sizeof(fa));
}
signed main()
{
int T;cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
if(x==y)continue;
add(x,y);add(y,x);
}
tarjan(1);getnu();dfs(gen1);
int p=fa[genn];
while(p&&p!=gen1)
{
if(p>dnum&&mp[p]!=1&&mp[p]!=n)get(mp[p]);
p=fa[p];
}
sort(num+1,num+nu+1);
printf("%d\n",nu);
for(int i=1;i<=nu;i++)printf("%d ",num[i]);
printf("\n");clear();
}
return 0;
}
由于我太菜了,所以常数挺大的,主要是memset。还有是数组要开够
法二
在求出割点后不缩点,直接在过程中看能不能回溯过去,如果不能证明这个点不是答案,如果行就加进集合,%XIN队
T3 寿司
我n2的暴力本来有四十分,结果由于memset了一大堆200万的数组,被卡到20,你也是,既然冲着部分分去的,数组开那么大干啥啊?
感觉方法挺多,见此题专门博客
考试反思
1.板子一定要记牢,多复习,别以为以后就会了,现在不行根本没有以后
2.大数组慎用memset,手动清空或设法覆盖
3.深入思考,不要轻易放弃
4.看看上一届学长,不能懈怠,更不能颓
noip 模拟 7的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- SwaggerHub 更快,标准化的API设计软件
更快,标准化的API设计 在功能强大且直观的编辑器中设计API,该编辑器旨在提高速度和效率,而不会损失设计一致性. SwaggerHub帮助我们简化了设计和实现API的方式-作为一名架构师,我喜欢良好 ...
- 多线程笔记-CancellationToken(取消令牌)
介绍 为什么需要CancellationToken?因为Task没有方法支持在外部取消Task,只能通过一个公共变量存放线程的取消状态,在线程内部通过变量判断线程是否被取消,当Cancella ...
- go logrus实战应用
简单记录一下logrus实战应用,详细了解可以移步官网,这是直接使用 上代码: logrus整个项目应用封装 package log import ( "fmt" "gi ...
- Lua表达式
目录 算术运算符 关系运算符 逻辑运算符 字符串连接(more) string.format转义符的使用 优先级 算术运算符 Lua 的算术运算符如下表所示: 示例代码:$expr1.lua prin ...
- YAOI Round #5 题解
前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/13 Div.2 : http://47.110.12.131:9016/contest/12 D ...
- python使用笔记008-模块
模块的原理: 1.就是一个python文件 2.标准模块是python自带的 3.第三方模块需要自己安装 导入模块的顺序: 1.从当前目录下找 2.从python的环境变量中找 一.自己定义的模块 1 ...
- C语言:监听键盘
所谓键盘监听,就是用户按下某个键时系统做出相应的处理,本章讲到的输入输出函数也是键盘监听函数的一种,例如 getchar().getche().getch() 等.下面的代码演示了 getche() ...
- 11. Linux从入门到进阶
课程大纲 • Linux简介 • Linux基础 • Linux常用命令 • Shell编程&awk
- 详解递归(基础篇)———函数栈、阶乘、Fibonacci数列
一.递归的基本概念 递归函数:在定义的时候,自己调用了自己的函数. 注意:递归函数定义的时候一定要明确结束这个函数的条件! 二.函数栈 栈:一种数据结构,它仅允许栈顶进,栈顶出,先进后出,后进先出.我 ...
- Windows内核驱动--实现修改线程优先级demo
在User下修改优先级比较麻烦,该驱动可以直接用线程ID,和优先级级数两个参数直接修改线程的优先级: Client代码: #include <Windows.h> #include < ...