[Luogu] 部落冲突--00

https://www.luogu.org/problemnew/show/P3950

思路简单,树剖不用动脑子

#include <bits/stdc++.h>

using namespace std;
const int N = 3e5 + 10;

#define gc getchar()
#define lson jd << 1
#define rson jd << 1 | 1 

struct Node_1{
    int v, nxt;
}G[N << 1];
struct Node_2{
    int fa, son, deep, topp, siz, tree;
}P[N];
struct Node_3{
    int l, r, w;
}T[N << 2];

int n, Ti, now = 1, head[N], LCAi, u1[N], u2[N], js, LCA, tim, ans;

inline int read(){
    int x = 0; char c = gc;
    while(c < ‘0‘ || c > ‘9‘) c = gc;
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = gc;
    return x;
}

inline void add(int u, int v){
    G[now].v = v;
    G[now].nxt = head[u];
    head[u] = now ++;
}

void dfs_find_son(int u, int fa, int dep){
    P[u].fa = fa;
    P[u].deep = dep;
    P[u].siz = 1;
    for(int i = head[u]; ~ i; i = G[i].nxt){
        int v = G[i].v;
        if(v != fa){
            dfs_find_son(v, u, dep + 1);
            P[u].siz += P[v].siz;
            if(P[v].siz > P[P[u].son].siz) P[u].son = v;
        }
    }
}

void dfs_to_un(int u, int tp){
    P[u].topp = tp;
    P[u].tree = ++ tim;
    if(!P[u].son) return ;
    dfs_to_un(P[u].son, tp);
    for(int i = head[u]; ~ i; i = G[i].nxt){
        int v = G[i].v;
        if(v != P[u].son && v != P[u].fa) dfs_to_un(v, v);
    }
}

void build_tree(int l, int r, int jd){
    T[jd].l = l; T[jd].r = r;
    if(l == r) return ;
    int mid = (l + r) >> 1;
    build_tree(l, mid, lson);
    build_tree(mid + 1, r, rson);
}

void Poi_G(int l, int r, int jd, int x, int yj){
    if(l == r) {
        T[jd].w += ((r - l + 1) * yj);
        return ;
    }
    int mid = (l + r) >> 1;
    if(x <= mid) Poi_G(l, mid, lson, x, yj);
    else Poi_G(mid + 1, r, rson, x, yj);
    T[jd].w = T[lson].w + T[rson].w;
}

void Sec_A(int l, int r, int jd, int x, int y){
    if(x <= l && r <= y){
        ans += T[jd].w;
        return ;
    }
    int mid = (l + r) >> 1;
    if(x <= mid) Sec_A(l, mid, lson, x, y);
    if(y > mid) Sec_A(mid + 1, r, rson, x, y);
}

inline void Sec_A_imp(int x, int y){
    int tp1 = P[x].topp, tp2 = P[y].topp;
    ans = 0;
    while(tp1 != tp2){
        if(P[tp1].deep < P[tp2].deep) swap(x, y), swap(tp1, tp2);
        Sec_A(1, n, 1, P[tp1].tree, P[x].tree);
        if(ans != 0){
            puts("No"); return ;
        }
        x = P[tp1].fa;
        tp1 = P[x].topp;
    }
    /*if(x == y) {
        puts("Yes"); return ;
    }*/
    if(P[x].deep > P[y].deep) swap(x, y);
    Sec_A(1, n, 1, P[x].deep + 1, P[y].deep);
    if(ans) puts("No");
    else puts("Yes");
    return ;
}

void debug(){
    for(int i = 1; i <= n; i ++) cout << i << ":" << P[i].tree << endl;
    exit(0);
}

int main()
{
    freopen("lct.in", "r", stdin);
    freopen("lct.out", "w", stdout);
    n = read(); Ti = read();
    for(int i = 1; i <= n; i ++) head[i] = -1;
    for(int i = 1; i < n; i ++) {
        int u = read(), v = read();
        add(u, v); add(v, u);
    }
    dfs_find_son(1, 0, 1);
    dfs_to_un(1, 1);
    build_tree(1, n, 1);
   // debug();
    while(Ti --){
        string s; cin >> s;
            if(s[0] == ‘U‘){
            int x = read();
            int point = P[P[u1[x]].deep > P[u2[x]].deep ? u1[x] : u2[x]].tree;
            Poi_G(1, n, 1, point, -1);
        }
        else if(s[0] == ‘C‘){
            u1[++ js] = read(), u2[js] = read();
            int point = P[P[u1[js]].deep > P[u2[js]].deep ? u1[js] : u2[js]].tree;
            Poi_G(1, n, 1, point, 1);
        }
        else{
            int x = read(), y = read();
            Sec_A_imp(x, y);
        }
    }
    return 0;
}
时间: 2024-10-31 07:03:55

[Luogu] 部落冲突--00的相关文章

计算部落冲突时长的工具

今天闲来无事,想找一个计算部落冲突建筑升级时间.发现没有得心应手的,就自己写了一个控制台输出的小程序. import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class T5 { public static void main(String[] args) { //获取当前系统毫秒 Date nowDate=new Date(System.currentTimeMill

部落冲突(Clash of Clans)12月更新官方资料:可掠夺资源比例调整的详细说明

部落冲突(Clash of Clans)12月更新官方资料:可掠夺资源比例调整的详细说明 们决定要调整战斗中可掠夺资源的比例了! 不要担心,冷静,冷静,再冷静,然后深呼吸,吸气,呼气-- 本次调整后的可掠夺资源计算办法实在是太复杂了,就这个题目写上一篇论文,发表在权威杂志也绰绰有余了,不过如果要长话短说的话就是: "玩家都将体会到更加容易积累与大本营级别相匹配的丰富资源,从而建造和升级昂贵的建筑,研究昂贵的兵种和法术.同时,通过调整不同大本营等级的可掠夺资源比例,你将会更容易找到大鱼."

Cogs 2856. [洛谷U14475]部落冲突

2856. [洛谷U14475]部落冲突 ★★★   输入文件:lct.in   输出文件:lct.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这

部落冲突云手机多开改不同IP防检测挂机

现在很多手游工作室采用云手机多开这个技术挂机一个可以赚金的手游,云手机相当于一个虚拟手机的存在.云手机顾名思义是与云技术有关,但我不想讲的那么高深,大家可以百度一下阿里云,腾讯云等服务器了解一下,云手机就是云服务器下的虚拟框架手机.(安卓系统)可以叫它云手机,也可以叫它云平板.它不是手游模拟器,也不是真实手机.下面,小编我以<部落冲突>为例进行代练的操作示范 首先,安装部落冲突手游,以360版本为例,在360手游市场中搜索并安装<部落冲突>.这时,您可以启动并运行<部落冲突&

【luogu P3950 部落冲突】 题解

题目连接:https://www.luogu.org/problemnew/show/P3950 1.像我这种学数据结构学傻了的 2.边权化点权 所有点权初始化0 3.对于战争 将深度较深的-1,对于和平 将深度较深的+1 4.对于历史 用war记录 5.特别注意 在两个查询的LCA处判断是否为-1并且当前的整条路径上的点权也为-1时 同样是yes 代码: include include include include define lson left, mid, rt<<1 define r

【Luogu P3950】部落冲突

Problem Description 给出一棵树. 你需要处理下面三件事,所有的事件都是按照时间顺序给出的. \(Q, u, v\) 代表询问 \(u, v\) 之间能否相互到达 \(C, u, v\) 代表 \(u, v\) 之间的边断开了 \(U, x\) 代表第 \(U\) 次 \(C\) 操作被还原 Input Format 第一行两个数 \(n\) 和 \(m\) , \(n\) 代表了一共有 \(n\) 个部落,\(m\) 代表了以上三种事件发生的总数 接下来的 \(n - 1\)

P3950 部落冲突

\(\color{#0066ff}{ 题目描述 }\) 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这些部落与部落之间相连的道路看作一颗树,可见每条道路对于Travian世界的重要程度.有了这些道路,建筑工人就可以通过这些道路

题解【部落冲突】

LCT学习ing……从FlshHu的大佬的博客中看到此题,于是便写了一下. 题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事. 其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这些部落与部落之间相连的道路看作一颗树,可见每条道路对于Travian世界的重要程度.有了这些道

[luogu3950] 部落冲突 - Link Cut Tree

有了LCT这不就是思博题了吗 #include <bits/stdc++.h> using namespace std; const int N = 1000000; int n,m,t1,t2,t3; char op[5]; struct LinkCutTree { int top, q[N], ch[N][2], fa[N], rev[N]; inline void pushup(int x) { } inline void pushdown(int x) { if(!rev[x]) re