HDU/杭电2013多校第三场解题报告
今天悲剧了,各种被虐啊,还是太年轻了
Crime
这道题目给的时间好长,第一次就想到了暴力,结果华丽丽的TLE了。
后来找了一下,发现前24个是1, 2, 6, 12, 72, 72, 864, 1728, 13824, 22032, 555264, 476928, 17625600, 29599488, 321115392, 805146624, 46097049600, 36481536000, 2754120268800, 3661604352000, 83905105305600, 192859121664000, 20092043520000000, 15074060547686400。这样我们就需要找到递推的式子。可是怎么也推不出。请路过的大神指教。。。
JZPTREE
Jinkeloid
The Unsolvable Problem
这道题目是过的最多的了题目了。就是that a + b = n and [a, b] is as large as possible. [a, b] denote the least common multiplier of a, b.这样的话就直接求就行了。是偶数的话变成前后值,否则前后判:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std; int main()
{
int t;
__int64 n;
cin>>t;
while(t--)
{
cin>>n;
if(n==2)
{
cout<<1<<endl;
continue;
}
if(n%2==1)
{
cout<<(n/2)*(n/2+1)<<endl;
}
else
{
if((n/2)%2==0)
{
cout<<(n/2-1)*(n/2+1)<<endl;
}
else
{
cout<<(n/2-2)*(n/2+2)<<endl;
}
}
}
return 0;
}
Pieces
Burning
一道几何题目,特判,精度...
Sad Love Story
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;
// 分治算法求最近点对 struct point
{
__int64 x , y;
} p[500005],pp[500005]; __int64 a[500005]; //保存筛选的坐标点的索引 __int64 cmpx(const point &a , const point &b)
{
return a.x < b.x;
}
__int64 cmpy(__int64 a , __int64 b) //这里用的是下标索引
{
return p[a].y < p[b].y;
}
inline __int64 dis(point &a , point &b)
{
return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
}
inline __int64 min(__int64 a , __int64 b)
{
return a < b ? a : b;
}
__int64 closest(__int64 low , __int64 high)
{
if(low + 1 == high)
return dis(p[low] , p[high]);
if(low + 2 == high)
return min(dis(p[low] , p[high]) , min( dis(p[low] , p[low+1]) , dis(p[low+1] , p[high]) ));
__int64 mid = (low + high)>>1;//求中点
__int64 ans = min( closest(low , mid) , closest(mid + 1 , high) ); //分治法进行递归求解
__int64 i , j , cnt = 0;
for(i = low ; i <= high ; ++i) //把x坐标在p[mid].x-ans~p[mid].x+ans范围内的点取出来
{
if(p[i].x >= p[mid].x - ans && p[i].x <= p[mid].x + ans)
a[cnt++] = i; //保存的是下标索引
}
sort(a,a + cnt,cmpy); //按y坐标进行升序排序
for(i = 0 ; i < cnt ; ++i)
{
for(j = i+1 ; j < cnt ; ++j)
{
if(p[a[j]].y - p[a[i]].y >= ans) //注意下标索引
break;
ans = min(ans , dis(p[a[i]] , p[a[j]]));
}
}
return ans;
}
int main()
{
__int64 t;
scanf("%I64d", &t);
__int64 n, ax, bx,cx,ay,by,cy;
__int64 ans = 0;
while(t--)
{
ans = 0;
scanf("%I64d", &n);
scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &ax,&bx,&cx,&ay,&by,&cy);
for(int i = 0; i < n; ++i)
{
if(i==0)
{
pp[i].x = (0*ax+bx)%cx;
pp[i].y = (0*ay+by)%cy;
}
else
{
pp[i].x = (pp[i-1].x*ax+bx)%cx;
pp[i].y = (pp[i-1].y*ay+by)%cy;
int tp = i;
for(int kp = 0; kp <= i; ++kp)
{
p[kp].x = pp[kp].x;
p[kp].y = pp[kp].y;
}
sort(p , p+tp+1 , cmpx);
ans += closest(0 , tp);
}
}
printf("%I64d\n", ans);
}
return 0;
}
KD-tree
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define D 2
#define N 500010
const int inf=1000000001;
const long long Inf=1ll*inf*inf;
struct kdnode
{
int x[D];
int split;
int l,r,p;
} kdtree[N],q[N];
bool operator==(const kdnode &a,const kdnode &b)
{
for(int i=0; i<D; i++)
{
if(a.x[i]!=b.x[i])return false;
}
return true;
}
double avg[D],var[D];
int n;
void calAvg(int l,int r)
{
for(int i=0; i<D; i++)avg[i]=0;
for(int i=l; i<=r; i++)
for(int j=0; j<D; j++)
avg[j]+=1.0*kdtree[i].x[j]/(r-l+1);
}
void calVar(int l,int r)
{
for(int i=0; i<D; i++)var[i]=0;
for(int i=l; i<=r; i++)
for(int j=0; j<D; j++)
var[j]+=1.0*(kdtree[i].x[j]-avg[j])/n*(kdtree[i].x[j]-avg[j]);
}
int splitD;
double maxVar;
bool cmp(kdnode a,kdnode b)
{
return a.x[splitD]<b.x[splitD];
}
int construct(int p,int l,int r)
{
if(r<l)return -1;
int root=(l+r)/2;
calAvg(l,r);
calVar(l,r);
maxVar=-1.0;
for(int i=0; i<D; i++)
if(var[i]>maxVar)
maxVar=var[i],splitD=i;
sort(kdtree+l,kdtree+r+1,cmp);
kdtree[root].split=splitD;
kdtree[root].l=construct(root,l,root-1);
kdtree[root].r=construct(root,root+1,r);
kdtree[root].p=p;
return root;
}
int Find(int root,kdnode x)
{
if(root==-1)return -1;
if(x==kdtree[root])
{
return root;
}
int d=kdtree[root].split;
if(x.x[d]>kdtree[root].x[d])
{
return Find(kdtree[root].r,x);
}
else if(x.x[d]<kdtree[root].x[d])
{
return Find(kdtree[root].l,x);
}
else
{
int l=Find(kdtree[root].l,x);
int r=Find(kdtree[root].r,x);
return (l==-1?r:l);
}
}
int FindMin(int root,int d)
{
int ret=root;
if(kdtree[root].l!=-1)
{
int v=FindMin(kdtree[root].l,d);
if(kdtree[ret].x[d]>kdtree[v].x[d])
ret=v;
}
if(kdtree[root].r!=-1)
{
int v=FindMin(kdtree[root].r,d);
if(kdtree[ret].x[d]>kdtree[v].x[d])
ret=v;
}
return ret;
}
int FindMax(int root,int d)
{
int ret=root;
if(kdtree[root].l!=-1)
{
int v=FindMax(kdtree[root].l,d);
if(kdtree[ret].x[d]<kdtree[v].x[d])
ret=v;
}
if(kdtree[root].r!=-1)
{
int v=FindMax(kdtree[root].r,d);
if(kdtree[ret].x[d]<kdtree[v].x[d])
ret=v;
}
return ret;
}
void DeleteNode(int v)
{
int p=kdtree[v].p;
kdtree[v].p=-1;
if(kdtree[p].l==v)
kdtree[p].l=-1;
else
kdtree[p].r=-1;
}
void Remove(int root,kdnode x)
{
int pos=Find(root,x);
if(kdtree[pos].l==-1&&kdtree[pos].r==-1)
{
DeleteNode(pos);
}
else if(kdtree[pos].l==-1)
{
int alt=FindMin(kdtree[pos].r,kdtree[pos].split);
for(int i=0; i<D; i++)kdtree[pos].x[i]=kdtree[alt].x[i];
Remove(alt,kdtree[alt]);
}
else
{
int alt=FindMax(kdtree[pos].l,kdtree[pos].split);
for(int i=0; i<D; i++)kdtree[pos].x[i]=kdtree[alt].x[i];
Remove(alt,kdtree[alt]);
}
}
void Insert(int root,int x)
{
int d=kdtree[root].split;
if(kdtree[root].x[d]<kdtree[x].x[d])
{
if(kdtree[root].r==-1)
{
kdtree[root].r=x;
kdtree[x].p=root;
}
else Insert(kdtree[root].r,x);
}
else
{
if(kdtree[root].l==-1)
{
kdtree[root].l=x;
kdtree[x].p=root;
}
else Insert(kdtree[root].l,x);
}
}
void Add(int root,kdnode x)
{
int pos=n;
kdtree[n++]=x;
Insert(root,pos);
} long long dist(kdnode a,kdnode b)
{
long long ret=0;
for(int i=0; i<D; i++)
{
ret+=1ll*(a.x[i]-b.x[i])*(a.x[i]-b.x[i]);
}
return ret;
}
long long query(int root,kdnode x)
{
if(root==-1)return Inf;
int d=kdtree[root].split;
long long ret;
if(x.x[d]<kdtree[root].x[d])
{
ret=query(kdtree[root].l,x);
double dd=1.0*x.x[d]+sqrt(1.0*ret);
if(dd>=1.0*kdtree[root].x[d])
{
ret=min(ret,query(kdtree[root].r,x));
}
}
else if(x.x[d]>kdtree[root].x[d])
{
ret=query(kdtree[root].r,x);
double dd=1.0*x.x[d]-sqrt(1.0*ret);
if(dd<=1.0*kdtree[root].x[d])
{
ret=min(ret,query(kdtree[root].l,x));
}
}
else
{
ret=query(kdtree[root].l,x);
ret=min(ret,query(kdtree[root].r,x));
}
ret=min(ret,dist(kdtree[root],x));
return ret;
} int main()
{
// freopen("in","w",stdout);
int t;
long long px,py;
long long ax,bx,cx,ay,by,cy;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
px=py=0;
scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&ax,&bx,&cx,&ay,&by,&cy);
px=(ax*px+bx)%cx;
py=(ay*py+by)%cy;
// puts("fdsf");
for(int i=0; i<1; i++)
{
kdtree[i].split=0;
kdtree[i].p=kdtree[i].l=kdtree[i].r=-1;
kdtree[i].x[0]=px;
kdtree[i].x[1]=py;
q[i]=kdtree[i];
// cout<<px<<" "<<py<<endl;
}
int root=construct(-1,0,0); px=(ax*px+bx)%cx;
py=(ay*py+by)%cy;
q[1].split=0;
q[1].p=q[1].l=q[1].r=-1;
q[1].x[0]=px;
q[1].x[1]=py;
// cout<<px<<" "<<py<<endl;
long long mindis=query(root,q[1]);
long long ans=mindis;
Add(root,q[1]);
// cout<<mindis<<endl;
// printf("%I64d\n",mindis);
int m=n;
for(int i=3; i<m; i++)
{
// printf("%d %d\n",i,n);
px=(ax*px+bx)%cx;
py=(ay*py+by)%cy;
q[i].split=0;
q[i].p=q[i].l=q[i].r=-1;
q[i].x[0]=px;
q[i].x[1]=py;
mindis=min(mindis,query(root,q[i]));
if(mindis==0LL)break;
ans+=mindis;
Add(root,q[i]);
}
printf("%I64d\n",ans);
}
return 0;
}
不淡定了....
HDU/杭电2013多校第三场解题报告的更多相关文章
- HDU 4639 hehe 杭电2013多校联赛第四场1008题
解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...
- 杭电2019多校第八场 Acesrc and Good Numbers——思维打表&&oeis
题意 给定 $d,x$,$f(d,k)$ 表示 $1 \sim k$ 中 $d$ 出现的次数, $k$ 满足 $f(d,k) = k$,求小于 $x$ 的最大的 $k$. 分析 正解不会...,学习了 ...
- 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)
今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】
pid=2066">http://acm.hdu.edu.cn/showproblem.php? pid=2066 Problem Description 尽管草儿是个路痴(就是在杭电 ...
- 『ACM C++』HDU杭电OJ | 1418 - 抱歉 (拓扑学:多面体欧拉定理引申)
呕,大一下学期的第一周结束啦,一周过的挺快也挺多出乎意料的事情的~ 随之而来各种各样的任务也来了,嘛毕竟是大学嘛,有点上进心的人多多少少都会接到不少任务的,忙也正常啦~端正心态 开心面对就好啦~ 今天 ...
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
随机推荐
- 解析Android开发优化之:从代码角度进行优化的技巧
下面我们就从几个方面来了解Android开发过程中的代码优化,需要的朋友参考下 通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说 ...
- iOS开发:为xcode项目添加git仓储
现在apple官网下载Command Line Tools 对应mac版本和xcode版本,记录地址:https://developer.apple.com/downloads/ 找到mac的终端,c ...
- usaco /the first wave
bzoj1572:贪心.先按时间顺序排序,然后用优先队列,如果时间不矛盾直接插入,否则判断队列中w最小的元素是否替换掉.(没用llWA了一次 #include<cstdio> #inclu ...
- python - pip 从已有的安装列表 安装
已经安装好的机器:sudo pip freeze > install_list.list 需要安装的机器:sudo pip install -r install_list.list
- WPF如何在同一个区域依次叠加显示多张图片呢?
正如标题的问题,有时需要在已显示的图片的右上角(或其他区域)显示小图标,譬如下图的患者头像右上角显示病情图标:(这里不采用事先用PS编排成一个图片文件的方式,因为此方式普适性不好) 解决方案:绘制该复 ...
- 抽屉显示控件SlidingDrawer入门
SlidingDrawer是一个抽屉控件,代码具体路径为:android.widget.SlidingDrawer,该控件从API Level3引入,在API 17及之后的版本将不再被支持.具体效果 ...
- linux命令——磁盘管理pwd
Linux中用 pwd 命令来查看”当前工作目录“的完整路径(绝对路径). 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的 ...
- 《Python 学习手册4th》 第八章 列表与字典
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- VmWare下安装Linux Centos6.0详细过程
http://www.linuxidc.com/Linux/2012-12/76583.htm和http://mirrors.163.com/centos/6.5/isos/i386/这是有关VmWa ...
- login:用户登陆的意思
login:用户登陆的意思 在思科的设备上有两种登录方式: 一种是本地方式,使用console口: 一种是远程方式(或者叫做网络方式):使用的是telnet等 1.默认情况下,思科的远程访问是禁止的. ...