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的更多相关文章

  1. 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) ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

  10. 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 ...

随机推荐

  1. UIScrollView 滚动视图—IOS开发

    转自:http://blog.csdn.net/iukey/article/details/7319314 UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 CGRect  ...

  2. docker容器跑tomcat遇到的坑

    使用docker容器跑tomcat,由于同一个宿主机上跑了多个容器,再加上宿主机本身跑了很多进程,导致系统总的进程数达到了8000+,而容器中tomcat的启动脚本中会调用自带的setenv.sh,在 ...

  3. yii2 beta版 执行流程

    yii2 beta版 执行流程 自动加载 1.composer的自动加载 //composer的加载实现了四种方式,可以看看 require(__DIR__ . '/../../vendor/auto ...

  4. 04、Quick Start for Windows

    创建一个新工程 1.在 VS 上,选择 File > New > Project.. 2.在新工程窗口,选择  Visual C# > Windows Store > Blan ...

  5. 禁止Chrome浏览器自动升级

    对于我们测试人员来说,浏览器自动升级是非常可怕的,浏览器的升级会导致出现各种bug,比如我们常用的Selenium,如果Chrome浏览器自动升级就会导致脚本出错,无法打开浏览器等等情况,对于这种情况 ...

  6. RP2836 OUT0-OUT7 对应关系

    ARM-IO9           OUT0        PA8 备用 P5-A4管脚,可以连接74HC164D级联 ARM-IO10         OUT7        PA1       3 ...

  7. js学习笔记22----BOM属性和方法

    BOM基本概念 : Browser Object Model 浏览器对象模型. BOM属性: window.navigator.userAgent : 浏览器信息 判断是否是某个浏览器,可以用 ind ...

  8. PHP Global定义全局变量使用说明

    Global是php中一个比较特殊的命令,大家直接叫他超级全局变量了,下面我来介绍我今天在使用Global定义全局学习笔记了   很不习惯PHP中的变量作用域,PHP中函数变量和全局是完全隔绝的,也就 ...

  9. Ubuntu 16.04 更换阿里云源

    Ubuntu 16.04 更换阿里云源sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份sudo gedit /etc/apt/so ...

  10. Unity UGUI 实现简单拖拽功能

    说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...