sgu 128

论文啊,04年一个人的论文。

原来线段树还可以这么用。

贴代码。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=10005;

class BIT
{
public:
int a[MAX<<1];

void insert(int pos,int x)
{
while(pos<MAX*2)
{
a[pos]+=x;
pos+=pos&(-pos);
}
}

int query(int pos)
{
int ans=0;
while(pos)
{
ans+=a[pos];
pos-=pos&(-pos);
}
return ans;
}
};

struct point
{
int x,y;
};

BIT bit;
point p[MAX];
int n,s[MAX],pos[MAX],up[MAX],L[MAX];

int find(int x)
{
if(s[x]!=x) s[x]=find(s[x]);
return s[x];
}

void Union(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y) s[x]=y;
}

int cmpx(int a,int b)
{
if(p[a].x!=p[b].x) return p[a].x<p[b].x;
return p[a].y<p[b].y;
}

int cmpy(int a,int b)
{
if(p[a].y!=p[b].y) return p[a].y<p[b].y;
return p[a].x<p[b].x;
}

int deal()
{
int ans=0,i,j,k,t;
for(int i=0;i<n;i++)s[i]=i;
sort(pos,pos+n,cmpx);
for(i=0;i<n;i+=2)
{
j=pos[i];
k=pos[i+1];
if(p[j].x!=p[k].x) return 0;
ans+=p[k].y-p[j].y;
up[j]=k;
Union(j,k);
}
sort(pos,pos+n,cmpy);
for(i=0;i<n;i+=2)
{
j=pos[i];
k=pos[i+1];
if(p[j].y!=p[k].y) return 0;
ans+=p[k].x-p[j].x;
L[j]=1;
Union(j,k);
}
k=find(0);
for(i=1;i<=n-1;i++) if(find(i)!=k) return 0;
sort(pos,pos+n,cmpx);
for(int i=0;i<n;i++)
{
j=pos[i];
k=p[up[j]].y;
t=p[j].y;
if(up[j]&&bit.query(k+MAX)-bit.query(t+MAX+1)) return 0;
if(L[j]) bit.insert(t+MAX+1,1);
else bit.insert(t+MAX+1,-1);
}
return ans;
}

int main()
{
scanf("%d",&n);
int i;
for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y),pos[i]=i;
printf("%d\n",deal());
return 0;
}

sgu 128,布布扣,bubuko.com

时间: 2024-10-27 10:47:27

sgu 128的相关文章

SGU 128.Snake

时间限制:0.25s 空间限制:4m 题意: 在一个平面坐标中有N个点,现在要你用这N个点构造一个闭合图形,这个图形要满足以下条件: 1.这个图形要是闭合的:          2.图形上的点只能是给定的点,且每个点只能用一次:          3.每个顶点相连的两条边必须互相垂直:          4.每条边都要平行于坐标轴:          5.每条线除了顶点外都不能互相相交:          6.闭合图形的周长要最小: N-----点的个数          接下来N个点.    

SGU 438 The Glorious Karlutka River =) 拆点+动态流+最大流

The Glorious Karlutka River =) Time Limit:500MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice SGU 438 Appoint description: Description A group of Mtourists are walking along the Karlutka river. They want to cross

sgu Kalevich Strikes Back

这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含.. 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <algorithm> 5 #define maxn 120100 6 using namespace std; 7 8 long long s[maxn]; 9 vector<int>g[maxn]; 10 i

数学计数原理(P&#243;lya,高精度):SGU 294 He&#39;s Circles

He's Circles He wrote n letters "X" and "E" in a circle. He thought that there were 2n possibilities to do it, because each letter may be either "X" or "E". But Qc noticed that some different sequences of letters ca

sgu Ice-cream Tycoon

题意:供应商提供n块价格为c的冰淇淋,一个学生想买n块冰淇淋,手中的钱数总共有t元,为了不让买n块冰淇淋所花费的钱数不超过t元,先尽可能卖给这个学生便宜的冰淇淋. 如果这个学生不能买到所需要的冰淇淋则输出“UNHAPPY”,能则输出“HAPPY”. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 200000 5 using namespace std; 6 7

sgu 463 - Walking around Berhattan

K - Walking around Berhattan Time Limit:250MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice SGU 463 Description As you probably know, Berhattan is a district of Berland's largest city and it consists of equal squar

为什么8位符号数表示 -128~127

在这里不得说两样东西.数制和码制. 正数和负数的数制,码制的差异导致.导致了他们表达方式的不同. 但是,这样做是为了达到在二进制之间的运算直接实现正负数的直接的运算. 原码,反码,补码.之间的规则我就不用说了,我想大家都知道. 下面来说一下在补码的表达形式中,各位的意义: -2N-1  2N-2 ~~~ 23 22 21 20 最高位为符号位取的是负数,之后的其他位为正数 现在我们来举一个例子,来验证这个补码的规则: (-5)原码=[1000 0101]=-1(4+1)=-5 (-5)反码=[1

qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)

喵哈哈村的魔法源泉(2) 发布时间: 2017年5月9日 20:59   最后更新: 2017年5月9日 21:00   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村有一个魔法源泉,里面有无穷无尽的力量. 但是前提是你能答出这样一个问题: 给你a,b,p,让你输出a*b%p的值. 输入 本题包含若干组测试数据.第一行三个整数a,b,p. 满足:0<=a,b,p<=1e18 输出 输出答案 样例输入1 复制 10 1 7 样例输出1 3题目链接:http://qscoj.c

【SGU 390】Tickets (数位DP)

Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell tickets to the passengers. So no wonder that once upon a time in a faraway galaxy one conductor decided to diversify this occupation. Now this conductor