20170722

来源:互联网 发布:重庆大数据行动计划 编辑:程序博客网 时间:2024/06/04 18:09


今天脑壳抽了 爆0

T1:

给出两个 N×N 的矩阵 A、B,矩阵每行每列标号 0~N-1 。
定义这两个矩阵的乘积 AB 为

    

现在要在这两个矩阵上依次进行 Q 次修改操作,两种操作描述如下:

  • A i j K ,将 Ai,j 的值修改为 K 。
  • B i j K ,将 Bi,j 的值修改为 K 。

在每一次修改操作进行后,输出矩阵 AB(这两个矩阵的乘积矩阵)中每个位置元素的权值之和。

输入




1 2 
3 4 
4 3 
2 1 

A 1 1 2 
B 0 1 3 
A 0 0 10

输出

40 
40 
103
对于 100% 的数据,1≤N≤1000,1≤Q≤105,|Aij|,|Bi,j|≤1000。
送命题 不知道为什么当时修改没全;
#include<bits/stdc++.h>using namespace std;int a[1005][1005],b[1005][1005],c[1005][1005];int sumb[1005],suma[1005];int n,m;int main(){//freopen("matrix.in","r",stdin);//freopen("matrix.out","w",stdout);ios::sync_with_stdio(false);cin.tie(NULL);cin>>n;for(int i=0;i<n;++i)for(int j=0;j<n;++j)cin>>a[i][j],suma[j]+=a[i][j];for(int i=0;i<n;++i)for(int j=0;j<n;++j)cin>>b[i][j],sumb[i]+=b[i][j];long long s=0;for(int i=0;i<n;++i)for(int j=0;j<n;++j) s=s+(long long)a[i][j]*sumb[j];cin>>m;char ch;int x,y,z;for(int i=1;i<=m;++i){cin>>ch;cin>>x>>y>>z;if(ch=='A'){s=s+(long long)(z-a[x][y])*sumb[y];suma[y]=suma[y]+z-a[x][y];a[x][y]=z;}if(ch=='B'){s=s+(long long)(z-b[x][y])*suma[x];sumb[x]=sumb[x]+z-b[x][y];b[x][y]=z;}cout<<s<<endl;}}
求和n²求 修改O(1) 总O(n²+m)
//ios::sync_with_stdio(false);cin.tie(NULL); 不想写读入优化可以用 比普通快一点,比优化慢
数据达到300000 用读入优化快得多
ios::sync_with_stdio(false);cin.tie(NULL); 只能用cin

T2:

有 N 个城市,这些城市通过 M 条无向边互相连通,每条边有一个权值 Ci ,表示这条边的长度为 2^(Ci) ,

没有两条边的长度是相同的。

设 d(i,j)为城市 i 到城市 j 的最短路长度,求:

    

答案以二进制输出。

输入



5 6 
1 3 5 
4 5 0 
2 1 3 
3 2 1 
4 3 4 
4 2 2

输出

1000100
因为边的权值为2ⁿ 而且没有两条边的长度是相同的,所以直接跑最小生成树,树上两点距离就是最短路
答案为∑最小生成树上每条边被走过的次数*2的权值次方
必须用类高精度,所以ans[i] 直接等于 权值为i的边贡献的次数 然后扫一次进位得答案
一条边贡献的次数=这条边两端连通快大小的乘积
#include<bits/stdc++.h>using namespace std;int first[100005],father[100005],size[100005];int f[200005],to[200005];int x,y,z,len,k,tot,n,m;bool vis[100005];long long ans[205005];struct node{int next,to,v;}e[200005];int find(int x){if(father[x]!=x) father[x]=find(father[x]);return father[x];}void inser(int x,int y,int z){tot++;e[tot].next=first[x];first[x]=tot;e[tot].to=y;e[tot].v=z;}void dfs(int x){vis[x]=true;for(int u=first[x];u;u=e[u].next){int to=e[u].to;if(!vis[to]){dfs(to);ans[e[u].v]+=(long long)size[to]*(n-size[to]);size[x]+=size[to];}}}int main(){//freopen("roads.in","r",stdin);//freopen("roads.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) father[i]=i,size[i]=1;for(int i=1;i<=m;++i){scanf("%d%d%d",&x,&y,&z);f[z]=x,to[z]=y;}for(int i=0;i<m;++i){int px=find(f[i]),py=find(to[i]);if(px!=py){k++;father[px]=py;inser(f[i],to[i],i);inser(to[i],f[i],i);}if(k==n-1) break;}dfs(1);for(int i=0;i<=m+1000;++i) ans[i+1]+=ans[i]/2,ans[i]%=2;for(int i=m+1000;i>=0;--i) if(ans[i]){len=i;break;}for(int i=len;i>=0;--i) cout<<ans[i];return 0;}


原创粉丝点击