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 ...
随机推荐
- IOS 获取设备屏幕的尺寸
// 不包含状态栏 CGRect rect1 = [UIScreen mainScreen].applicationFrame; // 包含状态栏(整个屏幕) CGRect rect2 = [[UIS ...
- js 实现依赖注入的思想,后端框架思想搬到前端来
前述:咱们写一些页面的时候,很多需要用ajax来实现,显示又有很多表单提交的add或者update操作,太烦了,能不能有什么方法能够简单些呢? 说实话我都是被公司给逼的 应用场景: 前后端一一对应.表 ...
- background-origin:规定 background-position 属性相对于什么位置来定位
background-origin:border-box;此时设置background-size:contain; 根据容器的边框定位 例如:容器的盒模型如下:设置了padding:20px;bord ...
- 华为/中兴 3G 模块的调试
1 检查/etc/init.d/pppd『红颜色的使上电自动上网注册(如果没有红颜色的语句),请添加』 #!/bin/sh#DAEMON=/usr/sbin/pppdPIDFILE=/var/run/ ...
- WiFi(802.11)基础
参考: 1. Wireshark数据包分析实战(第2版) 2. wifi技术从了解到熟悉1----概念.802.11协议简述及四种主要物理组件.wifi适配层.wap_supplicant和wap_c ...
- Supervisor重新加载配置启动新的进程
一.添加好配置文件后 二.更新新的配置到supervisord supervisorctl update 三.重新启动配置中的所有程序 supervisorctl reload 四.启动某个进程(pr ...
- 网页抓取信息(php正則表達式、php操作excel)
1.问题描写叙述 实现对固定网页上自己须要的信息抓取,以表格形式存储. 我是拿wustoj上的一个排行榜来练习的,地址:wustoj 2.思路 网页自己就简单学习了一下php,刚好用它来做点事情吧,我 ...
- Maple重点知识总结
Maple中的evalf与evalhf evalf 可作用于单值 可作用于List 可作用于Set 可作用于Vector(<..>) 可作用于Matrix(<..|..|..> ...
- treegrid-dnd.js
(function($){ $.extend($.fn.treegrid.defaults, { onBeforeDrag: function(row){}, // return false to d ...
- 一条SQL语句查询两表中两个字段
首先描述问题,student表中有字段startID,endID.garde表中的ID需要对应student表中的startID或者student表中的endID才能查出grade表中的name字段, ...