Too Many Segments CF595D 贪心乱搞
生活随笔
收集整理的這篇文章主要介紹了
Too Many Segments CF595D 贪心乱搞
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
傳送門(mén)!
比賽的時(shí)候沒(méi)有時(shí)間寫(xiě)了,看看了看大佬的代碼,學(xué)習(xí)學(xué)習(xí)。
一開(kāi)始實(shí)驗(yàn)室大佬說(shuō)是用差分寫(xiě)的,但是看了代碼發(fā)現(xiàn)打cf的人大家都是stl狂魔!
貪心思路:區(qū)間按照左端點(diǎn)排序,從1~2e5遍歷每一個(gè)點(diǎn),不是遍歷區(qū)間
如果有以該點(diǎn)為起點(diǎn)的區(qū)間則加入set并用pair記錄右端點(diǎn)以及區(qū)間下標(biāo)(pair第一維為右端點(diǎn),從小到大排序)
當(dāng)遍歷到某一點(diǎn)的時(shí)候如果set的第一個(gè)及右端點(diǎn)最小的小于i就彈出去set
其實(shí)就是我們以set來(lái)記錄同時(shí)存在的區(qū)間數(shù),然后如果s.size()大于k就證明包含該點(diǎn)的區(qū)間數(shù)肯定大于K,即覆蓋大于k次
刪除set中右端點(diǎn)最靠右的那個(gè),就是set的最后一個(gè)元素,這里就是貪心的意義。
//#pragma comment (linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#include<list>
#include<time.h>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define lowbit(x) x&(-x)
#define min4(a, b, c, d) min(min(a,b),min(c,d))
#define min3(x, y, z) min(min(x,y),z)
#define max3(x, y, z) max(max(x,y),z)
#define max4(a, b, c, d) max(max(a,b),max(c,d))
//freopen("E://1.in","r",stdin);
//freopen("E://1.out","w",stdout);
typedef unsigned long long ull;
typedef long long ll;
#define pii make_pair
#define pr pair<int,int>
const int inff = 0x3f3f3f3f;
const int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
const int mdir[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 1, -1, -1, -1};
const double eps = 1e-10;
const double PI = acos(-1.0);
const double E = 2.718281828459;
using namespace std;
const long long inFF = 9223372036854775807;
const int mod=1e9+7;
const int maxn=2e5+5;
vector<pr> v[maxn];//記錄該店為起點(diǎn)的區(qū)間的右端點(diǎn)及編號(hào)
set<pr> s;
vector<int> ans;
int main()
{int n,k;ios::sync_with_stdio(false);cin>>n>>k;int x,y;for(int i=1;i<=n;i++){cin>>x>>y;v[x].push_back(pii(y,i));}for(int i=1;i<=2e5;i++){while(s.size()&&s.begin()->first<i) //如果某個(gè)區(qū)間右端點(diǎn)小于i刪除s.erase(s.begin());for(auto x:v[i]) s.insert(x);//s中加入以i點(diǎn)為區(qū)間左端點(diǎn)的區(qū)間while(s.size()>k){ans.push_back((--s.end())->second);//如果大于k則證明i點(diǎn)覆蓋大于k次s.erase(--s.end());//貪心刪除右端點(diǎn)最右邊的那個(gè)}}cout<<ans.size()<<endl;for(auto x:ans) cout<<x<<" ";//auto是真好用vector中
}
?
總結(jié)
以上是生活随笔為你收集整理的Too Many Segments CF595D 贪心乱搞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: E:By Elevator or Sta
- 下一篇: HDU1811 Rank of Tetr