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. 集群中的session共享存储 实现会话保持

    每组web服务器端做一下调整: [root@web03 memcache-2.2.6]# egrep "(session.save_handler|session.save_path)&qu ...

  2. 【转】在MAC下配置MySQL 5.7 数据库的编码问题

    1.MySQL 5.7 for MAC 默认没有my.cnf文件 ,首先 新建my.cnf文件: 2.在my.cnf文件追加 1 2 3 4 5 6 7 8 [mysqld] character-se ...

  3. rpc 理解

    RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现. rpc是一种概念,http也是 ...

  4. springboot集成模板引擎freemarker和thymeleaf

    freemarkder和thymeleaf都是java的模板引擎,这里只介绍这两种模板引擎如何在sprongboot中配置: 1. freemarkder 1.1 在pom.xml中添加依赖包 < ...

  5. No output operations registered, so nothing to execute

    SparkStreaming和KafKa结合报错!报错之前代码如下: object KafkaWordCount{ val updateFunc = (iter:Iterator[(String,Se ...

  6. 绑定内网和安全redis和mongo以及MQ

    redis允许局域网访问其实很简单.网上一堆都不怎么靠谱. 特此记录一下. 可参考此篇 假设A B 两台机器 在B(ip:192.168.1.99)机器上修改redis配置文件 bind 192.16 ...

  7. C语言错误: CRT detected that the application wrote to memory after end of heap buffer

    CRT detected that the application wrote to memory after end of heap buffer 多是中间对其进行了一些操作,在程序结束处,释放内存 ...

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

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

  9. 第二百五十六节,Web框架

    Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 举例: #!/usr/bin/env python #c ...

  10. MySQL的外键约束:Cascade/Restrict/No action/SET NULL :级联操作

    转自:http://blog.csdn.net/cnjsnt_s/article/details/5548280 具体使用时需要参考:http://blog.csdn.net/codeforme/ar ...