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)的更多相关文章

  1. 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 ...

  2. 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 题意 ...

  3. Codeforces Round #567 (Div. 2)自闭记

    嘿嘿嘿,第一篇文章,感觉代码可以缩起来简直不要太爽 打个div2发挥都这么差... 平均一题fail一次,还调不出错,自闭了 又一次跳A开B,又一次B傻逼错误调不出来 罚时上天,E还傻逼了..本来这场 ...

  4. Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)

    E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数. 思路:很巧秒的转换,我们把<= m 数记为1, ...

  5. Codeforces Round #567 (Div. 2)A

    A. Chunga-Changa 题目链接:http://codeforces.com/contest/1181/problem/A 题目 Soon after the Chunga-Changa i ...

  6. Codeforces Round #567 Div. 2

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  7. 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 ...

  8. 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]块巧克力,每次操作可以将盒子中的 ...

  9. Codeforces Round #567 (Div. 2) A.Chunga-Changa

    原文链接:传送 #include"algorithm" #include"iostream" #include"cmath" using n ...

随机推荐

  1. JS基础_while的练习2

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. LeetCode 腾讯精选50题--最小栈

    题目很简单,实现一个最小栈,能够以线形的时间获取栈中元素的最小值 自己的思路如下: 利用数组,以及两个变量, last用于记录栈顶元素的位置,min用于记录栈中元素的最小值: 每一次push,都比较m ...

  3. Oracle update 多字段更新

    一次性update多个字段 以student表为例: -- 创建学生表 create table student ( id number, name varchar2(40), age number, ...

  4. Docker 部署mysql、tomcat笔记

    Docker 笔记整理 #.环境:Ubuntu 18.* #.安装 mysql 5.6.tomcat #.docker search mysql 报错:Error response from daem ...

  5. conda查找安装包的版本以及安装特定版本的包

    如下图 想要安装特定版本的torchvision,然后conda search torchvision,能够列出conda云上所有的安装包 然后,安装包的时候,conda install 包名=版本就 ...

  6. webpack升级4出现的问题

    webpack3升级到4出现了很多问题,经过验证报错信息如下 1 Module parse failed: Unexpected token (:) You may need an appropria ...

  7. C# 基础 字符串 集合 文件操作

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. another-redis-desktop-manager

    brew cask install another-redis-desktop-manager

  9. 百度云直线在线解析+xdown

    一:在浏览器打开百度云分享链接(推荐Google)百度云分享的链接:https://pan.baidu.com/s/17YQ2x--kOAa_hpapaTcq8Q第二步:打开直线在线解析:https: ...

  10. 启动Activity的单独事件方法2

    1.Button中创建android:onClick="sendmessage" sendmessage方法名 //MAIN_acitivity创建这个同名独立方法 响应Butto ...