제출 #1044212

#제출 시각아이디문제언어결과실행 시간메모리
1044212pccEvent Hopping 2 (JOI21_event2)C++17
1 / 100
77 ms22224 KiB
#include <bits/stdc++.h>
using namespace std;


#define pii pair<int,int>
#define fs first
#define sc second
#define _all(T) T.begin(),T.end()

const int mxn = 2e5+10;

struct SEG{
#define mid ((l+r)>>1)
#define ls now*2+1
#define rs now*2+2
	int seg[mxn*4];
	SEG(){
		for(auto &i:seg)i = 0;
	}
	void init(){
		for(auto &i:seg)i = 0;
		return;
	}
	void modify(int now,int l,int r,int p,int v){
		if(l == r){
			seg[now] = max(seg[now],v);
			return;
		}
		if(mid>=p)modify(ls,l,mid,p,v);
		else modify(rs,mid+1,r,p,v);
		seg[now] = max(seg[ls],seg[rs]);
	}
	int getval(int now,int l,int r,int s,int e){
		if(l>=s&&e>=r)return seg[now];
		if(mid>=e)return getval(ls,l,mid,s,e);
		else if(mid<s)return getval(rs,mid+1,r,s,e);
		else return max(getval(ls,l,mid,s,e),getval(rs,mid+1,r,s,e));
	}
};

struct SEG2{
	pii seg[mxn*4];
	SEG2(){}
	void modify(int now,int l,int r,int s,int e){
		if(l>=s&&e>=r){
			seg[now].sc = 1;
			return;
		}
		if(mid>=s)modify(ls,l,mid,s,e);
		if(mid<e)modify(rs,mid+1,r,s,e);
		seg[now].fs = seg[ls].fs|seg[rs].fs|seg[ls].sc|seg[rs].sc;
		return;
	}
	int getval(int now,int l,int r,int s,int e){
		if(l>=s&&e>=r)return seg[now].fs|seg[now].sc;
		if(mid>=e)return seg[now].sc|getval(ls,l,mid,s,e);
		else if(mid<s)return seg[now].sc|getval(rs,mid+1,r,s,e);
		else return seg[now].sc|getval(ls,l,mid,s,e)|getval(rs,mid+1,r,s,e);
	}
#undef ls
#undef rs
#undef mid
};

SEG seg;
SEG2 seg2;

pii arr[mxn];
vector<int> all;
int N,K;
int rdp[mxn],ldp[mxn];
vector<int> v[mxn];
set<pii> st;

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>N>>K;
	for(int i = 1;i<=N;i++){
		auto &[a,b] = arr[i];
		cin>>a>>b;
		all.push_back(a);all.push_back(b-1);
	}
	all.push_back(-1);
	sort(_all(all));all.resize(unique(_all(all))-all.begin());
	for(int i = 1;i<=N;i++){
		auto &[a,b] = arr[i];
		a = lower_bound(_all(all),a)-all.begin();
		b = lower_bound(_all(all),b-1)-all.begin();
	}
	vector<int> perm(N);
	iota(perm.begin(),perm.end(),1);
	sort(perm.begin(),perm.end(),[](int a,int b){return arr[a].fs>arr[b].fs;});
	seg.init();
	for(auto &now:perm){
		rdp[now] = seg.getval(0,0,all.size(),arr[now].sc+1,all.size())+1;
		seg.modify(0,0,all.size(),arr[now].fs,rdp[now]);
	}
	seg.init();
	sort(perm.begin(),perm.end(),[](int a,int b){return arr[a].sc<arr[b].sc;});
	for(auto &now:perm){
		ldp[now] = seg.getval(0,0,all.size(),0,arr[now].fs-1)+1;
		seg.modify(0,0,all.size(),arr[now].sc,ldp[now]);
	}
	vector<int> ans;
	for(int now = 1;now<=N&&ans.size()<K;now++){
		if(ldp[now]+rdp[now]-1<K||seg2.getval(0,0,all.size(),arr[now].fs,arr[now].sc))continue;
		ans.push_back(now);
		seg2.modify(0,0,all.size(),arr[now].fs,arr[now].sc);
	}
	if(ans.size() == K)for(auto &i:ans)cout<<i<<'\n';
	else cout<<"-1\n";
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

event2.cpp: In function 'int main()':
event2.cpp:105:36: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  105 |  for(int now = 1;now<=N&&ans.size()<K;now++){
      |                          ~~~~~~~~~~^~
event2.cpp:110:16: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  110 |  if(ans.size() == K)for(auto &i:ans)cout<<i<<'\n';
      |     ~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...