@darkproject
2018-03-07T15:48:10.000000Z
字数 1866
阅读 986
oj
Codeforces 938.C Constructing Tests
nxn的矩阵,只含有0和1两种元素,要求使每个mxm的矩阵(这个矩阵为nxn矩阵的子矩阵)至少含有一个0,求得最多的1的元素个数。此题并不要求输出最多的1的个数。而要求的是给1的个数,输出对应的n和m。
,x为元素1的个数。方程可以转化为利用筛法对x分解和,分别代表,细节问题看代码注释。
#include <bit/stdc++.h>int t;int main(){scanf("%d",&t);while(t--){int x; scanf("%d",&x);if(!x){printf("1 1\n"); continue;}bool suc=0;for(int i=1;i*i<x;++i) if(x%i==0){int t=x/i;if((t+i)%2) continue;//如果2*n不是偶数求得的n不是正确值。int n=(t+i)/2,m=(t-i)/2;if(n/(n/m)==m){//判断m是否正确suc=1; printf("%d %d\n",n,n/m); break;}}if(!suc) printf("-1\n");}}
Codeforces Round #465(Div2) C. Fifa and Fafa(计算几何+数论)
Fifa想要在公寓使用网络,公寓范围是一个以(x1,y1)为圆心,r为半径的圆,Fifa想要设置一个网络覆盖区域,这个区域也是一个圆。而要求覆盖范围不超出公寓外且不包括Fafa这个点(x2,y2),且使没覆盖的公寓范围最小。输出设置的网络区域的圆心和半径。
分三种情况讨论,一种Fafa在公寓范围外或上,一种与公寓圆心重合,另一种在公寓内。前2种比较好处理,最后一种看图解。

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;double r,x1,y1,x2,y2;int main(){cin>>r>>x1>>y1>>x2>>y2;double d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);double R=(sqrt(d)+r)/2;if(d>=r*r)printf("%.7f %.7f %.7f",x1,y1,r);else if(d==0)printf("%.7f %.7f %.7f",x1,y1+r/2,r/2);else{double dx=x1-x2;double dy=y1-y2;printf("%.7f %.7f %.7f",x2+dx*R/sqrt(d),y2+dy*R/sqrt(d),R);}return 0;}
bjtu1819 二哥的求和
给一个长度为n的数组,求出公式。给出q个查询,查询区间[l,r]的公式的值。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5+5;int t,q,n;long long mxr[maxn],hyx[maxn],a[maxn];//https://citel.bjtu.edu.cn/acm/oj/problem/1819//将图中式子拆分为a[i]*(i+1)-a[i];//维护前缀和得到正确答案int main(){int cnt=1;scanf("%d",&t);while(t--){scanf("%d",&n);for(long long i=1;i<=n;i++){scanf("%lld",&a[i]);mxr[i]=mxr[i-1]+a[i];hyx[i]=hyx[i-1]+a[i]*(i+1);}scanf("%d",&q);printf("Case %d: \n",cnt++);while(q--){long long l,r;scanf("%lld%lld",&l,&r);long long ans=(hyx[r]-hyx[l-1])-(mxr[r]-mxr[l-1])*l;printf("%lld\n",ans);}}return 0;}