bzoj 1202: [HNOI2005]狡猾的商人
阿新 • • 發佈:2018-05-20
nbsp 前綴和 div include span AS bre air i++
我居然用暴力跑過去了。。。
思路:兩個區間合成一個新的區間才會產生沖突, 我們用並查集維護前綴和, 0 - n 個節點分別表示sum[ 0 ] - sum[ n ],
d[ i ] 表示 前綴i 和它的父親的差值, 那麽對於兩個在同一個並查集裏的來說, 就表示這個區間的值已經知道啦, check一下
就好啦, 否則我們將不連通的兩團合並。
並查集
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se second 5 #define mk make_pair 6#define pii pair<int,int> 7 #define piii pair<int, pair<int,int>> 8 9 using namespace std; 10 11 const int N = 100 + 7; 12 const int M = 1e4 + 7; 13 const int inf = 0x3f3f3f3f; 14 const LL INF = 0x3f3f3f3f3f3f3f3f; 15 const int mod = 1e9 + 7; 16 17 int n, m, d[N], fa[N];18 19 int getRoot(int x) { 20 if(fa[x] == x) return x; 21 int t = getRoot(fa[x]); 22 d[x] += d[fa[x]]; 23 return fa[x] = t; 24 } 25 int main() { 26 int T; scanf("%d", &T); 27 while(T--) { 28 scanf("%d%d", &n, &m); 29 for(int i = 0; i <= n; i++)30 d[i] = 0, fa[i] = i; 31 bool flag = true; 32 for(int i = 1; i <= m; i++) { 33 int l, r, v; 34 scanf("%d%d%d", &l, &r, &v); l--; 35 int x = getRoot(l); 36 int y = getRoot(r); 37 if(x != y) { 38 fa[x] = y; 39 d[x] = d[r] - d[l] - v; 40 } else if(v != d[r] - d[l]) { 41 flag = false; 42 } 43 } 44 if(flag) puts("true"); 45 else puts("false"); 46 } 47 return 0; 48 } 49 /* 50 */
暴力:: 我感覺我memset -1 是有問題的 不知道咋就過了。。
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se second 5 #define mk make_pair 6 #define pii pair<int,int> 7 #define piii pair<int, pair<int,int>> 8 9 using namespace std; 10 11 const int N = 100 + 7; 12 const int M = 1e4 + 7; 13 const int inf = 0x3f3f3f3f; 14 const LL INF = 0x3f3f3f3f3f3f3f3f; 15 const int mod = 1e9 + 7; 16 17 int w, n, m, tot; 18 19 struct node { 20 pii a; int v; 21 }q[1000000]; 22 int mp[N][N]; 23 queue<node> que; 24 int main() { 25 scanf("%d", &w); 26 while(w--) { 27 memset(mp, -1, sizeof(mp)); 28 tot = 0; 29 while(!que.empty()) que.pop(); 30 31 scanf("%d%d", &n, &m); 32 for(int i = 0; i < m; i++) { 33 int l, r, v; 34 scanf("%d%d%d", &l, &r, &v); 35 que.push(node{mk(l, r), v}); 36 } 37 bool flag = true; 38 while(!que.empty()) { 39 node u = que.front(); que.pop(); 40 41 if(mp[u.a.fi][u.a.se] != -1) { 42 if(mp[u.a.fi][u.a.se] != u.v) { 43 flag = false; 44 break; 45 } else { 46 continue; 47 } 48 } 49 for(int i = 0; i < tot; i++) { 50 if(q[i].a.se + 1 == u.a.fi) { 51 que.push(node{mk(q[i].a.fi, u.a.se), q[i].v + u.v}); 52 } 53 54 if(u.a.se + 1 == q[i].a.fi) { 55 que.push(node{mk(u.a.fi, q[i].a.se), q[i].v + u.v}); 56 } 57 } 58 mp[u.a.fi][u.a.se] = u.v; 59 q[tot++] = u; 60 61 } 62 if(flag) puts("true"); 63 else puts("false"); 64 } 65 return 0; 66 } 67 /* 68 */
bzoj 1202: [HNOI2005]狡猾的商人