[codeforces]C. Destroying Array——并查集
来源:互联网 发布:代号美洲豹 知乎 编辑:程序博客网 时间:2024/06/08 19:55
利用并查集,从后面状态往前求解
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <algorithm>#include <climits>#include <cstring>#include <string>#include <set>#include <map>#include <queue>#include <stack>#include <vector>#include <list>#define rep(i,m,n) for(i=m;i<=n;i++)#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)const int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define vi vector<int>#define pb push_back#define mp make_pair#define fi first#define se second#define PI acos(-1.0)#define pii pair<int,int>#define Lson L, mid, rt<<1#define Rson mid+1, R, rt<<1|1const int maxn=5e2+10;using namespace std;typedef long long ll;typedef unsigned long long ull; inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}//#pragma comment(linker, "/STACK:102400000,102400000")ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}#define maxn 100005int a[maxn];int pos[maxn];int fa[maxn];bool ok[maxn];ll s[maxn];ll ans[maxn];int find(int u){ if(u!=fa[u]) fa[u] = find(fa[u]); return fa[u];}int merge(int u, int v){ int fu = find(u),fv = find(v); fa[fv] = fu; //将原来的树挂靠到当前节点上 s[fu] += s[fv]; //将原来的根节点上的值加到当前根节点上}int main(){ //freopen("test.txt","r",stdin); ios_base::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i = 1; i<=n; i++) { cin>>a[i]; } for(int i = 1; i<=n; i++) { cin>>pos[i]; s[pos[i]] = a[pos[i]]; fa[i] = i; } ll rans = 0; for(int i = n; i>=2; i--) { if(pos[i]<n && ok[pos[i]+1])//判断是否有右边的元素 { merge(pos[i],pos[i]+1); } if(pos[i]>1 && ok[pos[i]-1])//判断是否有左边的元素 { merge(pos[i],pos[i]-1); } rans = s[pos[i]];//其一定包含新开的数 ok[pos[i]] = true; ans[i] = max(ans[i+1],rans);//判断其是否比他大 } for(int i = 2; i<=n+1; i++) cout << ans[i] << endl;; return 0;}
0 0
- [codeforces]C. Destroying Array——并查集
- codeforces 722C Destroying Array ( 并查集 / Multiset )
- codeforces 722C. Destroying Array(并查集||set)
- 并查集巧妙用法(codeforces)C. Destroying Array
- 【Codeforces 722 C Destroying Array】+ 并查集
- Codeforces 722C Destroying Array(并查集)
- 并查集——Destroying Array(Intel Code Challenge Elimination Round C)
- Codeforces Round 722C:Destroying Array(并查集,好题)
- Codeforces 722C Destroying Array【逆序(离线)思维+并查集】
- CodeForces 722C. Destroying Array(并查集 好题)
- CodeForces 722C Destroying Array(并查集和我奇怪的二叉树)
- Codeforces722 C. Destroying Array (并查集)
- 并查集(Destroying Array,cf 722C)
- codeforces 722C Destroying Array 并查集带权
- Destroying Array(并查集)
- codeforces 722C Destroying Array
- codeforces(722c)-Destroying Array
- codeforces-772C-Destroying Array
- 第一次机房收费之注册
- 酷派大神F1移动版刷机教程卡刷教程
- Git指令笔记
- USACO 1.5 Number Triangles
- Java 条件语句练习题
- [codeforces]C. Destroying Array——并查集
- 【C++研发面试笔记】8. 基本数据结构-二叉堆
- CRT_ 参数访问_变参函数
- 正则表达式
- 30. 实体和编码(2)
- 1.3Android Studio如何集成Genymotion
- 扒一扒ARM Cortex-M各版本的第一款MCU
- mapreduce之倒排索引代码
- Codeforces(722D)-Generating Sets