码迷,mamicode.com
首页 > 其他好文 > 详细

编程之美2015初赛第二场 c题 八卦的小冰

时间:2015-04-26 18:02:37      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

 

题意:根据给出的各个用户之间的亲密度,计算所有异性对的亲密度总和。

思路:大数据怕太大,所以用邻接表保存这个无向图,在输入时顺便统计亲密度总和。对于更改性别:统计一下该用户的异性朋友的亲密度总和,再总计一下该用户同性朋友的亲密度总和,两者作差,再更新一下总亲密度。对于更改亲密度:要考虑改为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

 

编程之美2015初赛第二场 c题 八卦的小冰

标签:

原文地址:http://www.cnblogs.com/xcw0754/p/4458020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!