首页 技术 正文
技术 2022年11月17日
0 收藏 746 点赞 2,834 浏览 1909 个字

【题目】LibreOJ

【题意】n场游戏,有三种车ABC,给定长度为n的字符串,’a’表示不能选A,’b”c’同理,’x’表示不限,至多d个’x’。有m个限制(i,hi,j,hj)表示如果第i场选择车hi,那么第j场必须选择车hj。求可行方案,或无解。n<=10^5,d<=8。

【算法】2-sat

【题解】枚举’x’是’a’或’b’(如果直接枚举选那辆车复杂度太高,不如利用2-sat来做),这样有2^d种状态。

这样确定字符串后,每场比赛就只有两种选项和m种限制,进行2-sat即可,复杂度O(2^d*m)。(因为每次要初始化,常数还挺大的,UOJ很容易被卡TLE)

2-sat算法:连边后tarjan,如果一个点和对应点属于同一个SCC则无解,否则选择所属SCC编号较小的点。(dfs出栈序就是一种逆拓扑序)

实现细节:直接对每个点开3倍点,然后标记一个点不用,标记使用点为另外两个点。还有就是如果x和x’必须强制选x’的话,x向x’连有向边就可以了(不连对称边,这样虽然没有对称性,但是不影响)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int first[N],f[N],a[N],dfn[N],low[N],st[N],belong[N],dfsnum,TOT,tot,top,A[N],B[N],C[N],D[N],n,d,m;
int id[N],op[N];
char s[N];
struct edge{int v,from;}e[N*];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
void tarjan(int x){
dfn[x]=low[x]=++dfsnum;st[++top]=x;
for(int i=first[x];i;i=e[i].from)if(!dfn[e[i].v]){
tarjan(e[i].v);
low[x]=min(low[e[i].v],low[x]);
}else if(!belong[e[i].v])low[x]=min(dfn[e[i].v],low[x]);
if(dfn[x]==low[x]){
TOT++;
while(st[top]!=x)belong[st[top--]]=TOT;
belong[st[top--]]=TOT;
}
}
bool solve(int o){
memset(f,,sizeof(f));
memset(first,,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(belong,,sizeof(belong));//
tot=;top=;TOT=;dfsnum=;
for(int i=;i<n;i++){
if(s[i]=='x')a[i]=o&,o>>=;else a[i]=s[i]-'a';
f[a[i]*n+i]=;
id[i]=(a[i]+)%*n+i;op[id[i]]=(a[i]+)%*n+i;op[op[id[i]]]=id[i];
}
for(int i=;i<=m;i++){
int x=B[i]*n+A[i]-,y=D[i]*n+C[i]-;
if(f[x]||x==y)continue;
if(A[i]==C[i]||f[y])insert(x,op[x]);
else insert(x,y),insert(op[y],op[x]);
}
for(int i=;i<n*;i++)if(!f[i]&&!dfn[i])tarjan(i);
for(int i=;i<n;i++)if(belong[id[i]]==belong[op[id[i]]])return ;
return ;
}
char s1[],s2[];
int main(){
scanf("%d%d%s%d",&n,&d,s,&m);
for(int i=;i<=m;i++)scanf("%d%s%d%s",&A[i],s1,&C[i],s2),B[i]=s1[]-'A',D[i]=s2[]-'A';//
for(int i=;i<(<<d);i++)if(solve(i)){
for(int j=;j<n;j++)
if(belong[id[j]]<belong[op[id[j]]])putchar((a[j]+)%+'A');else putchar((a[j]+)%+'A');
return ;
}
puts("-1");
return ;
}//learn from hekai
下一篇: JSDom
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,500
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,914
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,747
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,504
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,142
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,306