暑假集训7月15
二分图染色(最近是被DFS折磨的一段颇有遗憾的时光)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10,M=2e5+10; int h[N],e[M],ne[M],idx; int color[N]; int n,m; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } bool dfs(int u,int c) { color[u]=c; for (int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if (!color[j]) { if (!dfs(j,3-c)) return false; } else if (color[j]==c) return false; } return true; } signed main() { memset(h,-1,sizeof h); cin>>n>>m; while (m--) { int a,b; cin>>a>>b; add(a,b); add(b,a); } bool flag=1; for (int i=1;i<=n;i+=) { if (!color[i]) { if (!dfs(i,1)) { flag=0; break; } } } if (flag)puts("Yes"); else puts("No"); return 0; }
K - Birthday Puzzle
#include <iostream> #include <algorithm> #include <cstring> #include <math.h> using namespace std; int a[25],n; long long int sum; void dfs(int u, long long int x) { sum += x; if(u >= n) return ; for(int i=u+1; i<=n; i++) { dfs(i, x|a[i]); } } int main() { cin>>n; for(int i =1; i <= n; i++) { cin>>a[i]; } dfs(0, 0); cout<<sum<<"\n"; return 0; }
I - Ultimate Army(栈)
大概就是,若出现5(3之类的表示5是3的直接上级,5(表示5是别人的上级,所以它要入栈,若出现))之类的表示有一层同级关系已经找完了,就不管这一层了,栈里出一个元素,然后找另一层。
大概就是,一层一层地看。
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1000000+66; int vis[maxn]; char ch[maxn]; stack<int>s; int main() { int n; scanf("%d",&n); scanf("%s",ch); int len=strlen(ch); int num=0; s.push(0); for(int i=0; i<len; i++) { if(ch[i]>='0'&&ch[i]<='9') { num=num*10+ch[i]-'0';//可能是多位数,计算它 } else { if(!num) { if(ch[i]==')') { s.pop();//当没有数时,而且此时为右括号,则出栈 } } else//有数时 { vis[num]=s.top();//取栈顶的 if(ch[i]=='(') { s.push(num);//若是左括号,则进栈 } } num=0; } } for(int i=1; i<=n; i++) { if(i!=n) { printf("%d ",vis[i]); }else { printf("%d\n",vis[i]); } } return 0; }

浙公网安备 33010602011771号