[NOIP10.5模拟赛]3.c题解--思维
题目链接
这次不咕了
https://www.luogu.org/problemnew/show/AT2389
闲扯
考场20分爆搜走人 \cy
话说这几天T3都很考验思维啊
分析
我们先钦定一只鸡(虽然考试时是苹果但是我觉得杀鸡更亲切(因为我们某位同学))先必须活着,所以呢我们需要逆着倒推每一组关系,然后把为了保证我们钦定的鸡活着必须杀的鸡放进一个集合,为了方便表示用\(f[now][i]=1/0\)表示钦定第now只鸡活着第\(i\)只鸡最终有没有加入集合;
对于一对关系\((a,b)\),如果\(f[now][a]=1\),那么\(f[now][b]\)显然必须置为1加入集合,因为a这只鸡为了保证now不被杀掉已经在一条边中被杀掉,为了保证当前这条边合法则必须杀掉b(注意关系是倒着枚举的)
但这是有个问题,就是如果\(f[now][a]\)&\(f[now][b]=1\)说明关系矛盾,\(now\)必须死,为啥?

我们考虑没有这种情况,将鸡视为点,关系视为边,显然我们的集合实际上是一个以now为根节点的树,而且满足\(x\)到\(fa[x]\)的关系比\(fa[x]\)到\(fa[fa[x]]\)的边次序要早(但是在枚举时因为是倒着枚举是先构成前者)
如果这时候加入一条边连接两个已经在集合中的点\((a,b)\),由于1号边次序要比2,3边早,所以先必须在a,b中选一个杀死满足1号边的关系.但是我们为了让now不死,我们必须要让a点因为2号边死去,b因为3号边死去.出现了这种情况显然就不可能了,所以需要记录一下\(now\)存活是不可行的
最后假设已经遍历完,获得钦定每个点活着的时候要杀掉的鸡的集合(虽然不一定合法)
然后对于每一只鸡判断是否能与编号靠后的另一只鸡一起存活,怎么判断呢?
首先如果如果其中有只鸡本身无法存活则特判continue,但是还有种非法的情况,就是存在一只鸡为了满足\(a\)活必须死,又同时满足\(b\)活下来也必须死.这样的话\(a,b\)无法同时存活
这其实很显然的,边有先后顺序,你为了满足其中一只鸡另一只鸡就一定不可行,所以这种情况我们可以把两个鸡的集合并起来看看有没有1存在
代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <iostream>
#include <bitset>
#define ll long long
#define ri register int
using std::min;
using std::bitset;
using std::max;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=405;
const int inf=0x7fffffff;
bitset <maxn> o[maxn];
bool ok[maxn];
int a[100005],b[100005],m,n;
int main(){
int x,y;
bool flag=0;
read(n),read(m);
for(ri i=1;i<=m;i++)read(a[i]),read(b[i]);
for(ri i=1;i<=n;i++){
o[i][i]=1;flag=0;
for(ri j=m;j>=1&&!flag;j--){
x=o[i][a[j]],y=o[i][b[j]];
if(x&y){
ok[i]=1;
flag=1;continue;
}
if(x){o[i][b[j]]=1;}
if(y){o[i][a[j]]=1;}
}
}
ll ans=0;
for(ri i=1;i<=n;i++){
if(ok[i])continue;
for(ri j=i+1;j<=n;j++){
if(ok[j])continue;
if(!((o[i]&o[j]).any()))ans++;
}
}
printf("%lld\n",ans);
return 0;
}
[NOIP10.5模拟赛]3.c题解--思维的更多相关文章
- [NOIP10.4模拟赛]3.z题解--思维
题目链接: 咕咕 闲扯: 哈哈这道T3考场上又敲了5个namespace,300+行,有了前车之鉴还对拍过,本以为子任务分稳了 结果只有30分哈哈,明明用极限数据对拍过不知怎么回事最后数据又是读不全, ...
- [NOIP10.6模拟赛]1.merchant题解--思维+二分
题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...
- [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...
- [NOIP10.3模拟赛]3.w题解--神奇树形DP
题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...
- [NOIP10.5模拟赛]1.a题解--离散化+异或线段树
题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...
- [NOIP10.4模拟赛]2.y题解--折半搜索+状压计数
题目链接: 咕 闲扯: 这题暴力分似乎挺多,但是一些奇奇怪怪的细节没注意RE了,还是太菜了 分析: 首先我们考虑最naiive的状压DP ,\(f[u][v][state]\)表示u开头,v结尾是否存 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 模拟赛 提米树 题解 (DP+思维)
题意: 有一棵棵提米树,满足这样的性质: 每个点上长了一定数量的Temmie 薄片,薄片数量记为这个点的权值,这些点被标记为 1 到 n 的整数,其 中 1 号点是树的根,没有孩子的点是树上的叶子. ...
- DYOJ 【20220317模拟赛】瞬间移动 题解
瞬间移动 题意 三维空间中从 \((0,0,0)\) 开始,每次移动 1,问刚好走 \(N\) 次能到 \((X,Y,Z)\) 的方案数 \(N\le10^7\),答案模 \(998244353\) ...
随机推荐
- PHP学习之工厂方法模式
<?php //工厂方法模式 interface Doing { function eat(); function sleep(); } class Cat implements Doing { ...
- List和Set 总结
一 List三个子类的区别和应用场景 Vector:底层是数组,查询快,增删慢 Arraylist:底层是数组,查询块,增删慢 LinkedList:底层是链表,查询慢,增删快 效率: Vector: ...
- Linux学习:使用 procrank 测量系统内存使用情况
程序员应该了解一个基本问题:我的程序使用了多少内存?这可能是一个简单的问题,但是对于像Linux这样的虚拟内存操作系统,答案是相当复杂的,因为top和ps给出的数字不能简单相加.进程中两个最常见的内存 ...
- web开发的三层架构
Web层 接收客户端发送过来的数据,然后需要将数据传递给service层 Service层 业务逻辑层:业务:比如检验用户名的是否存在,如果不存在则需要把用户的数据存储在数据库中,如果存在,给web返 ...
- sql控制流if()、case when then
tb_user: 1.if (expr1,expr2,expr3) #如果expr1成立,则返回expr2,否则返回expr3示例:select name, if (sex=1,'男','女') ...
- React开发环境配置
本文以上一篇文章继续配置:npm安装及环境配置<https://www.cnblogs.com/hzb462606/p/11565275.html> 使用 create-react-app ...
- 获取当前运行的exe路径
void GetAppPath(CString& path) { TCHAR str[] = {}; GetModuleFileName(NULL,str,); wchar_t *pszPos ...
- 微信小程序如何修改本地缓存key中的单个数据
假如用户注册后,获得用户手机号和userid,realName默认为0,然后进入B页面进行实名认证,认证成功后realName变为1,再更新缓存里的用户信息. A页面用户注册后,存储用户信息: var ...
- 【ARM-Linux开发】wayland和weston的介绍
简单地说,Wayland是一套display server(Wayland compositor)与client间的通信协议,而Weston是Wayland compositor的参考实现.其官网为h ...
- 【VS开发】千兆以太网的传输速度
千兆以太网主流标准 千兆以太网络技术早在上世纪90年代末就已成熟,其中,1995年国际标准化组织TIA/EIA颁布了1000Base-TX标准,该标准的目的是把双绞线用于千兆以太网中,其目的是在6类非 ...