HDU 4858 프로젝트 관리 (점 블록)
6233 단어 = = = = 데이터 구조 = =조각 을 나누다
분석: 점 을 중점 과 경 점 으로 나 누고 도 수 는 sqrt (m) 보다 크 며 작은 것 은 경 점 이다. 중점 과 인접 중점 을 연결 하고 가 벼 운 변 과 인접 한 모든 변 의 연결 변 을 규칙 적 으로 얻 을 수 있다. 중점 적 인 답 은 주위 중점 과 가 벼 운 점 이 그 에 대한 부가 로 구성 되 고 가 벼 운 답 은 바로 인접 점 으로 구성 되 며 복잡 도 O (q * 8727). sqrt (m))
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#pragma comment(linker, "/STACK:1024000000,1024000000");
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 200004
int n,m;
int x[maxn],y[maxn];
int fir[maxn],nex[maxn],v[maxn],e_max;
int in[maxn];
int sum[maxn],val[maxn];
bool heavy[maxn];
void init()
{
memset(sum,0,sizeof sum);
memset(val,0,sizeof val);
memset(heavy,false,sizeof heavy);
memset(in,0,sizeof in);
memset(fir,-1,sizeof fir);
e_max=0;
}
void add_edge(int s,int t)
{
int e=e_max++;
v[e]=t;
nex[e]=fir[s];
fir[s]=e;
}
void build()
{
int block=sqrt(m);
for(int i=1; i<=n; i++)
{
if(in[i]>=block) heavy[i]=true;
}
for(int i=0; iint u=x[i],v=y[i];
if(heavy[u]&&heavy[v])
{
add_edge(u,v);
add_edge(v,u);
}
if(!heavy[u]) add_edge(u,v);
if(!heavy[v]) add_edge(v,u);
}
}
void update(int x,int y)
{
val[x]+=y;
if(!heavy[x])
{
for(int i=fir[x]; ~i; i=nex[i])
{
int e=v[i];
sum[e]+=y;
}
}
}
int query(int x)
{
int ans=0;
if(heavy[x]) ans+=sum[x];
for(int i=fir[x]; ~i; i=nex[i])
{
int e=v[i];
ans+=val[e];
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i=0; iscanf("%d%d",&x[i],&y[i]);
in[x[i]]++;
in[y[i]]++;
}
build();
int q;
scanf("%d",&q);
while(q--)
{
int op;
scanf("%d",&op);
if(!op)
{
int x,y;
scanf("%d%d",&x,&y);
update(x,y);
}
else
{
int x;
scanf("%d",&x);
printf("%d
",query(x));
}
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
poj_3468. A Integers 와 함께 하 는 간단 한 문제 (선분 수 / 블록)Time Limit: 5000MS Case Time Limit: 2000MS You have N integers, A1, A2, ... One type of operation is to add some given n...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.