比赛传送门:Contest Problem List (hdu.edu.cn)
1003 VC Is All You Need
题目大意:
解题思路:结论题,结论:m=n+1
证明:1)证明m=n+1可行,2)证明m>=n+2不可行(蒟蒻不懂,请大佬自行证明,猜了三发过的QAQ
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
long long n,m;
cin>>n>>m;
if(n-1<=m){
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
return 0;
}
1006Cute Tree
题目大意:按照给出的伪代码进行模拟,求出所构造的树有多少个节点。
伪代码:
思路:直接把伪代码翻译成C++,输出tot即可,有几个地方需要进行微小的改动,1)开头处注意处理l>r的情况,不然会陷入死循环 2)多组测试记得每次初始化数组 3)三分那里是向上取整,写代码的时候记得先加2再除三取整。4)son数组得开三倍,不然会越界(QAQ。
代码:
#include "bits/stdc++.h"
using namespace std;
const int N=1e9+10;
int a[200005];
int son[200005*3][3];
int tot;
int buildTree(int a[],int id,int l,int r){
if(r<l) return tot;
tot++;
id =tot;
if(r==l){
id=a[l];
return tot;
}
if(r-l==1){
int mid=(r+l)/2;
buildTree(a, son[id][0], l, l);
buildTree(a, son[id][1],r,r);
}
else {
int b = l + (r - l+2) / 3 - 1;
int c = (b + r) / 2;
buildTree(a, son[id][0], l, b);
buildTree(a, son[id][1], b + 1, c);
buildTree(a, son[id][2], c + 1, r);
}
return tot;
}
int main(){
int t;cin>>t;
while(t--){
tot=0;
memset(a,0,sizeof (a));
memset(son,0,sizeof (son));
int n;cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
buildTree(a,a[1],1,n);
//system("pause");
cout<<tot<<endl;
}
}
1007)Banzhuan
这道题多少有点坎坷,刚开始题意不是很清楚,样例也只有1的情况,通过率奇低,噢,出题人改题面了啊,那没事了。
题目大意:有一个n×n×n的三维空间,我们需要给各个位置放砖块(不然为什么叫搬砖呢),此外,砖块满足重力定律,当砖块下面没有砖块的时候,它会掉下去直到下面有了砖块,使得它整体从正面上面左面看上去都是一个n×n的平面,每个位置放砖块所需要的代价为x*y^2*z,多组测试,每组测试给出一个n,求放置所需的最大与最小代价。
解题思路:先考虑最大的情况,最大一定是都放满,除此之外,由于砖块符合重力定律,我们可以把每个砖块都从最上面放下去,最大的情况即为放n次最高层的xny平面,根据公式,化简整理得到:MAXN=.
最小的可能有两种情况:第一种铺满三个面xoy,xoz,yoz同时原点那一列只需要铺一个即可,并不需要铺满,另一种为铺满xoy平面,且铺满xoy对角线上(计算比较可以得到前一种更小)。那么分为三部分进行计算xoy平面:z=1,,化简整理得
a1=,yoz平面:x=1,注意,由于原点一列只需要铺一个,所以y和z的范围都是2到n公式:,整理得:a2=,xoz平面,同理,范围也是2到n,y=1公式:,化简整理得:
a3=,代入公式即可求得答案,注意除法需要使用逆元(某人因为这个还wa了一发,QAQ
完整代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll mod=1000000000+7;
ll qk(ll a,ll k,ll mod){//快速幂 算a的k次方
ll res=1;
while(k){
if(k&1/*判断是否为奇数 */) res=(ll)res*a%mod;
a=(ll)a*a%mod;
k>>=1/*实际上将K除以2*/;
}
return res;
}
int main(){
int T;
cin>>T;
while(T--){
ll n;
cin>>n;
// if(n==1){
// cout<<"1"<<endl<<"1"<<endl;
// continue;
// }
n%=mod;
ll maxn=(n%mod*n%mod*n%mod*n%mod)*(n+1)%mod*(n+1)%mod*(2*n+1)%mod*qk(12,mod-2,mod)%mod;
ll a=n%mod*n%mod*(n+1)%mod*(n+1)%mod*(2*n+1)%mod*qk(12,mod-2,mod)%mod;
ll b=(n-1)%mod*(n-1)%mod*(n+2)%mod*(n+2)%mod*qk(4,mod-2,mod)%mod;
ll c=(n-1)%mod*n%mod*(n+1)%mod*(n+2)%mod*(2*n+1)%mod*qk(12,mod-2,mod)%mod-(n+2)%mod*(n-1)%mod*qk(2,mod-2,mod)%mod;
// ll d=n%mod*n%mod*(n-1)%mod*(n+1)%mod*(n+1)%mod*(n+2)%mod/8;
cout<<(a+b+c)%mod<<endl<<maxn<<endl;
}
return 0;
}