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>如果P、Q两点间存在两条完全不重合路径;

<2>如果P到capital的路径经过Q,则P受Q的影响;

<3>P和Z互相影响,Z和Q互相影响,则P和Q互相影响。

Capital 恒为点1.

多组输入,包括n,m,q。(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 mysqldump数据导出详解 --dump-slave 注意事项

    http://www.cnblogs.com/chenmh/p/5300370.html 介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工 ...

  2. C#“同步调用”、“异步调用”、“异步回调”

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  3. Q_INVOKABLE与invokeMethod用法全解

    在Qt/Qt Quick宏浅议一文中,我们将介绍Qt中经常使用的几个宏: Q_OBJECT, SIGNAL与SLOT, Q_SIGNALS 与 Q_SLOTS, Q_EMIT ,Q_INVOKABLE ...

  4. 在window平台搭建Qt开发环境(使用VS2008 IDE)

    一直用QT Creator(mingw)开发Qt应用程序,每次如果需要修改编译链接参数选项时,都要修改pro文件,而这个文件是基于文本的,每次都要记住这些选项参数名,如果在知道原理的情况下还记住这些字 ...

  5. C++类设计2(Class with pointer members)

    二 Class with pointer members(Class String) 1. 测试代码(使用效果) int main() { String s1(), String s2("h ...

  6. CEP简介

    CEP即Complex Event Processing缩写,翻译过来就是复杂事件处理(复合事件可能更加准确).   1.为什么我们需要CEP?CEP是具有实时分析以及快速响应等等功能.下面让我们通过 ...

  7. 【Open Search产品评测】- 来往,7天轻松定制属于自己的搜索引擎

    [Open Search产品评测]--   来往,7天轻松定制属于自己的搜索引擎   [使用背景] 相信很多人都遇到过要给网站或者app做一个搜索功能的需求,很久之前自己折腾过lucene,搞了很久, ...

  8. 【转】ViewGroup的onMeasure和onLayout分析

    ViewGroup的onMeasure和onLayout分析 一个Viewgroup基本的继承类格式如下: 1 import android.content.Context; 2 import and ...

  9. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...

  10. uva 327 Evaluating Simple C Expressions 简易C表达式计算 stl模拟

    由于没有括号,只有+,-,++,--,优先级简单,所以处理起来很简单. 题目要求计算表达式的值以及涉及到的变量的值. 我这题使用stl的string进行实现,随便进行练手,用string的erase删 ...