标签:
题意:根据给出的各个用户之间的亲密度,计算所有异性对的亲密度总和。
思路:大数据怕太大,所以用邻接表保存这个无向图,在输入时顺便统计亲密度总和。对于更改性别:统计一下该用户的异性朋友的亲密度总和,再总计一下该用户同性朋友的亲密度总和,两者作差,再更新一下总亲密度。对于更改亲密度:要考虑改为0的情况,就是两用户没有关系了,图中删除这条边,根据亲密度的增加或减少,总亲密度也要相应增加或减少。要查询时直接输出。这样应该能应对全是3的情况。个人想法!
1 #include <iostream> 2 #include <map> 3 #include <stack> 4 #include <deque> 5 #include <queue> 6 #include <vector> 7 #include <set> 8 #include <cstring> 9 #include <cstdio> 10 11 using namespace std; 12 const int N=100005; 13 bool sex[N]; 14 int n,m,q; 15 long long qmd; 16 struct node 17 { 18 int name; 19 int qmd; 20 }; 21 vector< vector<node> > lis; 22 23 void update(int hao) 24 { 25 long long tmp1=0; 26 long long tmp2=0; 27 for(int i=0; i<lis[hao].size(); i++) 28 { 29 if(sex[lis[hao][i].name]!=sex[hao] ) //现在性别不同,那么过去就是相同的。也就是没有计算的,要加上这部分 30 tmp1+=lis[hao][i].qmd; 31 else //要减去这部分 32 tmp2+=lis[hao][i].qmd; 33 } 34 qmd += tmp1-tmp2; 35 } 36 int main() 37 { 38 //freopen("input.txt", "r", stdin); 39 int t , tmp1, tmp2, tmp3, j=0; 40 cin>>t; 41 while(t--) 42 { 43 qmd=0; 44 cin>>n>>m>>q; 45 memset(sex,0,sizeof(sex)); 46 printf("Case #%d:\n",++j); 47 lis.resize(n); 48 for(int i=0; i<n; i++) //性别 49 { 50 cin>>tmp1; 51 sex[i]=tmp1; 52 } 53 54 for(int i=0; i<m; i++) //亲密度 55 { 56 cin>>tmp1>>tmp2>>tmp3;tmp1--;tmp2--; 57 58 node tmp; 59 tmp.name=tmp2; 60 tmp.qmd=tmp3; 61 62 lis[tmp1].push_back(tmp); 63 tmp.name=tmp1; 64 lis[tmp2].push_back(tmp); 65 66 if(sex[tmp1]!=sex[tmp2]) 67 qmd+=tmp3; 68 } 69 70 for(int i=0; i<q; i++) 71 { 72 cin>>tmp1; 73 if(tmp1==1) //改变性别 74 { 75 cin>>tmp2;tmp2--; 76 sex[tmp2]= sex[tmp2]==1? 0: 1; 77 update(tmp2); 78 } 79 else if(tmp1==2) //改变亲密度 80 { 81 cin>>tmp1>>tmp2>>tmp3; 82 tmp1--;tmp2--; 83 84 int temp=-1; 85 for(int i=0; i<lis[tmp1].size(); i++) //边是无向的,所以找两次 86 { 87 if(lis[tmp1][i].name==tmp2) 88 { 89 temp=lis[tmp1][i].qmd; 90 if(tmp3==0) 91 lis[tmp1].erase(lis[tmp1].begin()+i); 92 else 93 lis[tmp1][i].qmd=tmp3; 94 break; 95 } 96 } 97 for(int i=0; i<lis[tmp2].size(); i++) //边是无向的,所以找两次 98 { 99 if(lis[tmp2][i].name==tmp1) 100 { 101 if(tmp3==0) 102 lis[tmp2].erase(lis[tmp2].begin()+i); 103 else 104 lis[tmp2][i].qmd=tmp3; 105 break; 106 } 107 } 108 109 if(temp==-1) //要新添 110 { 111 node tmp; 112 tmp.name=tmp2; 113 tmp.qmd=tmp3; 114 lis[tmp1].push_back(tmp); 115 tmp.name=tmp1; 116 lis[tmp2].push_back(tmp); 117 if(sex[tmp1]!=sex[tmp2]) 118 qmd+=tmp3; 119 } 120 else if(sex[tmp1]!=sex[tmp2]) 121 qmd+=(tmp3-temp); 122 } 123 else //询问 124 cout<<qmd<<endl;; 125 } 126 } 127 128 return 0; 129 }
测试数据(第2个是官方数据):
输入:
2
3 2 4
0 1 0
1 2 1
1 3 1
3
2 1 2 0
2 1 3 0
3
3 2 8
0 1 0
1 2 1
1 3 1
3
1 1
1 2
3
2 2 3 2
3
1 2
3
输出:
Case #1:
1
0
Case #2:
1
2
2
3
标签:
原文地址:http://www.cnblogs.com/xcw0754/p/4458020.html