1249D1 - Too Many Segments (easy version)
1249D2 - Too Many Segments (hard version)
题意:给n条平行线段,区间被线段覆盖,问:使所有点上最多有k次覆盖,最少需要删除多少条边。
贪心的思路:从最左(点1)向右找当一个点被覆盖超过k,找到覆盖它的线段,删除右端点最远的线段,如果还超过k,再继续删除。
easy版本一共只有200个点,用差分再求前缀得到点上被覆盖线段的数量,每到一个点遍历所有的边以找到要删除的边。删除这条边后还要在数组l-r中删除1。
hard版本有2e52e52e5个点,不能直接遍历。但我们仍需要找到覆盖到某一点的边,和点当前的覆盖次数。预存储每个点以它为起始点的边号,和到它就结束的边边号(比如一条直线是(2,5),我们需要在2点存下这条边,再在6点存下,打上标记区分,题中有(2,2)的这种边,所以加入我们在点2存表示开始和结束的不能达到我们接下来要的效果)。不过依然从最左边点开始,将以该点为起始点的边加入到set<int>segtset<int> segtset<int>segt中,在删除以它为结束点的边(边(2,3),在点4时把他删除,这就是为什么这样存的作用了)(保证segt中的边都是覆盖这个点的),以及一个变量subcur,和一个数组sub。当我们删除一条边(l,r)时,subcur++,sub[r+1]−−--−−,前缀数组−-−subcur就可以表示点的覆盖次数。sub数组的作用是维护subcur,当(l,r)线段被删除后,只有l-r的覆盖改变,所有到遍历到r+1点时,需要subcur+sub[r+1]。

hard版本

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<string.h>
#include<set>
using namespace std;
const int maxn=2e5+10;
int n;
int c[maxn];
int lowbit(int x){return x&(-x);
}
void update(int i,int k){while(i<maxn){c[i]+=k;i+=lowbit(i);}
}
int getsum(int i){int res=0;while(i>0){res+=c[i];i-=lowbit(i);}return res;
}
struct ac{int l,r;
}seg[maxn];
vector<int> vec[maxn];
int sub[maxn];
int det[maxn];
void init(){memset(det,0,sizeof det);memset(c,0,sizeof c);memset(seg,0,sizeof seg);memset(sub,0,sizeof sub);
}
set<pair<int,int> > segt;
int main(){int n,k;init(); scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){int l,r;scanf("%d%d",&l,&r);seg[i]=(ac){l,r};update(l,1);update(r+1,-1);vec[l].push_back(i);vec[r+1].push_back(-i);}int cnt=0;int subcur=0;for(int i=1;i<maxn;i++){subcur+=sub[i];for(auto it:vec[i]){if(it>0) {segt.insert(make_pair(seg[it].r,i));}else {auto at=segt.find(make_pair(seg[-it].r,-it));if(at!=segt.end())    segt.erase(at);}}while(getsum(i)-subcur>k){cout<<getsum(i)-subcur<<endl;int rrr=segt.rbegin()->first;int pos=segt.rbegin()->second;auto at=segt.rbegin();segt.erase(prev(segt.end()));--sub[seg[pos].r+1];det[pos]=1;subcur++;}}cout<<cnt<<endl;for(int i=1;i<maxn;i++){if(det[i]==1) cout<<i<<" ";}cout<<endl;return 0;
}

Cf#595 (Div. 3)D-贪心相关推荐

  1. cf #823 Div.2(A~C)

    Cf #823 Div.2 文章目录 Cf #823 Div.2 [A. Planets](https://codeforces.com/contest/1730/problem/A) [B. Mee ...

  2. cf #818 Div.2(A~C)

    Cf #818 Div.2 文章目录 Cf #818 Div.2 [A. Madoka and Strange Thoughts](https://codeforces.com/contest/171 ...

  3. CF #683 div.2

    CF #683 div.2 目前 ABCD A. Add Candies B. Numbers Box C. Knapsack D. Catching Cheaters 结尾 A. Add Candi ...

  4. cf #825 Div.2(A~C2)

    Cf #825 Div.2 文章目录 Cf #825 Div.2 [A. Make A Equal to B](https://codeforces.com/contest/1736/problem/ ...

  5. edu cf #138 Div.2(A~D)

    edu cf #138 Div.2 文章目录 edu cf #138 Div.2 [A. Cowardly Rooks](https://codeforces.com/contest/1749/pro ...

  6. cf #829 Div.2(A~D)

    Cf #829 Div.2 A. Technical Support 题意 给定一个以Q开头的只含有'Q'&'A'的字符串,每一个问题后面必须有回答 问给定的字符串是否符合要求 题解 贪心,Q ...

  7. cf #832 Div.2(A-D)

    Cf #832 Div.2 文章目录 Cf #832 Div.2 [A. Two Groups](https://codeforces.com/contest/1747/problem/A) [B. ...

  8. Codeforces Round #595 (Div. 3) F. Maximum Weight Subset 树形dp

    传送门 文章目录 题意: 思路: 题意: n≤200n\le200n≤200 思路: 明显的树形dpdpdp,所以考虑一下dpdpdp状态. 这个题状态挺神的..可能是因为我太菜了,看了半天才看懂. ...

  9. CF #366(div.2) C 模拟,思维

    CF #366(div.2)  C.  Thor 题意:一个手机n个联系人,有q个操作.每次给出ty和ai,如ty==1,表示收到ai的一条信息:如ty==2,表示将ai发的信息都看掉:如ty==3, ...

  10. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

最新文章

  1. 解决.net webservice的WebClient或HttpWebRequest首次连接缓慢问题
  2. stm32.cube介绍
  3. Web前端开发笔记——第三章 CSS语言 第二节 CSS选择器
  4. python有什么隐藏功能_Python的隐藏功能
  5. [react] react中什么是非控组件?
  6. 获取弹出的窗口_Win7系统如何获取设置everyone权限的问题
  7. 光轴会聚模型求解世界坐标点流程与公式理解
  8. 5_python基础—条件语句(三目运算符)
  9. Eclipse控制台输出信息的控制
  10. 使用DBUtils实现增删改查
  11. mysql 返回自增id_mysql 返回自增id
  12. 基于linux运行指的什么意思,基于Linux的Windows非常有意义
  13. python面试问题_Python面试问题
  14. Python print()重定向 不输出到屏幕
  15. 如何使用速问速答求解一元二次方程
  16. 数据库及对应数据文件使用查询
  17. 免费的onlineserver工具livezilla
  18. stack smashing detected(c++报错)
  19. VM虚拟机安装CentOS系统的常见BUG
  20. XML(1)——shema约束之命名空间

热门文章

  1. 软件测试面试必问的10个问题
  2. 围炉听风,新醅试手烫
  3. 如何快速学习一门技术?十步学习法
  4. git--取消文件跟踪(Tracked改为Untracked)
  5. gie拉取Can‘t update master has no tracked branch
  6. wps小技巧,wps删除空白页怎么删?
  7. html英文改中文语言,英文版win7旗舰版系统改成中文语言图文教程
  8. wpa_supplicant
  9. 最强PostMan使用教程(1)
  10. html数字自动滚动代码,HTML+JS实现滚动数字的时钟