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

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

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

时间: 2024-10-08 19:35:12

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

编程之美2015初赛第二场AB

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中X为面值,为2.3.4.5.6.7.8.9.T.J.Q.K.A中的一个.Y为花色,为S.H.D.C中的一个.如2S.2H.TD等. 输入 第一行为一个整数T,为数据组数. 之后每组数据占一行.这一行首先包含一个

hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中X为面值,为2.3.4.5.6.7.8.9.T.J.Q.K.A中的一个.Y为花色,为S.H.D.C中的一个.如2S.2H.TD等. 输入 第一行为一个整数T,为数据组数. 之后每组数据占一行.这一行首先包含一个

编程之美2015初赛第一场 题解

[A题] 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, -, n.树中有n - 1条边,任意两个节点间恰好有一条路径.这是一棵彩色的树,每个节点恰好可以染一种颜色.初始时,所有节点的颜色都为0.现在需要实现两种操作: 1. 改变节点x的颜色为y: 2. 询问整棵树被划分成了多少棵颜色相同的子树.即每棵子树内的节点颜色都相同,而相邻子树的颜色不同. 输入 第一行一个整数T,表示数据组数,以下是T组数据. 每组数据第

hiho 编程之美2015初赛第一场(质数相关-2分图匹配)

两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二行为N个整数,表示集合内的数. 输出 对于每组数据输出一行,形如"Case #X: Y"

编程之美2015初赛第一场BC

题目2 : 建造金字塔 时间限制:4000ms 单点时限:2000ms 内存限制:256MB 描述 在二次元中,金字塔是一个底边在x轴上的等腰直角三角形. 你是二次元世界的一个建筑承包商.现在有N个建造订单,每个订单有一个收益w,即建造此金字塔可获得w的收益.对每个订单可以选择建造或不建造. 建造一个金字塔的成本是金字塔的面积,如果两个或多个金字塔有重叠面积,则建造这些金字塔时重叠部份仅需建造一次. 建造一组金字塔的总利润是收益总和扣除成本.现给出这些订单,请求出最大利润. 输入 输入数据第一行

hihocoder 编程之美2015初赛第一场 (树算法 + 暴力思想 + 搜索思想)

题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路径.这是一棵彩色的树,每个节点恰好可以染一种颜色.初始时,所有节点的颜色都为0.现在需要实现两种操作: 1. 改变节点x的颜色为y: 2. 询问整棵树被划分成了多少棵颜色相同的子树.即每棵子树内的节点颜色都相同,而相邻子树的颜色不同. 输入 第一行一个整数T,表示数据组数,以下是T组数据. 每组数据

编程之美2015初赛第一场: 彩色的树

题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路径.这是一棵彩色的树,每个节点恰好可以染一种颜色.初始时,所有节点的颜色都为0.现在需要实现两种操作: 1. 改变节点x的颜色为y: 2. 询问整棵树被划分成了多少棵颜色相同的子树.即每棵子树内的节点颜色都相同,而相邻子树的颜色不同. 输入 第一行一个整数T,表示数据组数,以下是T组数据. 每组数据

编程之美2015初赛_质数相关(二分图)

质数相关 题意:求二分图的最大独立集(独立集就是图中任意两个顶点都不相连的顶点集合) 思路:交替染色法,两种颜色把图染色.颜色最多的即为最大独立集. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map&

2月29日(编程之美2015资格赛)

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "February",