0x08 总结与练习
1:前面已经搞好了。
2:poj2965 这种开关问题一个点要么点一次要么不点,枚举所有点的方案实行即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; char ss[];
int main()
{
int d=,tp=;
for(int i=;i<=;i++)
{
scanf("%s",ss+);
for(int j=;j<=;j++,tp++)
if(ss[j]=='+')d+=(<<tp);
}
int max_line=(<<)-,ans=,zt;
for(int i=;i<=max_line;i++)
{
int k=d,sum=;
for(int j=;j<=;j++)
{
if((i&(<<j))>)
{
sum++; int h=j/;
for(int _=;_<=;_++)k^=(<<(h*+_));
int l=j%;
for(int _=;_<=;_+=)k^=(<<(l+_)); k^=(<<(h*+l));
}
}
if(k==)
{
if(ans>sum)
ans=sum, zt=i;
}
}
printf("%d\n",ans);
int x=,y=;
for(int j=;j<=;j++)
{
if((zt&(<<j))>)printf("%d %d\n",x,y);
y++;if(y==)y=,x++;
}
return ;
}
poj2965
3、4、10:手残码农题真心不想做,准备NOIP的时候再做吧
5:poj 3714 平面最近点对问题,分治解决,对于当前已有的最小值确定mid上下左右一个四边形的范围,合并区间时就判定这个四边形范围里面的点即可,闻说这个点数是不会超过8个的。具体实行是在确定了横坐标范围后,把这些点取出,判定时将其按纵坐标排序,一个个求值,这个复杂度是n(logn)^2,假如用归并排序顺便把纵坐标排序会少一个log,但是实际上并没有快多少。至于kdtree。。以后再说
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct point{double x,y;int z;}a[],t[];
bool cmp(point p1,point p2){return p1.x<p2.x;} int tt[];
bool cmp2(int n1,int n2){return a[n1].y<a[n2].y;}
double getdis(int n1,int n2)
{
return sqrt( (double((a[n1].x-a[n2].x)*(a[n1].x-a[n2].x))) + (double((a[n1].y-a[n2].y)*(a[n1].y-a[n2].y))) );
}
double fenzi(int l,int r)
{
if(l==r)return (double(<<));
int mid=(l+r)/;
double mmin=min(fenzi(l,mid),fenzi(mid+,r)); int i=l,j=mid+,p=l;
while(i<=mid&&j<=r)
{
if(a[i].y<=a[j].y)t[p++]=a[i++];
else t[p++]=a[j++];
}
while(i<=mid)t[p++]=a[i++];
while(j<=r) t[p++]=a[j++];
for(int i=l;i<=r;i++)a[i]=t[i]; int len=;tt[++len]=mid;
for(int i=l;i<=r;i++)
if(( double(abs(a[i].x-a[mid].x)) )<mmin)tt[++len]=i; for(int i=;i<=len;i++)
for(int j=i+,clc=;j<=len&&clc<=;j++,clc++)
if(a[tt[i]].z!=a[tt[j]].z)
mmin=min(mmin,getdis(tt[i],tt[j]));
return mmin;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y), a[i].z=;
for(int i=n+;i<=n*;i++)
scanf("%lf%lf",&a[i].x,&a[i].y), a[i].z=;
sort(a+,a+*n+,cmp); printf("%.3lf\n",fenzi(,*n));
}
return ;
}
poj3714
6:bzoj1271 这道是好题啊!突破口一定是在只有一个是奇数这个条件里面的,那么就是奇偶性的不同,这个时候并没有想到前缀和。知道这个以后就二分答案,看看前缀和是奇数还是偶数就行了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; int n;
struct node
{
LL l,r,d;
}a[];
bool check(LL tp)
{
LL sum=;
for(int i=;i<=n;i++)
if(a[i].l<=tp)sum+=(min(a[i].r,tp)-a[i].l)/a[i].d+;
return (sum%==);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld%lld",&a[i].l,&a[i].r,&a[i].d); LL l=,r=,ans=-;
while(l<=r)
{
LL mid=(l+r)/,u;
if(check(mid)==true)
{
r=mid-;
ans=mid;
}
else l=mid+;
}
if(ans==-)printf("Poor QIN Teng:(\n");
else
{
LL c=;
for(int i=;i<=n;i++)
if(a[i].l<=ans&&ans<=a[i].r&&(ans-a[i].l)%a[i].d==)c++;
printf("%lld %lld\n",ans,c);
}
}
return ;
}
bzoj1271
7:poj3179 这题明显就得写个二维前缀和嘛。。相应的就离散化一下。二分答案,然后两个for一个枚举行一个枚举列的后界,前界尽量往前,这个while往前走就好。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int n,C;
struct node{int x,y;}a[];
int lsxlen,lsylen,lsx[],lsy[];
void LSH()
{
lsxlen=;
for(int i=;i<=n;i++)lsx[++lsxlen]=a[i].x;
sort(lsx+,lsx+lsxlen+);
lsxlen=unique(lsx+,lsx+lsxlen+)-lsx-;
for(int i=;i<=n;i++)
a[i].x=lower_bound(lsx+,lsx+lsxlen+,a[i].x)-lsx; lsylen=;
for(int i=;i<=n;i++)lsy[++lsylen]=a[i].y;
sort(lsy+,lsy+lsylen+);
lsylen=unique(lsy+,lsy+lsylen+)-lsy-;
for(int i=;i<=n;i++)
a[i].y=lower_bound(lsy+,lsy+lsylen+,a[i].y)-lsy;
}
int sum[][];
int getsum(int x,int y,int u,int v)
{
return sum[x][y]-sum[x][v-]-sum[u-][y]+sum[u-][v-];
}
bool check(int mid)
{
int rl=;
for(int rr=;rr<=lsxlen;rr++)
{
while(lsx[rr]-lsx[rl]>=mid)rl++;
int cl=;
for(int cr=;cr<=lsylen;cr++)
{
while(lsy[cr]-lsy[cl]>=mid)cl++;
if(getsum(rr,cr,rl,cl)>=C)return true;
}
}
return false;
}
int main()
{
scanf("%d%d",&C,&n);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
LSH(); memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)sum[a[i].x][a[i].y]++;
for(int i=;i<=lsxlen;i++)
for(int j=;j<=lsylen;j++)
sum[i][j]+=sum[i-][j]+sum[i][j-]-sum[i-][j-]; int l=,r=,ans;
while(l<=r)
{
int mid=(l+r)/;
if(check(mid)==true)
{
ans=mid;
r=mid-;
}
else l=mid+;
}
printf("%d\n",ans);
return ;
}
poj3179
8:bzoj1465 bzoj1045: [HAOI2008] 糖果传递&&bzoj3293: [Cqoi2011]分金币
9:明显x、y分开做,y就是中位数,x的话我一开始也是想要从中位数左右延伸,但是fail掉了。。正确的做法是设排完序以后,起点是a,那么我们就是要求的sum=Σabs(a-(x[i]-i))。a就是(x[i]-i)这东西的中位数。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; LL a[],b[];
LL myabs(LL x){return x<?-x:x;}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
sort(a+,a+n+);
sort(b+,b+n+);
for(int i=;i<=n;i++)a[i]-=i;
sort(a+,a+n+); LL sum=;
for(int i=;i<=n;i++)
sum+=myabs(a[i]-a[(n+)/]);
for(int i=;i<=n;i++)
sum+=myabs(b[i]-b[(n+)/]);
printf("%lld\n",sum);
return ;
}
poj1723
11:poj1050这题暴力二维前缀和n^4可A。。。。但是我还是正直的写个个n^3,f[i][j][k]表示现在枚举到第i行,列的区间是j~k的最大值,那么就相当于每一种列的情况都做一次O(n)的一维最大子串。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int a[][],f[][][];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]); int ans=-;
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
int sum=;
for(int k=j;k<=n;k++)
{
sum+=a[i][k];
f[i][j][k]=max(f[i-][j][k]+sum,sum);
ans=max(ans,f[i][j][k]);
}
}
}
printf("%d\n",ans);
return ;
}
poj1050
12:hdu4864 这题超级好题!!!!想了我超久,下午一个小时+晚上两个小时,看到那个价值的算法,肯定觉得会有问题对吧,我发现其实这个价值根本没用,因为价值的大小是按照耗时,耗时相等按照等级排的。思考的时候我类比一下贪心的第1题,那题是一个权,两个限制,现在是两个权,两个限制,不管怎样肯定是先排序,然后在此基础上卡另外一个限制贪心,我写的时候是让机器去找任务,这里就出问题了!不管按照什么排序,怎样的贪心法都会被反例掉,因为在这题里面,机器是为任务服务的,所以应该是任务去找机器,排序过后权值由大到小,一个个找完以后,x区间是单调延伸,前面的机器必然满足x比往后枚举的任务的x大,相当于问题只在于y,那么只需要贪心选择全部中尽量小的即可。再来分析一下正确性,当前任务占用机器,必然比后面的任务占用的机器要多,对于机器被占用,可以视作对答案的贡献均为1,所以可以心安理得的占用机器。对于机器而言,假如不影响当前任务影响后面,那一个替代他的机器一定比他还要优秀,它能影响了当前,肯定在先前也可以影响那个后一种情况中被前一个机器影响的任务。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std; struct node
{
int x,y;
}a[],b[];
bool cmp(node n1,node n2)
{
if(n1.x==n2.x)return n1.y>n2.y;
return n1.x>n2.x;
}
multiset<int>s;
multiset<int>::iterator o; int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
for(int i=;i<=m;i++)scanf("%d%d",&b[i].x,&b[i].y);
sort(a+,a+n+,cmp);sort(b+,b+m+,cmp); s.clear();
int ans=,tp=;long long val=;
for(int i=;i<=m;i++)
{
while(tp<=n&&a[tp].x>=b[i].x)s.insert(a[tp].y),tp++;
if(!s.empty())
{
if(*--s.end()>=b[i].y)
{
int k=*s.lower_bound(b[i].y);
int c=s.count(k);s.erase(k);
for(int j=;j<c;j++)s.insert(k); // for(o=s.begin();o!=s.end();o++)printf("%d\n",*o);
ans++;val+=b[i].x*+*b[i].y;
}
}
}
printf("%d %lld\n",ans,val);
}
return ;
}
hdu4864 (因为y的范围只有100所以可以暴力枚举,我没想就搞了个set,跑得还比暴力慢-_-!)
0x08 总结与练习的更多相关文章
- “0x00,0x08”两个十六进制字符串,转换为整形
int m_length=0;char buf[2]=={0x00,0x08};memcpy(&m_length,&buf[0],2); m_length=m_length<&l ...
- 0x08 MySQL 超详细-索引原理&慢查询优化【转-多图】(重点)
Content From——Egon's Blog http://www.cnblogs.com/linhaifeng/articles/7274563.html#top 0x01 介绍 为何要有索引 ...
- Docker 0x08: Docker 命令
目录 Docker 命令 run 与 start 区别 docker 进程相关命令 Restful API Docker 命令 docker命令容易混淆几个 run 与 start 区别 run: 会 ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- Summary of Critical and Exploitable iOS Vulnerabilities in 2016
Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...
- 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结
黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...
- Syscan360会议胸牌破解揭秘
Syscan360会议胸牌破解揭秘 背景 有幸参加今年11月份的上海Syscan360安全会议,会议期间有一个亮点就是360的独角兽团队设计了一款电子badge(胸牌)供参加人员进行破解尝试,类似于美 ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
随机推荐
- idea的环境变量设置(Enviroment variables)
- Android网络编程随想录(3)
大多数Android的app都会使用HTTP协议来发送和接收数据.在Android开发中,通常使用两种http客户端:一个是Apache的HttpClient,另一个是HttpURLConnectio ...
- lua中.和:的区别
local myTable = {} function myTable:putMyname(val) print(val) print(self and self.name) end myTable. ...
- js原生_获取url键值对
思路: 1.先对url进行处理,获取 ?后的字符串 postid=10457794&actiontip=保存修改成功') 2. 字符串通过&标识,不同参数转为数组 ["pos ...
- hdu 2444 The Accomodation of Students 判断是否构成二分图 + 最大匹配
此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足 ...
- In-Out Parameters inout keyword
You write an in-out parameter by placing the inout keyword right before a parameter’s type. An in-ou ...
- Angular之constructor和ngOnInit差异及适用场景(转)
原始地址:https://blog.csdn.net/u010730126/article/details/64486997 Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函 ...
- nginx的headers_more模块的使用
nginx的headers_more模块用于 添加.修改或清除 请求/响应头,该模块不是nginx自带的,默认不包含该模块,需要另外安装.幸运的是openresty默认包含了该模块,可以直接使用. 该 ...
- 【JavaScript框架封装】数据类型检测模块功能封装
数据类型检测封装后的最终模块代码如下: /*数据类型检验*/ xframe.extend(xframe, { // 鸭子类型(duck typing)如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭 ...
- JavaScript进阶【二】JavaScript 严格模式(use strict)的使用
/*** *使用严格模式的原因: * ①:消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; ②:消除代码运行的一些不安全之处,保证代码运行的安全: ③:提高编译器效率,增加运行 ...