当前位置:网站首页>【NOI模拟赛】区域划分(结论,构造)
【NOI模拟赛】区域划分(结论,构造)
2022-07-07 02:33:00 【DD(XYX)】
题面
1s , 512mb
题解
首先,如果有相邻两城党派相同一定无解。
我们发现,最终的方案一定得有相邻的三座城市是在一个三角形里的,而把这个三角形连上后,相当于把中间的城市去掉,剩下的部分就又是一个子问题。
于是,我们统计相邻的能组成三角形的三元组个数 X X X(若某位置 i i i 满足 a i a_i ai 和其左右两个位置刚好构成集合 { 0 , 1 , 2 } \{0,1,2\} { 0,1,2} ,则可构成三元组),不难发现,当我们连上一个三角形时, X X X 减少量为奇数,且存在方案使其大于零。而最终一定是剩三个城,刚好 X X X 变为 1 的,所以——答案有解当且仅当 X > 0 X>0 X>0 且 X X X 与 n n n 的奇偶性相同。
如何使得 X X X 恒大于零呢?其实只需要尽量使用边缘的三元组——当且仅当某个三元组与左右两个三元组的中心城市相邻时,该三元组不是边缘三元组。若没有边缘的三元组,当然随便选一个连都没问题。因为我们发现,若选了一个非边缘三元组,会使得 X X X 减少 3 3 3 ,这时只有全都是非边缘三元组的时候能保证还存在三元组。
于是我们用 set 和链表维护三元组,时间复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
看了题解后,我发现我是个XX。
首先,若无相邻相同城市,则 X X X 的奇偶性一定与 n n n 相同。也就是说只要 X > 0 X>0 X>0 就有解了。而且不难证明,只要同时存在 0 , 1 , 2 0,1,2 0,1,2 , X X X 就大于 0 。
然后,有很简单的构造法:
CODE
打着我的小笨码,逃避着我的小笨责任
#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<random>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#pragma GCC optimize(2)
using namespace std;
#define MAXN 100005
#define LL long long
#define ULL unsigned long long
#define ENDL putchar('\n')
#define DB double
#define lowbit(x) (-(x) & (x))
#define FI first
#define SE second
#define PR pair<int,int>
#define UIN unsigned int
#define eps 1e-6
int xchar() {
static const int maxn = 1000000;
static char b[maxn];
static int pos = 0,len = 0;
if(pos == len) pos = 0,len = fread(b,1,maxn,stdin);
if(pos == len) return -1;
return b[pos ++];
}
// #define getchar() xchar()
inline LL read() {
LL f = 1,x = 0;int s = getchar();
while(s < '0' || s > '9') {
if(s<0)return -1;if(s=='-')f=-f;s = getchar();}
while(s >= '0' && s <= '9') {
x = (x<<1) + (x<<3) + (s^48);s = getchar();}
return f*x;
}
void putpos(LL x) {
if(!x)return ;putpos(x/10);putchar((x%10)^48);}
inline void putnum(LL x) {
if(!x) {
putchar('0');return ;}
if(x<0) putchar('-'),x = -x;
return putpos(x);
}
inline void AIput(LL x,int c) {
putnum(x);putchar(c);}
int n,m,s,o,k;
int a[MAXN];
int l[MAXN],r[MAXN];
set<int> st,sp;
bool che(int x) {
if(a[l[x]]^a[x]^a[r[x]]) return st.erase(x),0;
return st.insert(x),1;
}
bool che2(int x) {
if(!(a[l[x]]^a[x]^a[r[x]]) && ((a[l[l[x]]]^a[l[x]]^a[x]) || (a[x]^a[r[x]]^a[r[r[x]]]))) return sp.insert(x),1;
return sp.erase(x),0;
}
void del(int x) {
st.erase(x); sp.erase(x);
int s = l[x],o = r[x];
AIput(min(s,o)+1,' '); AIput(max(s,o)+1,'\n');
r[s] = o; l[o] = s;
che(s); che(o); che2(s); che2(o);
che2(l[s]); che2(r[o]);
}
int main() {
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
n = read();
for(int i = 0;i < n;i ++) a[i] = read()+1;
for(int i = 0;i < n;i ++) {
if(a[i] == a[(i+1)%n]) return printf("No\n"),0;
l[i] = (i+n-1)%n; r[i] = (i+1)%n;
}
for(int i = 0;i < n;i ++) che(i),che2(i);
if((st.size()&1) == (n&1) && !st.empty()) {
printf("Yes\n");
for(int i = 1;i <= n-3;i ++) {
int t = *st.begin();
while(!sp.empty() && !che2(*sp.begin()));
if(!sp.empty()) t = *sp.begin();
del(t); while(!st.empty() && !che(*st.begin()));
}
}
else printf("No");
return 0;
}
边栏推荐
- 拼多多败诉:“砍价免费拿”侵犯知情权但不构成欺诈,被判赔400元
- MySQL(十)
- 屏幕程序用串口无法调试情况
- POI导出Excel:设置字体、颜色、行高自适应、列宽自适应、锁住单元格、合并单元格...
- 大促过后,销量与流量兼具,是否真的高枕无忧?
- mobx 知识点集合案例(快速入门)
- How can I check the DOI number of a foreign document?
- Performance comparison between Ceres solver and g2o
- Haqi projection Black Horse posture, avec seulement six mois de forte pénétration du marché des projecteurs de 1000 yuans!
- 反射(二)
猜你喜欢
unity3d学习笔记
2022 Android interview essential knowledge points, a comprehensive summary
Can't you really do it when you are 35 years old?
Etcd database source code analysis -- starting from the start function of raftnode
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
企业如何进行数据治理?分享数据治理4个方面的经验总结
How to install swoole under window
Leetcode T1165: 日志分析
网络基础 —— 报头、封装和解包
Abnova 免疫组化服务解决方案
随机推荐
使用TCP/IP四层模型进行网络传输的基本流程
c语言(结构体)定义一个User结构体,含以下字段:
Google Chrome browser released patch 103.0.5060.114 to fix the 0-day vulnerability
项目实战 五 拟合直线 获得中线
港科大&MSRA新研究:关于图像到图像转换,Fine-tuning is all you need
leetcode 509. Fibonacci Number(斐波那契数字)
如何给目标机器人建模并仿真【数学/控制意义】
如何解决数据库插入数据显示SQLSTATE[HY000]: General error: 1364 Field ‘xxxxx‘ doesn‘t have a default value错误
C language interview to write a function to find the first public string in two strings
Install mongodb database
Apache ab 压力测试
微信小程序隐藏video标签的进度条组件
哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
Abnova 免疫组化服务解决方案
ANR 原理及实践
Postgresql中procedure支持事务语法(实例&分析)
Basic DOS commands
POI导出Excel:设置字体、颜色、行高自适应、列宽自适应、锁住单元格、合并单元格...
二十岁的我4面拿到字节跳动offer,至今不敢相信