「模拟8.21」虎

正解贪心考场只骗到了70分

做法一:

现将没有限制的边缩掉然后连边,

这样我们直接采用贪心的做法,因为每个边最多只会被反一次,

那么从叶子节点向上对于一个需要修改的边没直接令他向上直到不能修改

注意处理连在lca上有两条链的现象

 1 #include<bits/stdc++.h>
 2 #define MAXN 2100000
 3 using namespace std;
 4 struct node{int to;int n;}e[MAXN];
 5 int tot,head[MAXN];
 6 int n;bool ok_1;int work_1;
 7 int fa[MAXN];int col[MAXN];
 8 bool h[MAXN];
 9 vector<int>son[MAXN];
10 void add(int u,int v)
11 {
12      e[++tot].to=v;e[tot].n=head[u];head[u]=tot;
13 }
14 void work1()
15 {
16      if(work_1%2==0)printf("%d\n",work_1/2);
17      else printf("%d\n",work_1/2+1);
18 }
19 int ans=0;
20 int biao[MAXN];
21 void updata(int x)
22 {
23      int me=x;
24      while(col[me]==0&&me!=1)
25      {
26            col[me]^=1;
27            me=fa[me];
28      }
29      biao[me]^=1;
30      if(biao[me]==1)
31      {
32         ans++;
33      }
34      return ;
35 }
36 void DFS(int x)
37 {
38      for(int i=head[x];i;i=e[i].n)
39      {
40          int to=e[i].to;
41          DFS(to);
42          if(col[to]==0)
43          {
44             updata(to);
45          }
46      }
47      return ;
48 }
49 signed main()
50 {
51      scanf("%d",&n);ok_1=1;
52      for(int i=2;i<=n;++i)
53      {
54          int x,y,z;
55          scanf("%d%d%d",&x,&y,&z);
56          if(x!=1)ok_1=0;
57          if(z==1&&y==0)work_1++;
58          if(z==0)h[i]=1;
59          fa[i]=x;col[i]=y;
60          son[x].push_back(i);
61      }
62      for(int i=2;i<=n;++i)
63      {
64          int me=i;
65          if(h[i]==1)
66          {
67              while(h[me]==1&&me!=1)
68                    me=fa[me];
69              for(int j=0;j<son[i].size();++j)
70              {
71                  fa[son[i][j]]=me;
72              }
73          }
74      }
75      for(int i=2;i<=n;++i)
76      {
77          if(h[i])continue;
78          add(fa[i],i);
79      }
80      if(ok_1)
81      {
82         work1();
83         return 0;
84      }
85      DFS(1);
86      printf("%d\n",ans);
87 }

做法二

我们如果能在一个lca上连两条边,那么这一定是优的

那么我们从下向上统计奇数偶数边的情况

参考cyf的代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #define INF 0x7fffffff
 4 using namespace std;
 5 const int MAXN=1000010;
 6 inline int minn(int a,int b){return a<b?a:b; }
 7 inline int read(){
 8     int s=0,w=0;char ch=getchar();
 9     while(ch<‘0‘||ch>‘9‘)w|=(ch==‘-‘),ch=getchar();
10     while(ch>=‘0‘&&ch<=‘9‘)s=s*10+ch-‘0‘,ch=getchar();
11     return w?-s:s;
12 }
13 #define kd (read())
14 int n;
15 struct rr{
16     int nt,w,to;
17 }bl[MAXN<<1];int hd[MAXN],itot;
18 void add(int x,int y,int z){
19     if(x==y)return ;
20     bl[++itot].to=y;
21     bl[itot].nt=hd[x];
22     bl[itot].w=z;
23     hd[x]=itot;
24 }
25 int fat[MAXN];
26 inline int find(int x){
27     if(!fat[x]||fat[x]==x)return x;
28     return fat[x]=find(fat[x]);
29 }
30 struct node{
31     int fr,to,y;
32 }Q[MAXN];int qtot;
33 int ans=0;
34 void dfs(int u,int fa,int id){//id of edge fa->u
35     int cnt=0;
36     for(int i=hd[u];i;i=bl[i].nt)
37         if(bl[i].to!=fa){
38             dfs(bl[i].to,u,i);
39             cnt+=(bl[i].w==0);
40         }
41     if(cnt&1){
42         ans+=cnt/2;
43         if(bl[id].w==1)++ans;
44     }
45     else ans+=cnt/2;
46 }
47 int main(){
48     //freopen("da.in","r",stdin);
49     n=kd;
50     bool pd_30=1;
51     int cnt=0;
52     for(int i=2,x,y,z;i<=n;++i){
53         x=kd;y=kd;z=kd;
54         pd_30&=(x==1);
55         if(z&&!y)++cnt;
56         if(!z)fat[find(i)]=find(x);
57         Q[++qtot].fr=i,Q[qtot].to=x,Q[qtot].y=y;
58     }
59     if(pd_30){
60         if(cnt&1)printf("%d\n",cnt/2+1);
61         else printf("%d\n",cnt/2);
62         return 0;
63     }
64     else{
65         for(int i=1;i<=qtot;++i){
66             add(find(Q[i].fr),find(Q[i].to),Q[i].y);
67             add(find(Q[i].to),find(Q[i].fr),Q[i].y);
68         }
69         bl[0].w=1;
70         dfs(find(1),0,0);
71         printf("%d\n",ans);
72         return 0;
73     }
74 }

原文地址:https://www.cnblogs.com/Wwb123/p/11420940.html

时间: 2024-08-29 17:09:01

「模拟8.21」虎的相关文章

「模拟8.21」山洞(矩阵优化DP)

暴力: 正解: 考虑循环矩阵,f[i][j]表示从i点到j点的方案数 我们发现n很小,我们预处理出n次的f[i][j] 然后在矩阵快速幂中,我们要从当前的f[i][j]*f[j][k]-->fir[i][j] 但是此时的循环为三层 我们考虑转移式子的意义在0-n次从i-j,在n+1到2×n转移至j 这样此时的j-k其实可以把他看作从0开始走j-k步本质上是一样的 然后还有一个特判,就不讲了 for(int j=0;j<n;++j) { ff[now][j]=(ff[now][j]+ff[las

「模拟赛20180406」膜树 prufer编码+概率

题目描述 给定一个完全图,保证\(w_{u,v}=w_{v,u}\)且\(w_{u,u}=0\),等概率选取一个随机生成树,对于每一对\((u,v)\),求\(dis(u,v)\)的期望值对\(998244353\)取模. 输入 第一行一个数\(n\) 接下来\(n\)行,每行\(n\)个整数,第\(i\)行第\(j\)个整数表示\(w_{i,j}\) 输出 输出共\(n\)行,每行\(n\)个整数,第\(i\)行第\(j\)个整数表示\(dis(i,j)\)的期望值 样例 样例输入 4 0 1

「模拟赛20191019」B 容斥原理+DP计数

题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输出 一行一个整数表示答案对\(998244353\)取模的值. 样例 样例输入 3 样例输出 32 数据范围 对于\(100\%\)的数据,\(1\leq n\leq 300\). 比第一题难了不知道多少-- 这种东西怎么看都是容斥嘛. 我们先考虑对角线没有限制的情况: 枚举行和列有多少个是同色的,

python爬虫22 | 以后我再讲python「模拟登录」我就是狗

接下来就是 学习python的正确姿势 做爬虫 绕不开模拟登录 为此小帅b给大家支了几招 python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定! 有些网站的登录很弱鸡 传个用户名和密码 来个 POST 请求就搞定了 但还是少数 大多网站还是需要验证码的 登录需要验证码 频繁请求需要验证码 为此小帅b教你如何自动识别 python爬虫20 | 小帅b教你如何识别图片验证码 python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别 当然了 市面上还有许多打码验证平

LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意

二次联通门 : LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意 /* LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意 本想打个暴力找找规律 结果交上去就A了... 读入所有数 处理出前缀和 然后枚举区间长度 处理处1~n的答案 后O(1)查询即可 复杂度O(n^2 + m) */ #include <iostream> #include <cstring> #include <cstdio> voi

微信小程序「官方示例代码」剖析【下】:运行机制

在上一篇<微信小程序「官方示例代码」浅析[上]>中,我们只是简单的罗列了一下代码,这一篇,让我们来玩点刺激的--就是看看IDE的代码,了解它是怎么运行的. 还好微信的开发团队在软件工程的实践还有待提高,我们才有机会可以深入了解他们的代码--真想建议他们看看Growth的第二部分,构建系统. 解压应用 首先你需要有下面的工具啦 Mac电脑 微信web开发者工具.app WebStorm / 其他编程器 或 IDE,最好可以支持重命名 首先,我们需要右键微信web开发者工具.app,然后显示包的内

从特斯拉到计算机视觉之「图像语义分割」

作者:魏秀参链接:https://zhuanlan.zhihu.com/p/21824299来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 说起特斯拉,大家可能立马会想到今年5月份发生在特斯拉Model S自动驾驶上的一宗夺命车祸.初步的调查表明,在强烈的日照条件下,驾驶员和自动驾驶系统都未能注意到牵引式挂车的白色车身,因此未能及时启动刹车系统.而由于牵引式挂车正在横穿公路,且车身较高,这一特殊情况导致Model S从挂车底部通过时,其前挡风玻璃与挂车底部发生撞击

loj #6091. 「Codeforces Round #418」幻想特快

#6091. 「Codeforces Round #418」幻想特快 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using namespace std; 7 #define maxn 10000 8 int n,a[maxn],b[maxn],p[maxn],nxt1,nxt2,tot,

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在