2017 Multi-University Training Contest - Team 7
HDU6121 Build a tree
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121
题目意思:一棵 n 个点的完全 k 叉树,结点标号从 0 到 n - 1,求以每一棵子树的大小的异或和。
思路:一层一层的算,附上我的灵魂画作

我们来模拟计算一下上面这个非完全k叉树所有子树的大小异或之和。
对于第四层对于以该层节点为根的子树的大小为1,我们发现这一层总共有12个这样的子树,所以ans+=0;
对于第三层对于以该层节点为根的子树的大小为4,也就是说每个点我们需要在第四层里面为他分配三个子节点,一共可以分配出四个大小为3的子树,所以ans+=3;
对于第二层对于以该层节点为根的子树的小为13,也就是说每个点我们需要在第四层里面为他分配9个作为他的子节点,一共可以分配出1个这样的大小为13的子树,这样第四层还余下三个节点,我们继续构造我们形成一颗大小为7(4+3)的节点,所以对于第二层我们一共得到了一个大小为13的子树,1个大小为7的子树,一个大小为4的子树。
对于第一层我们同样可以利用这个方法计算出。
我们可以发现我们需要计算某一层的的贡献的时候,我们需要以下几个数据:
1.以该层的点为根的子树到底部这么多层的满树有多少个节点,该满树的最后一层有多少个节点。
2.以该层的点为根的子树到底部这么多层减去一层的满树有多少个节点。
这样我们就可以计算最后一层的点的数量对于每一层节点为根的不同子树的大小的和数量,就可以方便的计算了。
最后还要注意1叉树的情况,答案就是1^………………^n,这个网络上有公式和代码。这里抄了一份。
代码:
//Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=;
using namespace std;
typedef long long LL;
typedef int II;
LL n,k;
LL ta[],tal[],p;
LL ans=;
void init(){
ta[]=;
ta[]=;
tal[]=;
p=;
while(){
tal[p]=tal[p-]*k;
ta[p]=ta[p-]+tal[p];
if(ta[p]>=n) break;
p++;
}
tal[p]=n-ta[p-];
ta[p]=n;
}
LL xor_n(LL n){ LL t = n & ; if (t & ) return t / 2LL ^ ; return t / 2LL ^ n; }
void solve(){
for(LL lay=p-;lay>=;lay--){
LL num=n-ta[lay-];
LL a=ta[p-lay];
LL b=tal[p-lay+];
num-=tal[lay]*a;
LL c=num/b,d=num%b;
if(c%){
ans^=ta[p-lay+];
}
if(d!=){
ans^=(a+d);
}
LL e=tal[lay];
e-=c;
if(d!=) e--;
if(e%&&e>){
ans^=a;
}
}
}
int main() {
ios::sync_with_stdio(false);cin.tie();
II T;
cin>>T;
while(T--){
cin>>n>>k;
if(k==){ cout<<xor_n(n)<<endl;continue;}
k=min(k,n-);
init();
ans=;
if(tal[p]%) ans^=;
solve();
cout<<ans<<endl;
}
}
HDU6124 Euler theorem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6124
题目意思:给出一个a,对于任意的b,得到c=a%b,求c的种类。
数据结构:很明显0和a本身都是一个答案,很自然我们想到答案肯定还有1,2,3,4,5,…………(a-1)/2, 因为(a-1)/2是最后一个乘以2不超过a的值。所以公式(a-1)/2+2;
代码:
//Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=;
using namespace std;
typedef long long LL;
typedef int II;
int main() {
ios::sync_with_stdio(false);cin.tie();
II T;
cin>>T;
II a;
while(T--){
cin>>a;
cout<<(a-)/+<<endl;
}
return ;
}
HDU6125 Free from square
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6125
题目意思:1---n 选择不超过k个数,使得他们的乘积不包含完全平方因子
题目思路:分组背包+状态压缩(待补)
代码:
//Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=;
const long long mod=1e9+;
using namespace std;
typedef long long LL;
typedef int II;
II p[]={,,,,,,,};
II n,k;
LL dp[N][N];
II st[N],be[N];
vector<int>v[N];
void solve(){
mem(dp,);
dp[][]=;
for(II i=;i<=n;i++){
v[i].clear();be[i]=i;st[i]=;
} for(II i=;i<=n;i++)
for(II j=;j<;j++){
if(st[i]!=-&&i%p[j]==&&i%(p[j]*p[j])!=){
st[i]|=(<<j);be[i]/=p[j];
}
else if(i%(p[j]*p[j])==){//自己本身有平方因子不可选
st[i]=-;break;
}
} for(II i=;i<=n;i++){
if(st[i]!=-){
if(be[i]==) v[i].push_back(i);
else v[be[i]].push_back(i);
}
} for(II i=;i<=n;i++){
if(st[i]==-||v[i].size()==) continue; for(II j=k-;j>=;j--)
for(II kk=;kk<(<<);kk++)
for(II l=;l<v[i].size();l++){
II d=st[v[i][l]];
if((kk&d)==) dp[j+][kk|d]=(dp[j+][kk|d]+dp[j][kk])%mod;
}
}
LL ans=;
for(II i=;i<=k;i++){
for(II j=;j<(<<);j++)
ans=(ans+dp[i][j])%mod;
}
cout<<ans%mod<<endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
II T;
cin>>T;
while(T--){
cin>>n>>k;
solve();
}
return ;
}
HDU6127 Hard challenge
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6127
题目意思:平面坐标系,给出n个点,保证任意两点的连线不过原点. 每一个点都有一个权值,两点之间的线段的权值等于端点权值之积 ,问如果过原点做一条直线,直线穿过的线段的权值和最大是多少。
思路:极角排序(根据斜率),从小到大排序。没什么好讲了,以后多常来看看吧,极角排序这种思路第一次见到。具体见代码吧。
代码:
//Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 1e9+10;
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=+;
using namespace std;
typedef long long LL;
typedef int II;
double eps=-1e-;
struct P{
LL x,y,v;
double k;
bool operator <(const P& m)const{
return k<m.k;
}
}p[N];
II n;
LL sum=;
void solve(){
double k=p[].k;
LL s=,s2=;
for(II i=;i<n;i++){
if(p[i].x>=) s+=p[i].v;
if(p[i].x>) s2+=p[i].v;
}
LL ans=;
ans=max(ans,(sum-s)*s);
ans=max(ans,(sum-s2)*s2);
for(II i=;i<n;i++){
if(p[i].x>=) s-=p[i].v;
else s+=p[i].v;
ans=max(ans,(sum-s)*s);
}
cout<<ans<<endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
II T;
cin>>T;
II x,y,v;
while(T--){
cin>>n;
sum=;
for(II i=;i<n;i++){
cin>>p[i].x>>p[i].y>>p[i].v;
if(p[i].x==){
if(p[i].y<)p[i].k=-(1e9+);
else p[i].k=1e9+;
}
else p[i].k=1.0*p[i].y/p[i].x;
sum+=p[i].v;
} sort(p,p+n);
solve();
}
return ;
}
HDU6129 Just do it
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129
题目意思:设定b【i】=a【1】^a【2】^a【3】^..................a【i】;每进行一次,我们可以从a数组得到一个b数组。问进行m次的结果。
题目思路:我们可以手推几项,我们就会发现ans[i][j]进行i次变换,前j项前缀异或和的的答案,很明显ans[i][j]=ans[i-1][j]+ans[i][j-1],我们发现这是一个稍微倾斜了一点的杨辉三角,百度了一下得到了结论对于第m行的第i项杨慧三角的系数为C(m+i-2,i-1),如果他是奇数那么第一个数对于第i个数是有贡献的,第二个数对于第i+1个数是有贡献的。对于如何判断系数是不是奇数我们可以通过(x&y)==y来判断(对应C(x,y))。
代码:
#include<stdio.h>
#include<string.h>
int n,m;
int a[+];
int ans[+];
int main() {
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++){
int x=m+i-,y=i-;
if((x&y)==y){
for(int j=i;j<=n;j++) ans[j]^=a[j-i+];
}
}
for(int i=;i<=n;i++){
printf("%d%c",ans[i],(i==n)?'\n':' ');
}
}
return ;
}
HDU6130 Kolakoski
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6130
题目意思:一个打表题,自己百度一下这个奇怪的数列。然后根据定义打表就好了,不想多说什么,打表的时候可以使用双指针什么的。
代码:
//Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=1e7+;
using namespace std;
typedef long long LL;
typedef int II;
II ans[N];
int main() {
ios::sync_with_stdio(false);cin.tie();
ans[]=;
ans[]=;
ans[]=;
II l=,ct=;
while(ct<N-){
II a=ans[l++],b;
if(ans[ct-]==) b=;
else b=;
while(a--){
ans[ct++]=b;
}
}
II n;
II T;
cin>>T;
while(T--){
cin>>n;
cout<<ans[n]<<endl;
}
return ;
}
代码:
2017 Multi-University Training Contest - Team 7的更多相关文章
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1001&&HDU 6033 Add More Zero【签到题,数学,水】
Add More Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- Spring学习10-SpringMVC原理及核心组件1
一.SpringMVC原理 请求到来时,第一个接受这个请求的前端控制器叫DispatcherServlet(这个需要在web.xml中配置), 后端控制器叫Controller.负责处理请求U ...
- yii2 ContentDecorator 和 block 挂件
在做网站的过程中,大部分的页面结构都是相似的.如都有相同的头部和底部.各个页面这样仅仅是中间的部分不同. Yii中的布局文件就是用来实现这样的功能.如: 布局文件:@app/views/layouts ...
- 认识rem
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- weblogic管理服务器密码相关
安全控制weblogic,我们可以为weblogic Administrator服务器设置密码 1.administrator服务器或受管服务器启动时,需要认证,方法有三种: (1)command启动 ...
- Bootstrap学习笔记(5)--实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单
实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单 微笑的鱼 2014-01-03 Bootstrap 5,281 次围观 11条评论 使用Bootstrap导航条组件时,如果你的导航条带有下拉 ...
- Mybatis批量更新<转>
Mybatis批量更新 批量操作就不进行赘述了.减少服务器与数据库之间的交互.网上有很多关于批量插入还有批量删除的帖子.但是批量更新却没有详细的解决方案. 实现目标 这里主要讲的是1张table中.根 ...
- Redis 响应延迟问题排查
计算延迟时间 如果你正在经历响应延迟问题,你或许能够根据应用程序的具体情况算出它的延迟响应时间,或者你的延迟问题非常明显,宏观看来,一目了然.不管怎样吧,用redis-cli可以算出一台Redis 服 ...
- node.js在2018年能继续火起来吗?我们来看看node.js的待遇情况
你知道node.js是怎么火起来的吗?你知道node.js现在的平均工资是多少吗?你知道node.js在2018年还能继续火吗?都不知道?那就来看文章吧,多学点node.js,说不定以后的你工资就会高 ...
- 第二百六十五节,xss脚本攻击介绍
xss脚本攻击介绍 Cross-Site Scripting(XSS)是一类出现在 web 应用程序上的安全弱点,攻击者可以通过 XSS 插入一 些代码,使得访问页面的其他用户都可以看到,XSS 通常 ...
- EF报LINQ to Entities 不识别方法“Web_JZRepository.Models.copy_materials_details get_Item(Int32) ”,因此该方法无法转换为存储表达式。
说明用了如 List<T> list=new List<T>(); je.copy_materials_details.SingleOrDefault(x => x.ID ...