首页 > 其他分享 >洛谷 P9139 [THUPC 2023 初赛] - 喵了个喵 II

洛谷 P9139 [THUPC 2023 初赛] - 喵了个喵 II

时间:2023-07-20 21:33:31浏览次数:38  
标签:洛谷 THUPC int MAXV mid 初赛 ++ MAXN low

考虑如果每个数恰好出现两次,那么容易得出一个序列合法当且仅当将每个数两次出现位置看作一个区间 \([l_i,r_i]\) 的两个端点,那么这些区间两两之间不存在包含关系。

考虑每个数出现四次的情况,我们钦定两次为 \(i\),两次为 \(i+n\),这样可以转化为 \(2n\) 的情况,而容易发现只有 \(1122\) 和 \(1212\) 两种情况,因为 \(1221\) 本身就出现包含关系了,而这容易让我们想到 2-SAT 的模型,区间不能包含又意味着有一些 \(p\to q\) 的关系,于是 2-SAT 做即可,限制关系可以看作一个矩形,使用主席树优化建图解决。

const int MAXN=2e5;
const int MAXV=1e7;
const int MAXE=5e7;
int n,a[MAXN+5];vector<int>pos[MAXN+5];
int hd[MAXV+5],to[MAXE+5],nxt[MAXE+5],ec;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int rev(int x){return (x>n)?(x-n):(x+n);} 
struct node{int ch[2],n1,n2;}s[MAXV+5];
int ncnt,rt[MAXN+5],ptcnt;
int modify(int k,int l,int r,int p,int pt1,int pt2){
	int z=++ncnt;s[z]=s[k];s[z].n1=++ptcnt;s[z].n2=++ptcnt;
	if(l==r){adde(s[z].n1,pt1);adde(pt2,s[z].n2);return z;}
	int mid=l+r>>1;
	if(p<=mid)s[z].ch[0]=modify(s[k].ch[0],l,mid,p,pt1,pt2);
	else s[z].ch[1]=modify(s[k].ch[1],mid+1,r,p,pt1,pt2);
	if(s[z].ch[0])adde(s[z].n1,s[s[z].ch[0]].n1),adde(s[s[z].ch[0]].n2,s[z].n2);
	if(s[z].ch[1])adde(s[z].n1,s[s[z].ch[1]].n1),adde(s[s[z].ch[1]].n2,s[z].n2);
	return z;
}
void connect(int k,int l,int r,int ql,int qr,int p1,int p2){
	if(ql>qr||!k)return;
	if(ql<=l&&r<=qr){adde(p1,s[k].n1);adde(s[k].n2,p2);return;}
	int mid=l+r>>1;
	if(qr<=mid)connect(s[k].ch[0],l,mid,ql,qr,p1,p2);
	else if(ql>mid)connect(s[k].ch[1],mid+1,r,ql,qr,p1,p2);
	else connect(s[k].ch[0],l,mid,ql,mid,p1,p2),connect(s[k].ch[1],mid+1,r,mid+1,qr,p1,p2);
}
int dfn[MAXV+5],low[MAXV+5],stk[MAXV+5],bel[MAXV+5],tp,cmp,tim,vis[MAXV+5];
vector<pii>vec[MAXN+5];
void tarjan(int x){
	dfn[x]=low[x]=++tim;stk[++tp]=x;vis[x]=1;
	for(int e=hd[x];e;e=nxt[e]){
		int y=to[e];
		if(!dfn[y])tarjan(y),chkmin(low[x],low[y]);
		else if(vis[y])chkmin(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		cmp++;int o;
		do{o=stk[tp--];vis[o]=0;bel[o]=cmp;}while(o^x);
	}
}
int res[MAXN+5];
int main(){
	scanf("%d",&n);ptcnt=2*n;
	for(int i=1;i<=n*4;i++)scanf("%d",&a[i]),pos[a[i]].pb(i);
	for(int i=1;i<=n;i++){
		vec[pos[i][0]].pb(mp(pos[i][1],i));
		vec[pos[i][2]].pb(mp(pos[i][3],i));
		vec[pos[i][0]].pb(mp(pos[i][2],i+n));
		vec[pos[i][1]].pb(mp(pos[i][3],i+n));
	}
	for(int i=1;i<=n*4;i++){
		rt[i]=rt[i-1];
		for(pii p:vec[i])rt[i]=modify(rt[i],1,n*4,p.fi,rev(p.se),p.se);
		for(pii p:vec[i])connect(rt[i-1],1,n*4,p.fi,n*4,p.se,rev(p.se));
	}
	for(int i=1;i<=ptcnt;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)if(bel[i]==bel[i+n])return puts("No"),0;
	for(int i=1;i<=n;i++){
		if(bel[i]<bel[i+n])res[pos[i][1]]=res[pos[i][3]]=1;
		else res[pos[i][2]]=res[pos[i][3]]=1;
	}
	puts("Yes");
	for(int i=1;i<=n*4;i++)printf("%d",res[i]);
	return 0;
}
/*
2
1 2 2 2 2 1 1 1
*/

标签:洛谷,THUPC,int,MAXV,mid,初赛,++,MAXN,low
From: https://www.cnblogs.com/tzcwk/p/luogu-P9139.html

相关文章

  • 再见,洛谷博客!——下载洛谷博客文章
    postedon2022-11-0610:58:17|under学术|source前置知识单组询问F12//copythecodeofblogsfetch('/api/blog/detail/'+BlogGlobals.blogID).then(res=>res.json()).then(res=>console.log(res.data.Content))多次询问下载markdown#fetcher.pyimpo......
  • 洛谷 P9020 - [USACO23JAN] Mana Collection P
    显然,每个法力池最终能收集到的法力只与这个法力池最终被收集到的时间有关。对于一组询问\((s,e)\),假设我们经过了\(k\)个法力池,我们钦定最终被收集到的时间从后到前分别是\(e=a_1,a_2,\cdots,a_k\),那么最大法力值为\(\sum\limits_{i=1}^kc_{a_i}·\sum\limits_{j=2}^i(s-dis......
  • 洛谷 P1122 最大子树和 题解
    一道入门的树形DP。首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序、单调、子问题等等性质),以便于后续的转化、推理和处理。有序化可以“转化和创造”性质首先将视角从无根树切换为有根树,这样我们就可以得到一个带有最优子结构、无后效性......
  • 洛谷 P2458 [SDOI2006] 保安站岗 - 树形DP
    P2458保安站岗思路:树形DP三个状态:dp[i][0]:节点i位置放保安的最小花费dp[i][1]:节点i位置不放保安,但被子节点的保安看守dp[i][2]:节点i位置不放保安,但被父节点的保安看守状态转移:dp[i][0]:节点i位置放保安,那么它可以合并子节点任何状态的最小值;dp[i][1]:节点i位......
  • 洛谷 P8923 -『MdOI R5』Many Minimizations
    怎么ARC还能撞题的?只能说Kubic牛逼。首先显然没法保序回归。考虑用类似于凸壳优化DP的做法解决原问题(也就是P4331):设\(dp_{i,j}\)表示考虑前\(i\)位,\(x_i=j\)的最小代价,显然有\(dp_{i,j}=\min_{k\lej}\{dp_{i-1,k}+|j-a_i|\}\)\(dp\)值显然是一个折线,用堆维护斜......
  • 洛谷-P9455 题解
    写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被Hack请和我说),一种正解二分。正文1最坏时间复杂度:\(\mathcal{O}(n+\logV)(V=10^9)\)这个做法是很简单的,在此不多讲。只需要二分超频电压mid即可,若当前mid可行,则令右边界缩小至mid,否则令左边界扩大至mid。......
  • 洛谷 Luogu P1038 [NOIP2003 提高组] 神经网络
    这题看着很吓人实则很简单。求输出层,正着求很麻烦,因为知不道谁连向这个点,所以可以反向建边,反着求。拓扑+dfs,时间复杂度\(\text{O(n+m)}\)#include<iostream>#include<cstdio>#include<queue>#defineN105#defineM(N*N/2+114)structE{intv,w;......
  • LOJ #6160. 「美团 CodeM 初赛 Round A」二分图染色 思考--zhengjun
    link思维+容斥计数。首先的转化比较妙,二分图转化为\(n\timesn\)的网格图染色。与网络流的转化方向相反,值得注意。然后发现两种颜色(红、蓝)如果独立染色,同一个格子可能会重复染色。考虑容斥,式子很好列,直接容斥即可。\[ans=\sum\limits_{i=0}^n(-1)^n\times\binom{n}{i......
  • 洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
    写在前面我又回来了!偷了几天懒,还认识我吗?甭管认识不认识,还是要自我介绍一番:本人是初学c++的初中生,还是个蒟蒻,最要命的是没有脑子。今天,还请允许我浪费您一点时间,叨叨上几句。本题目来自于洛谷,网址https://www.luogu.com.cn/problem/P1219,建议在洛谷上看一下。本题解非盈利,无恶......
  • 洛谷 P4931 [MtOI2018] 情侣?给我烧了!(加强版)
    洛谷传送门设\(f_i\)为\(i\)对情侣完全错位的方案数,那么答案为:\[\binom{n}{k}\frac{n!}{(n-k)!}2^kf_{n-k}\]分别代表选择\(k\)对情侣,选择它们的位置,情侣可以换位。\(f_i\)有递推公式:\[f_i=4i(i-1)(f_{i-1}+2(i-1)f_{i-2})\]考虑选出两个人,另外......