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 模 ...
随机推荐
- C语言相关知识
1.指针:在程序中定义了一个变量,在进行编译时就会给该变量再内存中分配一个地址,通过访问这个地址可以找到所需变量,这个变量的地址成为该变量的指针.指针看作是内存中的一个地址,多数情况下,这个地址是内存 ...
- Java | 参数传值机制
值传递 java中,方法中所有的参数的都是"值传递",就是传递的是原来值的副本,不是原来的参数,因此,改变不会影响到原来的参数. 基本数据类型参数的传值 传递的都是副本,改变以后不 ...
- ARTS第十二周
1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的技术文章 以下是 ...
- yum的卸载和安装
安装精髓:报错就查,少包就按. 一.如果yum没有注册则需要卸载再安装第三方yum 1.卸载redhat的默认安装yum包 [root@dsl ~]#rpm –qa | grep yum [root@ ...
- Docker 基础备忘录
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...
- GYM101471D「ICPC2017 WF」Money for Nothing
「ICPC2017 WF」Money for Nothing 传送门 我们可将生产商和消费商都看成二维平面上的点,其坐标分别为 \((d_i,p_i)\),\((e_i,q_i)\). 那么问题转变为 ...
- 『与善仁』Appium基础 — 1、Android系统的测试环境搭建
目录 1.Android操作系统简介 (1)Android系统诞生 (2)Android系统的结构 (3)Android测试环境搭建整体思路 2.Java环境安装 (1)JDK8下载 (2)安装JDK ...
- Motion Planning 是什么
前言与引用 这一个呢,主要是自己突然看一篇论文的时候不知道 为什么他提出的方法对于规划来说就是好的,规划又应该分为哪几个部分,解决的是哪几个部分的问题?带着这个问题,我就去搜:Motion Plann ...
- js里的发布订阅模式及vue里的事件订阅实现
发布订阅模式(观察者模式) 发布订阅模式的定义:它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布订阅模式在JS中最常见的就是DOM的事件绑定与触发 ...
- CSP-S 2020
游记 Day# 游记个鬼啊就在自家学校=-= 早上宿舍待不了,去机房颓废,看了几集猫和老鼠,并且把看门狗军团的流程看完了(真棒),甚至在考试之前把老师给的巧克力也吃完了. 期间zyt学长来摸鱼.他们今 ...