題面:51nod1967
辣雞出題人卡邊表差評。。。
卡常數卡啊卡交了35發才過QAQ
當然底下還有,反正佔了兩頁
本題的主題思路就是求一個歐拉回路,我們把有向圖暫時先看作無向圖
首先第一問其實就是度爲偶數點的個數
第二問我們把其他度爲奇數的點兩兩連起來,然後整張圖跑歐拉回路定向就好了啊
沒有卡常的能看的代碼(加了I/O優化):
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <ctime>
#include <map>
#include <queue>
#include <cstdlib>
#include <string>
#include <climits>
#include <set>
#include <vector>
using namespace std;
inline int read(){
int k=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
return k*f;
}
int n,m,f[600001],d[600001],K[600001];
int nedge=0,p[600001],c[1000001],nex[600001],head[600001],e[600001];
inline void addedge(int x,int y,int z,int zz){
p[++nedge]=y;c[nedge]=z;nex[nedge]=head[x];head[x]=nedge;e[nedge]=zz;
}
inline void dfs(int x){
for(int k=head[x];k;k=nex[k])if(f[c[k]]==-1){
f[c[k]]=e[k];dfs(p[k]);
}
}
int main()
{
n=read();m=read();
memset(f,-1,sizeof f);
for(int i=1;i<=m;++i){
int x,y;x=read();y=read();
addedge(x,y,i,0);addedge(y,x,i,1);
++d[x];++d[y];
}
int M=m;
for(int i=1;i<=n;++i)if(d[i]&1)K[++K[0]]=i;
for(int i=1;i<=K[0];i+=2){
m++;addedge(K[i],K[i+1],m,0);addedge(K[i+1],K[i],m,1);
}
printf("%d\n",n-K[0]);
for(int i=1;i<=n;++i)dfs(i);
for(int i=1;i<=M;++i)printf("%d",f[i]);
return 0;
}
然後愉快地TLE了
整個卡常過程分爲以下幾步:
1. 把所有i++改成了++i(然並卵
2. 聽了szb的建議把頭文件給刪了(這個時候我旁邊的zcydalao用vector輕鬆AC本題
3. 瘋狂地改數組大小+I/O優化
4. 然後總算找到一個合理的數組範圍卡過了。。。
卡常過的不能看的代碼:
#include <stdio.h>
using namespace std;
inline int read(){
int k=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
return k*f;
}
inline void write(int x){if(x>=10)write(x/10);putchar(x%10+'0');}
inline void writeln(int x){write(x);puts("");}
bool e[730001];char f[400001];
int n,m,d[100001],K[400001]={0},cnt=-1;
int nedge=0,p[730001],c[730001],nex[730001],head[730001];
inline void addedge(int x,int y,int z){
++cnt;p[++nedge]=y;c[nedge]=z;nex[nedge]=head[x];head[x]=nedge;e[nedge]=cnt&1;
}
inline void dfs(int x){
for(int k=head[x];k;k=nex[k])if(f[c[k]]==-1){
f[c[k]]=e[k];dfs(p[k]);
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=n+m;++i)f[i]=-1;
for(int i=1;i<=m;++i){
int x,y;x=read();y=read();
addedge(x,y,i);addedge(y,x,i);
++d[x];++d[y];
}
int M=m;
for(int i=1;i<=n;++i)if(d[i]&1)K[++K[0]]=i;
for(int i=1;i<=K[0];i+=2){
addedge(K[i],K[i+1],++m);addedge(K[i+1],K[i],m);
}
writeln(n-K[0]);
for(int i=1;i<=n;++i)dfs(i);
for(int i=1;i<=M;++i)write(f[i]);
return 0;
}
最慢一個點1156ms(卡過。。。),vector好像600ms就直接A掉了