Codeforces Round #567 (Div. 2) E2 A Story of One Country (Hard)
https://codeforces.com/contest/1181/problem/E2
想到了划分的方法跟题解一样,但是没理清楚复杂度,很难受。
看了题解觉得很有道理,还是自己太菜了。
然后直接开始写,四个if写的太难受了180+行。
ac之后看了红名大佬的代码,简直woc,好短,四个sort我分开写了,但是红名大佬写的很巧妙,借鉴了一下代码长度缩短到110行左右,红名大佬np,特此记录。
使用静态链表,复杂度计算 T(n) = T(a1)+T(a2)+T(a3) ... + O(nlogn) ( ai<=n/2)
傻逼版
#include<bits/stdc++.h>
#include<ext/rope>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define mst(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x&(-x))
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<ull,ull> pull;
typedef pair<int,int> pii;
const int mod = 1e9+;
ll qpow(ll a,ll b){ll res=;for(;b;b>>=,a=a*a%mod)if(b&)res=res*a%mod;return res; }
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 2e5+;
void co(){
cout<<"NO";exit();
}
int x1[maxn],x2[maxn],y1[maxn],y2[maxn];
bool cmp0(const int&le,const int&ri){
return x1[le]<x1[ri];
}
bool cmp1(const int&le,const int&ri){
return y1[le]<y1[ri];
}
bool cmp2(const int&le,const int&ri){
return x2[le]>x2[ri];
}
bool cmp3(const int&le,const int&ri){
return y2[le]>y2[ri];
}
int pre[][maxn],nx[][maxn];
void store(int *f){
for(int i=;i<;++i)
f[i]=nx[i][];
}
void read(int *f){
for(int i=;i<;++i)
nx[i][]=f[i];
}
void init(vector<int>&use){
sort(use.begin(),use.end(),cmp0);
int p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
sort(use.begin(),use.end(),cmp1);
p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
sort(use.begin(),use.end(),cmp2);
p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
sort(use.begin(),use.end(),cmp3);
p=;
for(int v:use){
nx[][p]=v;
pre[][v]=p;
p=v;
}
nx[][p]=;
}
void del(int p){
for(int i=;i<;++i){
int a=pre[i][p],b=nx[i][p];
nx[i][a]=b;pre[i][b]=a;
}
}
void solve(vector<int>&use){
if(use.size()<=)return;
init(use);
// for(int i=0;i<4;++i){
// int p=nx[i][0];
// while(p!=0){
// cout<<p<<" ";
// p=nx[i][p];
// }
// cout<<endl;
// }
// exit(0);
int sz=use.size();
while(sz>){
int now[];
store(now);
int v[]={x2[now[]],y2[now[]],x1[now[]],y1[now[]]};
bool ok=false;
for(int i=;i<sz;++i){
for(int d=;d<;++d)
now[d]=nx[d][now[d]];
if(x1[now[]]>=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=max(v[],x2[now[]]);
if(y1[now[]]>=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=max(v[],y2[now[]]);
if(x2[now[]]<=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=min(v[],x1[now[]]);
if(y2[now[]]<=v[]){
vector<int>son;
for(int j=nx[][];j!=now[];j=nx[][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
break;
}else v[]=min(v[],y1[now[]]);
}
if(!ok)co();
}
}
vector<int>a;
int main() {
#ifdef local
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n;
cin>>n;
for(int i=;i<=n;++i)
cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
for(int i=;i<=n;++i)
a.push_back(i);
solve(a);
cout<<"YES"; return ;
}
借鉴大佬代码改良版
#include<bits/stdc++.h>
#include<ext/rope>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define mst(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x&(-x))
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<ull,ull> pull;
typedef pair<int,int> pii;
const int mod = 1e9+;
ll qpow(ll a,ll b){ll res=;for(;b;b>>=,a=a*a%mod)if(b&)res=res*a%mod;return res; }
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 2e5+;
void co(){
cout<<"NO";exit();
}
pii a[][maxn];
int pre[][maxn],nx[][maxn];
void store(int *f){
for(int i=;i<;++i)
f[i]=nx[i][];
}
void read(int *f){
for(int i=;i<;++i)
nx[i][]=f[i];
}
void init(vector<int>&use){
for(int i=;i<;++i){
sort(use.begin(),use.end(),[&](const int &le,const int&ri){
return a[i][le]<a[i][ri];
});
int p=;
for(int v:use){
nx[i][p]=v;
pre[i][v]=p;
p=v;
}
nx[i][p]=;
}
}
void del(int p){
for(int i=;i<;++i){
int a=pre[i][p],b=nx[i][p];
nx[i][a]=b;pre[i][b]=a;
}
}
void solve(vector<int>&use){
if(use.size()<=)return;
init(use);
int sz=use.size();
while(sz>){
int now[],v[];
store(now);
for(int i=;i<;++i)
v[i]=a[i][now[i]].second;
bool ok=false;
for(int i=;i<sz and !ok;++i){
for(int d=;d< and !ok;++d){
now[d]=nx[d][now[d]];
if(a[d][now[d]].first>=v[d]){
vector<int>son;
for(int j=nx[d][];j!=now[d];j=nx[d][j])
son.push_back(j);
for(int v:son)
del(v);
store(now);
solve(son);
sz-=i;
read(now);
ok=true;
}else v[d]=max(v[d],a[d][now[d]].second);
}
}
if(!ok)co();
}
}
vector<int>uu;
int main() {
#ifdef local
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n;
cin>>n;
for(int i=;i<=n;++i){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
a[][i]=pii(x1,x2);
a[][i]=pii(y1,y2);
a[][i]=pii(-x2,-x1);
a[][i]=pii(-y2,-y1);
}
for(int i=;i<=n;++i)
uu.push_back(i);
solve(uu);
cout<<"YES"; return ;
}
Codeforces Round #567 (Div. 2) E2 A Story of One Country (Hard)的更多相关文章
- Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】
传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...
- CodeForces -Codeforces Round #496 (Div. 3) E2. Median on Segments (General Case Edition)
参考:http://www.cnblogs.com/widsom/p/9290269.html 传送门:http://codeforces.com/contest/1005/problem/E2 题意 ...
- Codeforces Round #567 (Div. 2)自闭记
嘿嘿嘿,第一篇文章,感觉代码可以缩起来简直不要太爽 打个div2发挥都这么差... 平均一题fail一次,还调不出错,自闭了 又一次跳A开B,又一次B傻逼错误调不出来 罚时上天,E还傻逼了..本来这场 ...
- Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数. 思路:很巧秒的转换,我们把<= m 数记为1, ...
- Codeforces Round #567 (Div. 2)A
A. Chunga-Changa 题目链接:http://codeforces.com/contest/1181/problem/A 题目 Soon after the Chunga-Changa i ...
- Codeforces Round #567 Div. 2
A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...
- Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心)
B. Split a Number time limit per test2 seconds memory limit per test512 megabytes inputstandard inpu ...
- Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version)
Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) N个盒子,每个盒子有a[i]块巧克力,每次操作可以将盒子中的 ...
- Codeforces Round #567 (Div. 2) A.Chunga-Changa
原文链接:传送 #include"algorithm" #include"iostream" #include"cmath" using n ...
随机推荐
- aspose导出数据
注意 aspose合并单元格后设置单元格样式要一格一格的设置 public class InvoiceAsposeExcel { /// <summary> /// 导出数据 /// &l ...
- 【原创】大叔经验分享(58)kudu写入压力大时报错
kudu写入压力大时报错 19/05/18 16:53:12 INFO AsyncKuduClient: Invalidating location fd52e4f930bc45458a8f29ed1 ...
- shell、bash、terminal和kernel之间的关系
shell.bash.terminal和kernel之间的关系 本文是<鸟哥的Linux私房菜>的学习笔记 什么是kernel kernel的中文是"操作系统核心",主 ...
- svn的一些使用技巧
新项目的目录结构说明: 代码分三部分 1.01_Trunk(开发主干) 2.02_Branches(开发分支) 3.03_Tags(提交代码区) 文档区 请注意SVN的路径是区分大小写的! 与VSS的 ...
- vue入门:(组件)
模板:(template)模板声明了数据和最终展现给用户的DOM之间的映射关系. 初始数据:(data)一个组件的初始数据状态.对于可复用的组件来说,通常是私有的状态. 接收外部参数:(props)组 ...
- day1-css练习[新浪首页顶部栏]
直接贴代码吧: html代码 <div class="border-01"> <div class="border-001"> < ...
- vue中ref-父主动取值值;
多用月input标签 定义的时候 直接写ref=“id” <el-input placeholder="请输入内容" style="width: 150px&quo ...
- jmeter压测实践
技巧一:命令行执行 命令执行:指定参数,报告的存储位置 jmeter -n -t baidu_requests_results.jmx -r -l baidu_requests_results.jtl ...
- JCA-Java加密框架
转自:https://www.jianshu.com/p/a8194c237363 JCA是平台的一个主要部分,包含一个“Provider”体系结构和一组用于数字签名,消息摘要(哈希),证书和证书验证 ...
- centos7.3安装mysql5.7
一.写随笔的原因:最近在阿里云上买了个centos7.3服务器,想将一些demo运行在上面,所以需要做一些环境的安装,通过此篇文章MAKR一下.下面来记录下安装步骤(参考网上的一些教程,有坑的话会实时 ...