Bank Hacking CodeForces - 796C

题目

题意:

一条笨狗要去黑银行,银行有n个,它们之间用n-1条边连接。可以选择任意一个银行开始黑,但是后面每一次黑的银行都要求与已经黑过的银行直接相连。每个银行初始有一个防御值,每一个银行被黑后,与其直接相连的未被黑的银行的防御值会+1,与“与其直接相连的未被黑的银行”相连的未被黑的银行的防御值也会+1,。笨狗要黑完所有银行,且其电脑的强度要求大于等于所有银行被黑那一刻的防御值。现在要求电脑的最小强度。

分析:

记点x在被hack时比原来高的强度为s[x], 稍微尝试一下就会发现,s[第一次选的]=0,s[第一次选的的neighbor]=1,s[其他所有]=2.

选的 s有更新的
选4 s[4]=0 s[3]=s[5]=s[2]=s[6]=1
选5 s[6]=2 s[7]=1
选6 s[7]=2
选3 s[2]=2 s[1]=1
选7
选2 s[1]=2
选1

所以,暴力吧

  1 #include<cstdio>
  2 #include<algorithm>
  3 using namespace std;
  4 typedef long long LL;
  5 struct Edge
  6 {
  7     LL to,next;
  8 }edge[1000100];
  9 LL num_edge,first[500100],d[500100],ans=0x3f3f3f3f,n;
 10 struct Node
 11 {
 12     Node *lc,*rc;
 13     LL l,r;
 14     LL maxn;
 15 }ssss[3000100];//线段树,然而根本用不着
 16 LL num_node;
 17 Node* getnode()
 18 {
 19     return &ssss[num_node++];
 20 }
 21 Node* build(LL l,LL r)
 22 {
 23     Node *_tmp=getnode();
 24     _tmp->l=l;
 25     _tmp->r=r;
 26     if(l==r)
 27     {
 28         _tmp->maxn=d[l];
 29         //_tmp->lc=NULL;
 30         //_tmp->rc=NULL;
 31         return _tmp;
 32     }
 33     LL m=(l+r)>>1;
 34     _tmp->lc=build(l,m);
 35     _tmp->rc=build(m+1,r);
 36     _tmp->maxn=max(_tmp->lc->maxn,_tmp->rc->maxn);
 37     return _tmp;
 38 }
 39 LL query(LL L,LL R,Node *p)
 40 {
 41     LL l=p->l;
 42     LL r=p->r;
 43     if(L<=l&&r<=R)
 44         return p->maxn;
 45     LL ans=-0x3f,m=(l+r)>>1;
 46     if(L<=m)    ans=max(ans,query(L,R,p->lc));
 47     if(R>m)        ans=max(ans,query(L,R,p->rc));
 48     return ans;
 49 }
 50 void update(LL L,Node *p,LL x)
 51 {
 52     LL l=p->l;
 53     LL r=p->r;
 54     if(l==r)
 55     {
 56         //p->maxn=max(p->maxn,x);
 57         p->maxn+=x;
 58         return;
 59     }
 60     LL m=(l+r)>>1;
 61     if(L<=m)    update(L,p->lc,x);
 62     else        update(L,p->rc,x);
 63     p->maxn=max(p->lc->maxn,p->rc->maxn);
 64 }
 65 int main()
 66 {
 67     LL i,a,b,k;
 68     scanf("%lld",&n);
 69     for(i=1;i<=n;i++)
 70         scanf("%lld",&d[i]);
 71     for(i=1;i<n;i++)
 72     {
 73         scanf("%lld%lld",&a,&b);
 74         edge[++num_edge].to=b;
 75         edge[num_edge].next=first[a];
 76         first[a]=num_edge;
 77         edge[++num_edge].to=a;
 78         edge[num_edge].next=first[b];
 79         first[b]=num_edge;
 80     }
 81     Node *x=build(1,n);
 82     for(i=1;i<=n;i++)
 83     {
 84         update(i,x,-2);
 85         k=first[i];
 86         while(k!=0)
 87         {
 88             update(edge[k].to,x,-1);
 89             k=edge[k].next;
 90         }
 91         ans=min(ans,query(1,n,x)+2);
 92         update(i,x,2);
 93         k=first[i];
 94         while(k!=0)
 95         {
 96             update(edge[k].to,x,1);
 97             k=edge[k].next;
 98         }
 99     }
100     printf("%lld",ans);
101     //del(x);
102     return 0;
103 }

再贴一张

时间: 2024-10-20 04:50:48

Bank Hacking CodeForces - 796C的相关文章

codeforces 796c Bank Hacking

题意: 有很多家银行,如果一个上线的银行和另一个上线的银行直接相连,那么称这种关系叫相邻: 如果一个上线的银行和另一个上线的银行通过第三个上线银行间接相连,称这种情况为半相邻. 每个银行一开始是上线的并且有一个初始的防卫力量(可能为负数),一个银行被抢劫之后就会下线并且再也不会上线,与它相邻和半相邻的所有上线的银行防卫力量都加一. 一个人要去抢劫银行,首先他会选择一家银行进行抢劫,之后抢劫的银行需要满足以下条件: 1.这家上线的银行与一家下线的银行直接相邻: 2.这家银行的防守值不能超过电脑的攻

CF796C Bank Hacking 思维

Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To search for Zane, he would need a lot of money, of which he sadly has none. To deal with the problem, he has decided to hack the banks. There are n banks, numb

CF796C Bank Hacking 细节

思路十分简单,答案只有 3 种可能,但是有一些细节需要额外注意一下. code: #include <bits/stdc++.h> #define N 300002 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int val[N],hd[N],to[N<<1],nex[N<<1],d1[N],d2[N],n,edges,maxx,mx,m2,cnt

Codeforces Round #408(div.2)

来自FallDream的博客,未经允许,请勿转载,谢谢. 凌晨打比赛真的难受,十一点趴下去,一觉起来感觉精神非常迷糊  脑子不好使了 ------------------------------------------------------------------------------ A. Buying A House 给定n个点,每个点有一个价格.你有一些钱,你要求钱够买的情况下,离一个特殊点的最近距离. 小模拟 #include<cstdio> #include<iostrea

Codeforces Round #408 (Div. 2)ABCD

A. Buying A House 分别向左右枚举,找到符合题意的点,输出最短的长度*10. #include <bits/stdc++.h> using namespace std; int n, k, s, a[105]; int main() { scanf("%d%d%d", &n, &s, &k); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); int m

CodeForces 490C Hacking Cypher

Hacking Cypher Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 490C Description Polycarpus participates in a competition for hacking into a new secure messenger. He's almost won. Having

codeforces 490C. Hacking Cypher 解题报告

题目链接:http://codeforces.com/problemset/problem/490/C 题目意思:给出一个可能有10^6 位长的字符串且没有前导0的整数,问能否一分为二,使得前面的一部分被 a 整除 且 后面那部分被 b 整除,可以的话输出 “YES” 和 划分后的两部分,否则输出“NO”. 看到字符串这么长,一下子就吓怕了---用 mod 即可!这些要靠数学积累吧...... 好常规的方法做——暴力枚举,当然不能遗漏啦,所以从左至右直到倒数第二个数字,都要算出mod a 的结果

Codeforces 490C Hacking Cypher【前缀模+后缀模+暴力】

C. Hacking Cypher time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Polycarpus participates in a competition for hacking into a new secure messenger. He's almost won. Having carefully studied

Codeforces Round #279 (Div. 2) C. Hacking Cypher 机智的前缀和处理

#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <t