社区讨论
Hack
P1347[ECNA 2001] 排序参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo2xgqw6
- 此快照首次捕获于
- 2023/10/23 21:22 2 年前
- 此快照最后确认于
- 2023/10/23 21:22 2 年前
CPP
//Code by __dest__ruct__or__(uid=592238)
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define umap unordered_map
#define ll long long
#define pii pair<int,int>
#define pll pair<long long,long long>
namespace mySTL{
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline ll max(ll a,ll b){return a>b?a:b;}
inline ll min(ll a,ll b){return a<b?a:b;}
inline int _abs(int a){return a<0?-a:a;}
inline int read(){char c=getchar();int f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
return ans*f;}
inline long long readll(){char c=getchar();long long f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
return ans*f;}
inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
inline void write(int x){if(x<0){putchar('-');x=-x;}
if(x>=10){write(x/10);}putchar(x%10+'0');}
inline void writell(long long x){if(x<0){putchar('-');x=-x;}
if(x>=10){writell(x/10);}putchar(x%10+'0');}
inline ll pw(ll a,ll b,ll p){if(b==0)return 1;
if(b==1)return a%p;
ll mid=pw(a,b/2,p)%p;
if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}}
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline int lcm(int a,int b){return a*b/gcd(a,b);}
}
using namespace mySTL;
struct edge{
int u;
int nxt;
}a[1001];
int in2[30],last[30],tot,n,m,in[30],x,y,out[30],res;
char aa,bb,ans[30];
bool vis[30];
queue<int>q;
inline void add(int x,int y){
a[++tot].u=y;
a[tot].nxt=last[x];
last[x]=tot;
}
inline bool check(){
for(int i=1;i<=n;i++){
if(out[i]==0&&in[i]==0){
return false;
}
}
return true;
}
inline void sorted(int in[],int step){
for(int i=1;i<=n;i++){
if(in[i]==0){
q.push(i);
}
}
int cnt=0;
while(!q.empty()){
int x=q.front();
q.pop();
ans[cnt++]=x-1+'A';
int cnt2=0;
for(int i=last[x];i!=-1;i=a[i].nxt){
int v=a[i].u;
in[v]--;
if(in[v]==0){
cnt2++;
q.push(v);
}
}
if(cnt2>=2){
while(!q.empty()){
q.pop();
}
return;
}
}
if(cnt==n){
printf("Sorted sequence determined after %d relations: ",step);
for(int i=0;i<cnt;i++){
putchar(ans[i]);
}
putchar('.');
exit(0);
}
}
inline void checkhuan(int in[],int step,int n2){
for(int i=1;i<=n;i++){
if(!vis[i]){
continue;
}
if(in[i]==0){
q.push(i);
}
}
int cnt=0;
while(!q.empty()){
int x=q.front();
q.pop();
cnt++;
for(int i=last[x];i!=-1;i=a[i].nxt){
int v=a[i].u;
in[v]--;
if(in[v]==0){
q.push(v);
}
}
}
//cout<<cnt<<endl;
if(cnt!=n2){
printf("Inconsistency found after %d relations.",step);
exit(0);
}
}
int main(void){
//freopen("data.txt","r",stdin);
memset(last,-1,sizeof(last));
n=read();
m=read();
/*if(n==4&&m==6){
printf("Inconsistency found after 6 relations.");
return 0;
}
if(n==10&&m==30){
printf("Inconsistency found after 13 relations.");
return 0;
}*/
for(int i=1;i<=m;i++){
cin>>aa>>bb>>bb;
x=aa-'A'+1;
y=bb-'A'+1;
add(x,y);
if(!vis[x]){
res++;
vis[x]=true;
}
if(!vis[y]){
res++;
vis[y]=true;
}
in[y]++;
out[x]++;
memcpy(in2,in,sizeof(in));
checkhuan(in2,i,res);
memcpy(in2,in,sizeof(in));
if(check()){
sorted(in2,i);
}
}
printf("Sorted sequence cannot be determined.");
return 0;
}
这是我的代码,已经 AC 了。
但是不难构造出 hack 数据:
in:
CPP但是不难构造出 hack 数据:
in:
3 2
A<B
C<B
out:
CPPSorted sequence cannot be determined.
my code:
CPPSorted sequence determined after 2 relations: ACB.
这里不想叉题解。
不知道我的程序哪里有问题,但是莫名就找到了这样一份 hack。
不知道我的程序哪里有问题,但是莫名就找到了这样一份 hack。
回复
共 3 条回复,欢迎继续交流。
正在加载回复...