Regionals 2013 :: North America - Southeast USA

It Takes a Village

  As a Sociologist, you are studying a certain kingdom. This kingdom has a capitol city, several villages,
and roads between them all. Through your sociological studies, you have been able to determine that
there are three separate conditions under which one village will economically affect another village.
Village P will affect village Q if ANY of the following are true:
  1.If there are two completely different paths to get from village P to village Q, with no villages in
common (other than P and Q).
  2.If every path from Q to the capitol goes through P.
  3.If P affects village R and R affects Q.
  The kingdom is starting to build trading posts, to boost the economic health of its villages. When
it builds a trading post, it increases the overall revenue of the village it is placed in, and of all villages
which are affected by that village according to the above rules. Now, the king wants to know the effect
of his new trading posts, so he occasionally asks you to tell him the revenue of a certain village.
Given a sequence of the kings actions, both building trading posts and asking about a certain village,
answer his questions.

Input
There will be several test cases in the input. Each test case will begin with a line with two integers, n (2≤n≤100,000) and k (1≤k≤109), where n is the number of points, and k is the desired maximum distance. On each of the following n lines will be three integers x, y and z (-109≤x,y,z≤109) which are the (x,y,z) coordinates of one point. Within a test case, there will be no duplicate points. Since star systems are generally sparse, it is guaranteed that no more than 100,000 pairs of points will be within k of each other. The input will end with a line with two 0s.
Output
For each test case, output a single integer indicating the number of unique pairs of points that are less than k apart from each other. Output no spaces, and do not separate answers with blank lines.

SampleInput
3 2 4
1 2
3 1
+ 1 1
? 3
+ 2 3
? 3
2 2 4
1 2
2 1
+ 1 1
? 2
+ 2 3
? 1
0 0 0
SampleOutput
1
1
1
4

题目大意:给定一张无向图带环图,不包含自边和重边。定义,

<1>如果PQ两点间存在两条完全不重合路径;

<2>如果Pcapital的路径经过Q,则PQ的影响;

<3>PZ互相影响,ZQ互相影响,则PQ互相影响。

Capital 恒为点1.

多组输入,包括nmq。(n个点,m条边,q次操作)

1 < n < 1e5   ,   1< m < 1e5   , 1 < q < 2e5;

q表示两种操作的数量:

<1>   + K X  K点加权X

<2>   ?  K  查询K点的权和影响它的点的权的总和

1 <= k <= n,1 <= x <= 1000

在政神的指导下,这题应该是双连通分量+数据结构

根据给定的条件<1><2><3>,可以知道,相互影响的点一定是在同一个双连通分量里的,这样我们可以对原图缩点,缩完点之后图转化为一棵以capital为根的树,这时候利用树状数组维护DFS序列。所以,先 tarjan 缩点,然后从capital节点做一遍DFS,记录每个节点入栈和出栈的序列。用树状数组维护节点权值,遇到 + K X,就在点的入栈序列上 +X,在出栈序列+1 –X,查询操作返回节点入栈序列的前缀和。

由于点数是100,000,在原图是一条链的情况下,会RE爆栈,

#pragma comment(linker, "/STACK:102400000,102400000")这是一条C++的扩栈指令,师大的OJ不提供C++编译器,是无法扩栈的。需要用到传说中的汇编扩栈!

上代码:

const int main_stack = 16;

char my_stack[128 << 20];

    __asm__("movl %%esp, (%%eax);\n"::"a"(my_stack):"memory");

__asm__("movl %%eax, %%esp;\n"::"a"(my_stack + sizeof(my_stack) - main_stack):"%esp");

__asm__("movl (%%eax), %%esp;\n"::"a"(my_stack):"%esp");

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<cstdlib> using namespace std;
const int nMax = 2e5+;
struct Edge{
int u,v,nxt;
}edge[nMax<<],edge_v[nMax<<];
int g[nMax],g_v[nMax],nume,Nume;
int mark[nMax<<],s[nMax<<];
int cor[nMax],low[nMax],dfn[nMax],cnt,bcc;
int in_idx[nMax],out_idx[nMax];
int n,m;
stack<int> st;
inline int Low_bit(int x)
{
return x&-x;
}
void take_plus(int pos,int x)
{
while( pos < nMax )
s[pos]+=x,pos+=Low_bit(pos);
}
int take_sum(int pos)
{
int ret = ;
while( pos )
ret+=s[pos],pos-=Low_bit(pos);
return ret;
}
inline void addedge(int u,int v,int flag)
{
if( !flag ){
edge[++nume].u = u,edge[nume].v = v,edge[nume].nxt = g[u],g[u] = nume;
edge[++nume].u = v,edge[nume].v = u,edge[nume].nxt = g[v],g[v] = nume;
}
else{
edge_v[++Nume].u = u,edge_v[Nume].v = v,edge_v[Nume].nxt = g_v[u],g_v[u] = Nume;
edge_v[++Nume].u = v,edge_v[Nume].v = u,edge_v[Nume].nxt = g_v[v],g_v[v] = Nume;
}
}
void init()
{
memset(s,,sizeof(s));
memset(g,,sizeof(g));
memset(mark,,sizeof(mark));
nume = ;
for(int i = ;i <= m;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y,);
}
}
void tarjan_dfs(int cur)
{
low[cur] = dfn[cur] = ++cnt;
st.push(cur);
for(int i = g[cur];i;i = edge[i].nxt){
if( mark[i] || mark[i^] )
continue;
mark[i] = ;
int v = edge[i].v;
if( !dfn[v] ){
tarjan_dfs(v);
low[cur] = min(low[cur],low[v]);
}
else
low[cur] = min(low[cur],dfn[v]);
}
if( low[cur] == dfn[cur] ){
++bcc;
while( ){
int temp = st.top();
st.pop();
cor[temp] = bcc;
if( temp == cur )
break;
}
}
}
void tarjan()
{
while( !st.empty() )
st.pop();
cnt = bcc = ;
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(cor,,sizeof(cor));
for(int i = ;i <= n;i++)
if( !dfn[i] )
tarjan_dfs(i);
}
void tree_dfs(int cur,int fa)
{
in_idx[cur] = ++cnt;
mark[cur] = ;
for(int i = g_v[cur];i;i = edge_v[i].nxt){
int v = edge_v[i].v;
if( v != fa && !mark[v] )
tree_dfs(v,cur);
}
out_idx[cur] = ++cnt;
}
void build_tree()
{
memset(g_v,,sizeof(g_v));
Nume = ;
for(int i = ;i <= nume;i++){
int a = edge[i].u,b = edge[i].v;
if( cor[a] != cor[b] )
addedge(cor[a],cor[b],);
}
memset(mark,,sizeof(mark));
cnt = ;
tree_dfs(cor[],);
}
const int main_stack = ;
char my_stack[ << ];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
__asm__("movl %%esp, (%%eax);\n"::"a"(my_stack):"memory");
__asm__("movl %%eax, %%esp;\n"::"a"(my_stack + sizeof(my_stack) - main_stack):"%esp");
int q;
char type[];
int a,b;
while( scanf("%d%d%d",&n,&m,&q),n||m||q ){
init();
tarjan();
build_tree();
for(int i = ;i <= q;i++){
scanf("%s",type);
if( type[] == '+' ){
scanf("%d%d",&a,&b);
take_plus(in_idx[cor[a]],b);
take_plus(out_idx[cor[a]]+,-b);
}
else{
scanf("%d",&a);
int ans = take_sum(in_idx[cor[a]]);
printf("%d\n",ans);
}
}
}
__asm__("movl (%%eax), %%esp;\n"::"a"(my_stack):"%esp");
return ;
}

Regionals 2013 :: North America - Southeast USA的更多相关文章

  1. 2015 UESTC Winter Training #6【Regionals 2010 >> North America - Rocky Mountain】

    2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...

  2. [New Portal]Windows Azure Cloud Service (34) TechEd 2013 North America关于Azure的最新消息

    <Windows Azure Platform 系列文章目录> 话说TechEd 2013 US上个月3-6日在美国举办了,笔者的文章又有点姗姗来迟了. 需要了解相关视频的网友,请浏览ht ...

  3. 组队练习赛(Regionals 2012, North America - East Central NA)

    A.Babs' Box Boutique 给定n个盒子,每个盒子都有长宽高(任意两个盒子长宽高不完全相同),现在选盒子的任意两面,要求x1 <= x2 && y1 <= y ...

  4. Regionals 2012, North America - Greater NY 解题报告

    这套题..除了几何的都出了 完全没时间学几何.杯具 A,B,J 水题不解释 C.Pen Counts 这题的话 写几个不等式限制边得范围就行了 然后枚举最小边 D.Maximum Random Wal ...

  5. 130825组队赛-Regionals 2012, North America - East Central NA

    A.Babs' Box Boutique 一道简单的dfs搜索题,需要两两比较,然后搜到底,得到最大值就行了.比赛时队友写的,我只负责debug..赛后自己写的.. #include<iostr ...

  6. MPI Maelstrom(East Central North America 1996)(poj1502)

    MPI Maelstrom 总时间限制:  1000ms 内存限制:  65536kB 描述 BIT has recently taken delivery of their new supercom ...

  7. HNU 13064 Cuckoo for Hashing解题报告 North America - East Central 2013

    题目大意:使用两个哈希表来解决哈希冲突的问题.假如现在有两个哈希表分别为:H1,H2 ,大小分别为:n1,n2:现有一数据X需要插入,其插入方法为: 1.计算index1 = X MOD N1,  若 ...

  8. North America Qualifier (2015)

    https://icpc.baylor.edu/regionals/finder/north-america-qualifier-2015 一个人打.... B 概率问题公式见代码 #include ...

  9. poj 2732 Countdown(East Central North America 2005)

    题意:建一个家庭树,找出有第d代子孙的名字,按照要求的第d代子孙的数从大到小输出三个人名,如果有一样大小子孙数的,就按字母序从小到大将同等大小的都输出,如果小于三个人的就全输出. 题目链接:http: ...

随机推荐

  1. MySQL通用优化 叶金荣!!!

    http://mp.weixin.qq.com/s?__biz=MjM5NDE0MjI4MA==&mid=208777870&idx=1&sn=6efddd6283e4deb3 ...

  2. [转]使用 PIVOT 和 UNPIVOT

    可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执 ...

  3. 如何为Linux安装Go语言

    导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go ...

  4. Linux 测试网速

    Linux 测试网速 1.直接wget -O /dev/null http://speedtest.wdc01.softlayer.com/downloads/test10.zip 一个10M的文件, ...

  5. Hadoop从2.2.0到2.7

    Hadoop2.2.0 GA release 通用版本,Hadoop2.2.0就是一个通用版本 Hadoop2.2.0是从Hadoop1.1.0升级过来的,增加了以下特性: 1.增加了YARN: 2. ...

  6. A - 敌兵布阵

    Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些 ...

  7. String、Brush、Color 相互转换

    1.String转换成Color Color color = (Color)ColorConverter.ConvertFromString(string); 2.String转换成Brush Bru ...

  8. 菜菜菜鸟学习之JavaWeb 入门1(自己的学习理解,不对之处请大神们多多指教啊)

    一.相关基础知识 1.C/S(Client/Server)架构和B/S(Browser/Server)架构 首先说C/S架构,简单讲其实很常见,类似QQ等需要下载客户端的应用程序就是建立在C/S架构中 ...

  9. Svn 的 Update 与Maven 的update project 作用有什么区别

    1.svn update只是更新项目的SVN仓库.2.maven update project则是进行一系列的操作(跟自己的配置有关,可能包含一下操作):更新SVN.更新项目关联.编译项目.构建发布等 ...

  10. poj 1330 Nearest Common Ancestors 裸的LCA

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...