数三角形 bzoj 3505

要知道一个公式就是(a,b)和(x,y)两点所成线段上面的整点数是gcd(a-x,b-y)-1,通过枚举原点到map上任意一点所能成的三角形,再平移,得到要去掉的三点共线的点对。

我当时弱智地弄了个O(n^6)的枚举,不过好歹还是对的拿了三十分。

= =满分程序和30分程序几乎一样长。

program triangle;
var m,n,i,j:integer;
ans,t:qword; function gcd(a,b:integer):integer;
begin
if a= then exit(b);
if b= then exit(a);
if a mod b= then exit(b) else exit(gcd(b,a mod b));
end; begin{main}
readln(m,n);
t:=(m+)*(n+);
ans:=t*(t-)*(t-) div ;
for i:= to m do
for j:= to n do
if not ((i=) and (j=)) then
begin
if (i=) or (j=) then ans:=ans-(gcd(i,j)-)*(m-i+)*(n-j+)
else ans:=ans-*(gcd(i,j)-)*(m-i+)*(n-j+);
end;
writeln(ans);
end.

Triangle

机械排序臂 bzoj 3506

那天早上还是写的O(n^2)骗的30分,不过这回30和100的代码长度就差远了…
7/2开始写这题,7/2当天晚上学习&码完splay,是对的,但是之后的lazy tag,没什么资料,C++的程序又看不太懂,我调了这么多天简直崩溃了好吗!最后发现是左子树注入tag的时候不应该直接赋值true而应该赋反,这一点在switch里面想到了,但是在主程序里没想到。对着sort1.in这个n=1000的输入文件我愣了好久啊,为什么输出的前80%是对的但是之后就有的对有的不对了呢。一开始我以为是树的fa啊,lc、rc啊没消除干净,导致被删的结点又重新回来,后来发现这也不是回事…

不过还好找到了错误所在,现在整个人心情爆好!!

200行的程序,况且这还不是完全的splay…弱渣的我到时候要好好背一下…

program sort3;
var n,i,root,c,x,t,temp:longint;
f,ff,loc,l,fa,lc,rc,da,tot:array[..] of longint;
lazy:array[..] of boolean; function dd(x,xloc,y,yloc:longint):boolean;
begin
if x<y then exit(true);
if (x=y) and (xloc<yloc) then exit(true);
exit(false);
end; function gg(x,xloc,y,yloc:longint):boolean;
begin
if x>y then exit(true);
if (x=y) and (xloc>yloc) then exit(true);
exit(false);
end; procedure qsort(l,r:longint);
var mid,mid_loc,i,j,temp:longint;
begin
i:=l;j:=r;mid:=f[(l+r) div ];mid_loc:=loc[(l+r) div ];
while i<=j do
begin
while dd(f[i],loc[i],mid,mid_loc) do inc(i);
while gg(f[j],loc[j],mid,mid_loc) do dec(j);
if i<=j then
begin
temp:=f[i];f[i]:=f[j];f[j]:=temp;
temp:=loc[i];loc[i]:=loc[j];loc[j]:=temp;
inc(i);dec(j);
end;
end;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end; procedure lrot(p:longint);
var q:longint;
begin
q:=fa[p];fa[p]:=fa[q];
if q=root then root:=p else
if q=lc[fa[q]] then lc[fa[q]]:=p else rc[fa[q]]:=p;
lc[q]:=rc[p];
if rc[p]<> then fa[rc[p]]:=q;
rc[p]:=q;
fa[q]:=p;
tot[q]:=tot[lc[q]]+tot[rc[q]]+;
tot[p]:=tot[lc[p]]+tot[rc[p]]+;
end; procedure rrot(p:longint);
var q:longint;
begin
q:=fa[p];fa[p]:=fa[q];
if q=root then root:=p else
if lc[fa[q]]=q then lc[fa[q]]:=p else
rc[fa[q]]:=p;
rc[q]:=lc[p];
if lc[p]<> then fa[lc[p]]:=q;
lc[p]:=q;
fa[q]:=p;
tot[q]:=tot[lc[q]]+tot[rc[q]]+;
tot[p]:=tot[lc[p]]+tot[rc[p]]+;
end; procedure switch(p:longint);
var t:longint;
begin
if lazy[p]=false then exit;
t:=lc[p];lc[p]:=rc[p];rc[p]:=t;
lazy[p]:=false;
lazy[lc[p]]:=not lazy[lc[p]];
lazy[rc[p]]:=not lazy[rc[p]];
end; procedure clear(p:longint);
begin
if p=root then
begin
if lazy[p] then switch(p);
exit;
end;
clear(fa[p]);
if lazy[p] then switch(p);
end; procedure splay(p:longint);
var t,tt:longint;
begin
while p<>root do
begin
if p=lc[fa[p]] then //p is lc
begin
if fa[p]=root then lrot(p) else
if fa[p]=lc[fa[fa[p]]] then
begin
lrot(fa[p]);lrot(p);
end
else
begin
lrot(p);rrot(p);
end;
end
else
begin
if fa[p]=root then rrot(p) else
if fa[p]=rc[fa[fa[p]]] then
begin
rrot(fa[p]);rrot(p);
end
else
begin
rrot(p);lrot(p);
end;
end;
end;
fa[p]:=;
end; procedure insert(x:longint);
var t,tt:longint;
begin
inc(c);
fa[c]:=;lc[c]:=;rc[c]:=;da[c]:=f[x];
if root= then
begin
root:=c;
tot[root]:=;
end
else
begin
t:=root;
repeat
begin
tt:=t;
if loc[x]<loc[t] then
begin
inc(tot[t]);
t:=lc[t];
end
else
begin
inc(tot[t]);
t:=rc[t];
end;
end;
until t=;
tot[x]:=;
if loc[x]<loc[tt] then lc[tt]:=c else rc[tt]:=c;
fa[c]:=tt;
splay(c);
end;
end; begin
//assign(input,'sort10.in');reset(input);
//assign(output,'sort10.out');rewrite(output);
fillchar(lazy,sizeof(lazy),false);
readln(n);
for i:= to n do
begin
read(f[i]);
loc[i]:=i;
end;
ff:=f;
qsort(,n);
for i:= to n do
begin
f[i]:=i;
end;
for i:= to n do
insert(i); //buildtree
for i:= to n do
begin
clear(i);
splay(i);
write(tot[lc[i]]+i,' ');
lazy[lc[i]]:=not lazy[lc[i]]; //oh no I wrote':=true' and debuged for days..
t:=lc[i];
if lazy[t] then switch(t);
while rc[t]<> do
begin
t:=rc[t];
if lazy[t] then switch(t);
end;
fa[rc[i]]:=;fa[lc[i]]:=;root:=lc[i];temp:=rc[i];tot[i]:=;
if lc[i]= then root:=rc[i];
rc[i]:=;lc[i]:=;fa[i]:=;
if t<> then
begin
clear(t);//from down to top then top to down
splay(t);
fa[temp]:=t;rc[t]:=temp;tot[t]:=tot[t]+tot[rc[t]];
end
end;
//close(input);close(output);
end.

Sort

[CQOI 2014] 数三角形 & 机械排序臂的更多相关文章

  1. [ CQOI 2014 ] 数三角形

    \(\\\) Description 求 \(N\times M\) 的网格图上有多少个格点构成的三角形. 当三点共线的时候我们不认为这是一个三角形. \(n,m\le 10^4\) \(\\\) S ...

  2. BZOJ 3505 CQOI 2014 数三角形 数学

    标题效果:到m*n该网络格,问:有网络格是一个三角形的顶点的数目. 思维:数学.首先计算所有三个相同的,不.然后,在上线的一个点失去了三个点是其中.需要注意的是,答案开放long long. CODE ...

  3. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序

    Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她 ...

  4. 【BZOJ1914】数三角形(组合数,极角排序)

    [BZOJ1914]数三角形(组合数,极角排序) 题面 BZOJ权限题 良心洛谷 题解 这种姿势很吼啊,表示计算几何啥的一窍不通来着. 题目就是这样,正难则反,所以我们不考虑过原点的三角形, 反过来, ...

  5. 数三角形 bzoj 1201

    数三角形(1s 128MB)triangle [题目描述] 小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点.而整个三角形被连接两个不同边的等分点且 ...

  6. [Usaco2010 OPen]Triangle Counting 数三角形

    [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 394  Solved: 1 ...

  7. bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形 计算机和

    [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 526  Solved: 2 ...

  8. 【bzoj3505】[Cqoi2014]数三角形

    [bzoj3505][Cqoi2014]数三角形 2014年5月15日3,5230 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4×4的网格上的一个三角 ...

  9. BZOJ 3505: [Cqoi2014]数三角形 数学

    3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

随机推荐

  1. python的一些图像操作

    from PIL import ImageGrabim = ImageGrab.grab()im.save("f:\\T.jpg",'jpeg')   直接用pyCharm安装PI ...

  2. 利用ksoap调用webservice

    博文参考: http://www.cnblogs.com/shenliang123/archive/2012/07/05/2578586.html http://blog.csdn.net/jimbo ...

  3. 创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package com.chuoji; public class People { private String name; private int age; private String sex; ...

  4. ExtJs

    ExtJS是一种主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.      概念 1.ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用 ...

  5. JavaWeb学习总结_Servlet开发

    一. Servlet简介 二.Servlet的运行过程 Servlet程序是由Web服务器调用,web服务器收到客户端的Servlet访问请求后: WEB服务器首先检查是否已经装载并创建了该Servl ...

  6. 《BI那点儿事》数据仓库建模:星型模式、雪片模式

    数据仓库建模 — 星型模式Example of Star Schema 数据仓库建模 — 雪片模式Example of Snowflake Schema 节省存储空间 一定程度上的范式 星形 vs.雪 ...

  7. Gitblit Go

    1.Download the "Gitblit Go" package from the www.gitblit.com 2.UnZip the package 3.Open th ...

  8. 访问google.com

    ping www.google.com 得到的IP来访问

  9. 在caffe中使用hdf5的数据

    caffe默认使用的数据格式为lmdb文件格式,它提供了把图片转为lmdb文件格式的小程序,但是呢,我的数据为一维的数据,我也要分类啊,那我怎么办?肯定有办法可以转为lmdb文件格式的,我也看了一些源 ...

  10. Div的宽度与高度的100%设定

    div的100%是从其上一级div的宽高继承来的,所以必须设置其上一级div的宽度或高度,否则无效. 举例说明:父div(deman)宽300高200,子div(cc)如果在这个条件下设置divcc的 ...