向未来的大家发送祝福(不接受的请自动忽略):
祝大家程序员节快乐!
好了。
ZJ一下
额。
考场上差点死了。
码1h后,T1还没过大样例。
我×××。
后来发现是自己××了。
T2T3丢暴力。
比咕的分多一点点。
Finally:
29
|
Miemeng | 100
03:09:04
|
25
03:09:04
|
25
03:09:05
|
150
03:09:05
|
Sol:
T1
不多说直接干即可
#include <iostream> #include <cstring> #include <cstdio> #define L 1111111 using namespace std; char st[L],ans[L<<4]; int len,cnt; bool ndp[L<<4]; inline void addin(const char ch){ans[cnt++]=ch;} int main(){ // freopen("expression.in" ,"r",stdin); freopen("expression.out","w",stdout); scanf("%s",st); len=strlen(st); cnt=0; for(int i=0;i<len;){ if(st[i]=='-'){ addin(st[i]); i++; addin(st[i]); i++; if(i>=len||st[i]=='+'||st[i]=='-')continue; addin('+'); while(i<len&&st[i]!='+'&&st[i]!='-'){ addin(st[i]); i++; } } else{ addin(st[i]); i++; } } // cout<<cnt<<endl; for(int i=0;i<cnt;i++){ if(ans[i]=='-'||ans[i]=='+'){ // cout<<i<<">"<<endl; int j=i+2; if(ans[i+1]=='0'){ while(j<cnt&&ans[j]=='0'){//SB // cout<<j<<endl; ndp[j]=1; j++; } if(ans[j]!='+'&&ans[j]!='-')ndp[j]=1; i=j-1; } } } // printf("%s ",ans); for(int i=0;i<cnt;i++) if(ndp[i]) putchar('+'); else putchar(' '); puts(""); for(int i=0;i<cnt;i++){ if(ndp[i]&&ans[i]!='+'&&ans[i]!='-')printf("+"); printf("%c",ans[i]); } puts(""); // printf("%s ",ans); }
T2
考场上啥都没想出来。
首先如果一条边在一个偶环里就一定无法贡献答案。
第二如果一条边在一个奇环里,可能贡献答案,但是如果在这条边被选后还有另外的奇环,那也无法贡献答案。
于是建一棵搜索树,利用一种类似差分前缀和的思想维护$u ightarrow fa$这条边所在的奇环偶环数。
(为什么有不快乐联通的图啊)
#include <iostream> #include <cstring> #include <cstdio> #define N 111111 #define M 222222 using namespace std; struct SR{ int f,t,next; }rs[2*M]; int fl[N],cnt=0; int pn,edn,ans, dep[N], odd[N], even[N], odcnt=0; bool is_v[N], is_st[N]; void add(int f,int t){ rs[cnt].f=f; rs[cnt].t=t; rs[cnt].next=fl[f]; fl[f]=cnt++; } void dfs(int k,int pred,int dn){ dep[k]=dn; for(int i=fl[k];i!=-1;i=rs[i].next){ if(i==(pred^1))continue; int t=rs[i].t; if(!dep[t])dfs(t,i,dn+1); if(dep[k]>dep[t]){ int lps=dep[k]-dep[t]+1; if(lps&1)odd[k]++ ,odd[t]--,odcnt++; else even[k]++,even[t]--; } } } void getsums(int k){ is_v[k]=1; for(int i=fl[k];i!=-1;i=rs[i].next){ int t=rs[i].t; if(!is_v[t]&&dep[t]==dep[k]+1){//cout<<k<<"->"<<t<<endl; getsums(t); odd[k] +=odd[t]; even[k]+=even[t]; } } } int main(void){ int a,b; //cin.sync_with_stdio(false); scanf("%d%d",&pn,&edn); memset(fl,-1,sizeof fl); for(int i=1;i<=edn;i++){ scanf("%d%d",&a,&b); add(a,b); add(b,a); } for(int i=1;i<=pn;i++){ if(!dep[i]){ is_st[i]=1; dfs(i,-1,1); } } // for(int i=1;i<=pn;i++){ cout<<i<<" "<<odd[i]<<" "<<even[i]<<endl; } for(int i=1;i<=pn;i++) if(is_st[i]) getsums(i); // cout<<odcnt<<endl; for(int i=1;i<=pn;i++){ if(is_st[i])continue; // cout<<i<<" "<<odd[i]<<" "<<even[i]<<endl; if(odd[i]==odcnt&&even[i]==0){ ans++; } } if(odcnt==1)ans++; printf("%d ",ans); }
T3
只gugu不说话
(雾