UVALive 4952
2013-11-26 16:19
309 查看
完全是看OpenLegend的代码,很神。
1.如果两个数字的从某一位开始的数字都一样,那么所走的路径就会一样,那么s0的开关在这一位必须不一样。
2.判断是否是同一类的,dfs一遍。
1.如果两个数字的从某一位开始的数字都一样,那么所走的路径就会一样,那么s0的开关在这一位必须不一样。
2.判断是否是同一类的,dfs一遍。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <algorithm> #define pb push_back #define mp make_pair #define fi first #define se second #define VI vector<int> #define pii pair<int,int> #define LL long long using namespace std; const int MAXN = (1<<17); const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; int p1[MAXN],p2[MAXN],ans[MAXN],vis[MAXN]; VI v3[MAXN]; void dfs(int u,int style){ if(vis[u] != -1) return; vis[u] = style; for(int i = 0; i < v3[u].size();i++) dfs(v3[u][i],1 - style); } void cal(const VI& vec,int n,int p[MAXN]){ vector<pii > vp; int len = 1<<(n-1); for(int i = 0 ; i < vec.size();i++){ int u = vec[i]; vp.pb(mp(p[u] % len,u)); } sort(vp.begin(),vp.end()); for(int i = 0; i + 1 < vp.size();i++){ if(vp[i].fi == vp[i+1].fi){ //后面的位相等,所以这一位必须不同 int t1 = vp[i].se,t2 = vp[i+1].se; v3[t1].pb(t2); v3[t2].pb(t1); } } } void solve(VI vec,int n,int val){ if(vec.size() == 0) return ;//说明这种情况不会存在了 if(n == 0){ ans[vec[0]] = val; return; } for(int i = 0; i < vec.size();i++){ v3[vec[i]].clear(); vis[vec[i]] = -1; } cal(vec,n,p1);//要同时满足两边 cal(vec,n,p2); VI v1,v2; for(int i = 0; i < (int)vec.size();i++){ int id = vec[i]; if(vis[id] == -1) dfs(id,0); if(vis[id] == 0) v1.pb(id); //当前位为0 else v2.pb(id); //当前位为1 } solve(v1,n - 1,val); solve(v2,n - 1,val|(1<<(n-1))); } int main() { int T;scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); VI vec; for(int i = 0;i < m;i++){ scanf("%d%d",&p1[i],&p2[i]); vec.pb(i); } solve(vec,n,0); for(int i = 0; i < m;i++){ if(i != 0) printf(" "); printf("%d",ans[i]); } printf("\n"); } return 0; }
相关文章推荐
- UVALive 7455 Linear Ecosystem (高斯消元)
- uvaLive 2387 - Gene Assembly 最大区间调度问题
- UVALive 6859
- 猜序列(uvalive 4255)
- UVALive 6187 Never Wait for Weights(并查集)
- UVALive -- 2664 One-way traffic(双连通求割边)
- UVALive 3641 Leonardo's Notebook(置换)
- UVALive 6508 Permutation Graphs
- UVALive-6929 Sums
- UVaLive 7370 Classy (排序,比较)
- UVALive 7374 Racing Gems (最长上升子序列--二分法)
- 例题1.4 Graveyard UVALive - 3708 数学思维题
- 【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate
- UVALive3027 并查集
- UVAlive 6623 Battle for Silver(暴力+思路)
- UVALive4513 Stammering Aliens(哈希法,后缀数组)
- UVALive 6625 Diagrams & Tableaux (状态压缩DP)
- POJ1040 HDU1456 UVA301 UVALive5516 Transportation题解
- UVAlive6439_Pasti Pas!
- UVALive 7148 LRIP【树分治+线段树】