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. objective-c中使用cocoa的NSPredicate,谓词(十四)

    holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details ...

  2. IIS 之 HTTP 错误 403.14 - Forbidden

    错误如下图所示: 其实,这个提示下面已经交代了怎么解决问题,现在告诉大家具体的详细步骤. 方法一:配置" 默认文档 " 方法二:启用" 目录浏览 "

  3. B. Pasha and String

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  4. 【Android 界面效果40】Android4.0-Fragment框架实现方式剖析(一)

    经过反复的学习对比,个人觉得带着问题学习新知是最有效的学习方式,因此文本就以提问的方式来讲述Fragment框架实现方式. 1.什么是Fragment? Fragment包含在Activity中,Fr ...

  5. a 中调用js的几种方法

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...

  6. (转)内网网站发布到外网-nat123动态公网IP动态域名解析

    环境描述: 路由器分配的是动态公网IP,且有路由器登录管理权限,网站服务器部署在路由器内部网络.如何将内网网站发布到外网大众访问? 解决方案: 内网使用nat123动态域名解析,将域名实时固定解析到路 ...

  7. 解决ThinkPHP开启APP_DEBUG=>false时报错的问题

    最近用ThinkPHP开发一个项目,本地开发测试完成上传到服务器后,第一次打开正常,再刷新页面时就出现 “页面调试错误,无法找开页面,请重试”的错误,我就郁闷啦,明明本地设置define('APP_D ...

  8. C#使用ICSharpCode.SharpZipLib.dll压缩多个文件

    首先通过NuGet管理安装ICSharpCode.SharpZipLib.dll 以下是压缩的通用方法: using System; using System.IO; using System.Web ...

  9. find 忽略文件夹选项-prune的说明

    注意:因为习惯在当前路径查找时候,常忽略./ 的指定,但读者不要因此而完全忘记find的格式. 查找时忽略指定目录,是要使用-prune选项,但实际上最重要的还是要和path配合.-prune的意义是 ...

  10. # HTML && CSS 学习笔记

    https://www.zybuluo.com/denglongku/note/532786 1.Div左右居中 <div>1<div> div{ width:300px; h ...