热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

叉姐的魔法训练(第一课)----初级魔法练习

一集合操作POJ2443SetOperation有1000个集合每个集合有10000个元素,给出每个集合所有的元素和Q组询问,问元素x和y是否属于同一个集合。手抽写了个集合类出来,效率低了。其
一 集合操作

POJ 2443 Set Operation

有1000个集合每个集合有10000个元素,给出每个集合所有的元素和Q组询问,问元素x和y是否属于同一个集合。

手抽写了个集合类出来,效率低了。其实用元素开数组,压缩所属的集合效率更高。

#include 
#include
#include
#include
using namespace std;
const int maxn=1111;
typedef unsigned int uint;
const int Size=30;
class SetOperation{
private:
uint st[400];
int getIdx(int num){
return num/Size;
}
int getLft(int num){
return num%Size;
}
public:
SetOperation(){
init();
}
void init(){
memset(st,0,sizeof(st));
}
void addVal(int num){
st[getIdx(num)]|=(1< }
void delVal(int num){
st[getIdx(num)]&=~(1< }
void chgVal(int num){
st[getIdx(num)]^=(1< }
bool inSet(int num){
return st[getIdx(num)]&(1< }
}a[maxn];
int main()
{
int n,m;
while (~scanf("%d",&n)){
for (int i=1;i<=n;i++){
a[i].init();
scanf("%d",&m);
while (m--){
int num;
scanf("%d",&num);
a[i].addVal(num);
}
}
scanf("%d",&m);
while(m--){
int x,y;
bool flag=false;
scanf("%d%d",&x,&y);
for (int i=1;i<=n;i++){
if (a[i].inSet(x)&&a[i].inSet(y)){
flag=true;
break;
}
}
if (flag) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}

---------------------------------

二 公式推导

POJ 3244 Difference between Triplets


//数学好题
//定义两个三元组I(xi,yi,zi)和J(xj,yj,zj),(可以看做是空间中的点)
//他们的距离为D(I,J)=max{xi-xj,yi-yj,zi-zj}-min{xi-xj,yi-yj,zi-zj},
//给定n个三元组(n<=200000),求任意两个三元组的差的和
//抽化出来的模型是 max(a,b,c)-min(a,b,c),这个东西吧他放在数轴上 a,b,c
//我们要求最大和最小的差就是这三个点构成的线段的距离,那么我们这里再变通下 是不是端点到中间那个点的距离
//其实画出这个图的时候,就可以看到这个距离为(|a-b|+|b-c|+|c-a|)/2,这样我们并不需要关心中间的那个
//对应到题目中的原型,就是(|(xi-xj)-(yi-yj)|+|(yi-yj)-(zi-zj)|+|(zi-zj)-(xi-xj)|)/2;
//对应到同一个点上就是(|(xi-yi)-(xj-yj)|+|(yi-zi)-(yj-zj)|+|(zi-xi)-(zj-xj)|)/2;
//设a=(xi-yi),b=(yi-zi),c=(zi-xi),原问题等价为(|ai-aj|+|bi-bj|+|ci-cj|)/2;
//然后三个可以完全分开完全独立的计算,并不影响其他两元,这里要加个优化,就是按从小到大排序出来
//我们只需要算出每个位置上,他贡献了多少次加法,贡献了多少次减法即可
//举个例子,目前把a的部分排序了,对于第i个,他前面的比它小,所以在和i点比较时i点贡献了i次加,对后面的n-i个点
//向他们贡献了n-i次减法

#include 
#include
#include
#include
using namespace std;
const int maxn=411111;
typedef long long LL;
LL a[maxn],b[maxn],c[maxn];
int n;

int main()
{
while (~scanf("%d",&n)){
if (n==0) break;
for (int i=0;i int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[i]=x-y;
b[i]=y-z;
c[i]=z-x;
}
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
LL ans=0;
for (int i=0;i ans+=(a[i]+b[i]+c[i])*(2*i-n+1);
}
printf("%I64d\n",ans/2);
}
return 0;
}

---------------------------------

三 嵌套二分

POJ 3685 Matrix

打表后可以发现矩阵存在单调的性质。

F(i)=i^2+100000*i+j^2-100000*j+i*j 对i求导

F'(i)=2*i+100000+j>0 恒成立,所以每一列都是单调递增的。

要求出矩阵中第K大的数。

首先二分矩阵中的数X,判断它是不是比K个以上的数大。

然后枚举每一列,对于每一列,二分求出比X小的数的个数。

累加得到矩阵中比X小的数的个数sum。若sum>=K则X比K个以上的数大。

最后得到比矩阵中K个以上的数大的数中最小的数ans,则ans-1即为答案。

#include 
#include
#include
#include
using namespace std;
typedef __int64 LL;
const LL INFF=1LL<<50;
int n;
LL m;
LL f(LL i,LL j){
return i*i+100000*i+j*j-100000*j+i*j;
}
bool can(LL x){
int i;
LL sum,l,r,res,mid;
sum=0;
for (i=1;i<=n;i++){
l=1,r=n;
res=n+1;
while (l<=r){
mid=(l+r)>>1;
if (f(mid,i)>=x){
res=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
sum+=res-1;
}
return sum>=m;
}

int main()
{
int T;
LL l,r,ans,mid;
scanf("%d",&T);
while (T--){
scanf("%d%I64d",&n,&m);
l=-INFF,r=INFF;
ans=0;
while (l<=r){
mid=(l+r)>>1;
if (can(mid)){
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
printf("%I64d\n",ans-1);
}
return 0;
}


---------------------------------



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
幸福蜗牛yeshi牛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有