和ad或2ad找ab和dc的交点即可 找到三角形第三个点,而另外两个点是a,d还是b,c 看这两条线哪个长就行.E CodeChef ANCESTOR Ancestors in Two Trees
——————————————————————————————————————————
F CodeChef CHEFPRAD Chef and Pairs
——————————————————————————————————————————
有两个序列A,B,在[−29,29]选择一个数使A数组的每一个元素减去这个数,然后根据abs(ai−bj)<=k建边,然后求最大二分匹配,问你这个最大二分匹配是多少,
首先考虑到应该通过一种什么样的方式枚举这些数,然后求这个二分匹配哦,但是光二分匹配的复杂度就已经O(VE)了, 所以这部分一定能优化
然后考虑到,这是一些序列,而建边的方式又是根据距离,所以这相当于在直线上的匹配,
然后发现对于数组a中的每个元素,如果要是匹配最大,左边的a一定尽量选左边的b, 对于b同理
那么我们可以枚举a和b数组,从左向右找,
那么分析如果当前abs(ai−bj)<=k,那么i++,j++,否则的话 就选这两个中靠右的留下,因为靠左的已经不能在和他匹配的了
所以这部分就可以用O(n+m)的复杂度处理.
然后想到如何枚举这些数
考虑 这个数的选取最好能使一个a[i]和b[j]匹配上,所以可以枚举a[i]-b[j]
注意的是这两个数能匹配上的点恰好是a[i]-b[j]-e 所以枚举这个就好了
复杂度为O(nm)
总复杂度O(Tnm(n+m))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| # include<stdio.h> # include<string.h> # include<algorithm> using namespace std; # define ll long long int ll a[1500]; ll b[1500]; ll dist[450][450]; ll temp[450]; int n,m; ll e; int Slove(ll x) { for(int i=1; i<=n; i++) temp[i]=a[i]-x; int ans = 0; for(int i=1,j=1;i<=n&&j<=m;){ if(abs(temp[i]-b[j])<=e) i++,j++,ans++; else if(temp[i]<b[j]) i++; else j++; } // printf("%lld %d\n",x,ans); return ans; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%lld",&n,&m,&e); for(int i=1; i<=n; i++)scanf("%lld",&a[i]); sort(a+1,a+1+n); for(int i=1; i<=m; i++)scanf("%lld",&b[i]); sort(b+1,b+1+m); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { dist[i][j]=(a[i]-b[j]); } } int ans=0; ans=max(Slove(0),ans); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { ans=max(Slove(dist[i][j]-e),ans); } } printf("%d\n",ans); } }
|
G CodeChef PLUSMUL Add or Multiply
——————————————————————————————————————————
给你一个序列,两个相邻的数之间可以放一个乘号或加号,问你所有可能下 放完符号的序列 运算完的结果总和是多少
首先考虑每个数的贡献,但是因为有乘法在,容易重复,于是变成求以每个数结尾的单项式对结果的贡献
于是设
f[i] 表示以第i个数结尾的单项的系数 即:f[i]∗a[i]∗2(n−i−1)为对结果的贡献
f[i]转移就是
f[1]=0f[2]=a[1]f[i]=f[i−1]∗a[i−1]+a[i−1]∗2i−3,i>=3
然后加上每个数作为加数的贡献,
算一下就好了 能发现除了首尾 都是×2n−3,减1是有n−1的符号,去掉两边的符号再减2
最后计算结果 看代码把
因为是从3开始算得 所以1和2的情况要特判
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| # include <bits/stdc++.h> typedef long long int LL; using namespace std;
const int N = 100000+7; const int MOD = 1e9+7;
LL a[N],f[N],q2[N];
LL qq2(int x){ return (x>=0)?q2[x]:1; }
int main(){ q2[0]=1; for(int i=1;i<N;i++) q2[i]=(q2[i-1]*2)%MOD; int _,n;scanf("%d",&_); while(_--){ scanf("%d",&n);
pre[0]=1;a[0]=1; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); if(n==1) { printf("%d\n",a[1]); continue; } if(n==2){ printf("%d\n",a[1]+a[2]+a[1]*a[2]); continue; } LL ans = 0;
f[1]=0,f[2]=a[1]; for(int i=3;i<=n;i++){ f[i]=f[i-1]*a[i-1]%MOD + a[i-1]*q2[i-3]%MOD; f[i]%=MOD; }
for(int i=1;i<=n;i++){ ans+=a[i]*q2[n-3]%MOD;ans%=MOD; ans+=a[i]*f[i]%MOD*qq2(n-i-1)%MOD;ans%=MOD; } ans += (a[1]+a[n])*q2[n-1-2]%MOD;ans%=MOD; printf("%lld\n",ans); } return 0; }
|
H CodeChef GQUERY Game Revisited
——————————————————————————————————————————
I CodeChef MEXDIV Mex division
——————————————————————————————————————————
J CodeChef ROBOTDAG Robots in a DAG
——————————————————————————————————————————
K CodeChef BLACKCOM Black Nodes in Subgraphs
——————————————————————————————————————————
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 tabris的博客! 赞助
wechat
alipay