首页 > 其他分享 >C132 线段树分治 CF1814F Communication Towers

C132 线段树分治 CF1814F Communication Towers

时间:2024-06-01 09:21:44浏览次数:12  
标签:CF1814F C132 Towers top high int tag include

视频链接:

 

Communication Towers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Problem - 1814F - Codeforces

// 线段树分治 O(mlognlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

#define int long long
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((l+r)>>1)
#define N 200005
int n,m,a[N],b[N];
int p[N],high[N],tag[N],top;
vector<pair<int,int> >tr[N<<2]; //记录时间区间上出现的边
struct node{
  int x,y,hy;
}st[N<<1]; //用栈记录边的端点的合并信息

void insert(int u,int l,int r,int L,int R,int x,int y){
  if(L>r||R<l) return;
  if(L<=l&&r<=R){
    tr[u].push_back({x,y}); //当前节点(时间区间)出现的边
    return;
  }
  insert(ls,l,mid,L,R,x,y);
  insert(rs,mid+1,r,L,R,x,y);
}
int find(int x){ //查找根
  if(p[x]==x) return x;
  return find(p[x]);
}
void merge(int x,int y){ //合并集合
  x=find(x),y=find(y);
  if(x==y) return;
  if(high[x]>high[y]) swap(x,y);
  st[++top]={x,y,high[y]}; //记录合并信息
  p[x]=y; //x指向y
  high[y]+=(high[x]==high[y]);
  tag[x]-=tag[y]; //消除y上已有标记的影响
}
void solve(int u,int l,int r){
  int now=top;
  for(int i=0;i<tr[u].size();i++)
    merge(tr[u][i].first,tr[u][i].second);
    
  if(l==r)tag[find(1)]++; //r时刻根上打标记
  else solve(ls,l,mid),solve(rs,mid+1,r);
  
  while(top>now){ //撤销合并
    node s=st[top--];
    p[s.x]=s.x;
    high[s.y]=s.hy;
    tag[s.x]+=tag[s.y]; //下传标记
  }
}
signed main(){
  cin>>n>>m; int k=2e5;
  for(int i=1;i<=n;i++)p[i]=i;
  for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]);
  for(int i=1;i<=m;i++){
    int x,y;scanf("%lld%lld",&x,&y);
    int l=max(a[x],a[y]),r=min(b[x],b[y]);
    if(l<=r) insert(1,1,k,l,r,x,y); //出现时间有交集则插入
  }
  solve(1,1,k); //线段树分治
  for(int i=1;i<=n;i++) if(tag[i])printf("%lld ",i);
  return 0;
}

 

标签:CF1814F,C132,Towers,top,high,int,tag,include
From: https://www.cnblogs.com/dx123/p/18224146

相关文章

  • CF85E Guard Towers
    CF85EGuardTowers二分+二分图看到最大值最小,考虑二分。二分距离最大值,限制了某些点对不能分到同一组,明显的二分图模型。用这些限制条件建图,跑二分图染色,看是否能分为二分图即可。考虑方案数的计算,题目中方案数不同的要求是第一组的集合不同就为不同方案,所以跑完二分图后,图分......
  • Atcoder ARC132E Paw
    考虑最后往左走往右走的覆盖情况。能发现肯定是有两个洞之间,或者是第一个洞左边,最后一个洞右边没有被覆盖,而左边的都被覆盖为向左,右边的都被覆盖为向右。大致证明就是考虑左边这一部分,如果有向右的,那么其右边的洞肯定都需要走过才行,不然会被覆盖,那么这样就可以一次性走出左边,就......
  • abc132F - Small Products
    abc132F-SmallProducts容易想到暴力dp,f[i][j]表示到第i个位置,且i位置上填的是j的方案数。虽然N非常大,但是如果我们考虑按\(\frac{n}{k}\)的值分块,那么就只有根号级别的数量\(f[i][j]\)表示在到第i个位置,且第i个位置选了第j个块中的数的方案数,那么所有能转移到第j个块的就是t......
  • [ARC132E] Paw
    最终状态自左至右一定形如<<<===>>>,即中间有一段和原序列相等,左边都是左箭头,右边都是右箭头的形式。证明考虑如果要保留原序列\([l,r]\)一段(显然\([l,r]\)中不含.),那么设位于\(l\)以左且距\(l\)最近的前两个点为\(i,j\)(满足\(i>j\)),如果操作方案中\(i\)位于\(j\)......
  • [ARC132E] Paw
    题目链接考虑最后形态,一定是有某一个区间\([l,r]\)保持初始的样子,\(l\)前面都是<,\(r\)后面都是>。这个区间一定是某两个相邻圆点的位置。设\(f_i\)为前\(i\)个数全部被覆盖成<的概率。设\(x\)为\(l\)前面圆点的数量,\(y\)为\(r\)后面圆点的数量,那么区间\([l......
  • arc130,arc131,arc132题解
    ARC130A-DARemoveOneCharacter对每个连续块分别处理即可。BColorfulLines非常经典的题目,对于每一行每一列记录最后出现的颜色并计算贡献即可。CDigitSumMinimization有点细节。枚举最后两个数,显然加起来超过十是很好的;然后前面的数应该尽量凑九,然后要注意尽量不选......
  • ARC132E
    https://www.luogu.com.cn/problem/AT_arc132_e由于一旦走到头那么这一个后缀/前缀就一定是对应的颜色,所以最终答案形如一段左脚印,一段保留原来的,一段右脚印。保留原来的段一定是在两个洞之间的一段完整段,考虑枚举这个段,左脚印的数量是确定的,转化成算概率的问题。这实际上等价......
  • [ABC132D] Blue and Red Balls
    2023-01-16题目传送门翻译难度&重要性(1~10):3题目来源AtCoder题目算法dp解题思路因为蓝球的数量是固定的,题目让我们求,在取\(i\)次的情况下,有几种方案,首先我们肯定要枚举\(i\),范围就是\(\sum_{i=1}^{k}\)了,然后因为他每次只能取连续的蓝球,于是我们就可以想到用插板......
  • Towers CF229D
    一个序列A,每次可以相邻的数相加为一个数字,求最少次数使得序列非降  f[i]=min{ f[j]+i-j-1} ,s[i]-s[j]>=s[j]-s[mn[j-1]] 维护下前缀最小值mn[i]......
  • 「解题报告」ARC132F Takahashi The Strongest
    不会FWT的真实。需要重写篇FWT博客。考虑Takahashi获胜当且仅当Aoki和Snuke选的相同,Takahashi选的是它的下一个。至少有一个相等,可以容斥为所有的都不相等。......