码迷,mamicode.com
首页 > 其他好文 > 详细

1104

时间:2019-11-04 16:00:43      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:void   getc   树状   max   n+1   using   ++   连接   space   

多打一个0 爆空间 然后就掉50....
A 妹子
计算几何 斜挂了...
B
贪心贪错了 还掉了50
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

C 相交
题目描述
一棵大树下有 n 个巢穴,由 n-1 条双向道路连接,任意两个城市均可互相到达。
大树附近有两群蚂蚁,每天早上,第一群蚂蚁会派一只蚂蚁到这棵树下,并在第 a 个巢穴
到 第
b 个巢穴间的最短路径上的每个巢穴留下气味。每天傍晚,第二群蚂蚁会派一只蚂蚁到

棵树下,并侦查第 c 个巢穴到第 d 个巢穴间的最短路径上是否有蚂蚁留下的气味。
每天蚂蚁留下的气味会在当天深夜消失。
输入
第一行一个正整数 n,含义如题所示。
接下来 n-1 行,每行两个正整数 u,v,表示第 u 个巢穴和第 v 个巢穴间有一条双向道路。
接下来一行一个正整数 q,表示天数。
接下来 q 行,每行四个正整数 a,b,c,d,含义如题所示。
输出
q 行,每行一个字符串。
若第二群派出的蚂蚁侦查到蚂蚁留下的气味,则输出” YES” ,否则输出” NO”

解1:
显然用树链剖分+树状数组维护

//
#include<bits/stdc++.h>
using namespace std;
#define maxnn 301000
#define GC getchar()
int n;
int las[maxnn],en[maxnn],nex[maxnn],tot;
int son[maxnn];
int size[maxnn];
int f[maxnn];
int c1[maxnn],c2[maxnn];
int dep[maxnn];
int dfn[maxnn],low[maxnn],vii,topp[maxnn];
void add(int a,int b) {
    en[++tot]=b;
    nex[tot]=las[a];
    las[a]=tot;
}
void dfs1(int v,int fa) {
    dep[v]=dep[fa]+1;
    size[v]=1;
    f[v]=fa;
    int maxson=-1;
    for(int i=las[v]; i; i=nex[i]) {
        int u=en[i];
        if(u!=fa) {
            dfs1(u,v);
            size[v]+=size[u];
            if(size[u]>maxson) {
                son[v]=u;
                maxson=size[u];
            }
        }
    }
}
void dfs2(int v,int fa,int t) {
    topp[v]=t;
    dfn[v]=++vii;
    if(son[v]) {
        dfs2(son[v],v,t);
    }
    for(int i=las[v]; i; i=nex[i]) {
        int u=en[i];
        if(u==fa) continue;
        if(u==son[v]) continue;
        dfs2(u,v,u);
    }
}
inline int R() {
    char t;
    int x=0;
    while(!isdigit(t)) {
        t=GC;
    }
    while(isdigit(t)) {
        x=x*10+t-48;
        t=GC;
    }
    return x;
}
#define lowbit(i) i&(-i)
void aaa(int x,int d) {
    for(int i=x; i<=n+10000; i+=lowbit(i)) {
        c1[i]+=d;
        c2[i]+=x*d;
    }
}
int get(int x) {
    int ans=0;
    for(int i=x; i; i-=lowbit(i)) {
        ans+=c1[i]*(x+1);
        ans-=c2[i];
    }
    return ans;
}
void zadd(int x,int y,int d) {
    while(topp[x]!=topp[y]) {
        if(dep[topp[x]]<dep[topp[y]]) swap(x,y);
        aaa(dfn[topp[x]],d);
        aaa(dfn[x]+1,-d);
        x=f[topp[x]];
    }
    if(dep[x]<dep[y]) swap(x,y);
    aaa(dfn[y],d);
    aaa(dfn[x]+1,-d);
}
bool query(int x,int y) {
    int ans=0;
    while(topp[x]!=topp[y]) {
        if(dep[topp[x]]<dep[topp[y]]) swap(x,y);
        if(get(dfn[x])-get(dfn[topp[x]]-1)) return true;
        x=f[topp[x]];
    }
    if(dep[x]<dep[y]) swap(x,y);
    if(get(dfn[x])-get(dfn[y]-1)) return true;
    return false;
}
void FIE()
{
    freopen("inter.in","r",stdin);
    freopen("inter.out","w",stdout);
}
int main() {
    //FIE();
    n=R();
    int x,y;
    for(int i=1; i<n; i++) {
        x=R();
        y=R();
        add(x,y);
        add(y,x);
    }
    dfs1(1,1);
    dfs2(1,1,1);
    int q;
    q=R();
    int a,b,c,d;
    while(q--) {
        a=R();
        b=R();
        c=R();
        d=R();
        zadd(a,b,1);
        if(query(c,d)) {
            puts("YES");
        } else {
            puts("NO");
        }
        zadd(a,b,-1);
    }
}

解2

1104

标签:void   getc   树状   max   n+1   using   ++   连接   space   

原文地址:https://www.cnblogs.com/OIEREDSION/p/11792065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!