New Year Tree CodeForces
来源:互联网 发布:淘宝发布宝贝教程2016 编辑:程序博客网 时间:2024/06/06 01:54
题意:
给出区间内数字,有两个操作。操作一更改X的所有子树,操作二询问子树中不同数字个数。
思路:
之前没想到二进制优化,本来认为60个气球很少,就开个数组维护了个vis标记,然而TLE了。上网查说的很有道理60 完全可以用2^60的long long 存在,这样就很好做了!
#include <iostream>#include <stdio.h>#include <map>#include <cstring>#include <queue>#include <vector>using namespace std;const int maxn=500005;vector<int> vec[maxn];int vis[maxn];int id[maxn];int post[maxn];int a[maxn];int topw=0;long long ans;struct node{ int left,right; long long num,lazy;}tree[maxn*4];void dfs(int u){ vis[u]=1; id[u]=++topw; for(int i=0;i<vec[u].size();i++) { int v=vec[u][i]; if(vis[v]) continue; dfs(v); } post[u]=topw;}void push_down(int i){ if(!tree[i].lazy) return ; tree[i << 1].num = tree[i << 1 | 1].num = (1LL << tree[i].lazy); tree[i << 1].lazy = tree[i << 1 | 1].lazy = tree[i].lazy; tree[i].lazy = 0;}void push_up(int i){ tree[i].num = tree[i << 1].num | tree[i << 1 | 1].num;}void build(int i,int left,int right){ tree[i].lazy=0; tree[i].left=left; tree[i].right=right; if(left==right) { return ; } int mid=(tree[i].left+tree[i].right)>>1; build(i<<1,left,mid); build(i<<1|1,mid+1,right);}void get_pos(int i,int aim,int w){ if(tree[i].left==aim&&tree[i].right==aim) { tree[i].num = (1LL << w ); return ; } push_down(i); int mid=(tree[i].left+tree[i].right)>>1; if(aim<=mid) get_pos(i<<1,aim,w); if(aim>mid) get_pos(i<<1|1,aim,w ); push_up(i);}void update(int i,int left,int right,long long w){ if(tree[i].left==left&&tree[i].right==right) { tree[i].lazy=w; tree[i].num=(1LL<<w); return ; } push_down(i); int mid=(tree[i].left+tree[i].right)>>1; if(right<=mid) update(i<<1,left,right,w); else if(left>mid) update(i<<1|1,left,right,w); else { update(i<<1,left,mid,w); update(i<<1|1,mid+1,right,w); } push_up(i); return ;}void query(int i,int left,int right){ if(tree[i].left==left&&tree[i].right==right ) { ans |= tree[i].num; return ; } push_down(i); int mid=(tree[i].left+tree[i].right)>>1; if(right<=mid) { query(i<<1,left,right); } else if(left>mid) { query(i<<1|1,left,right); } else { query(i<<1,left,mid); query(i<<1|1,mid+1,right); } push_up(i);}int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } topw=0; dfs(1); build(1,1,topw); for(int i=1;i<=n;i++) { get_pos(1,id[i],a[i]); } while(m--) { int op; int x,y; scanf("%d",&op); if(op==1) { scanf("%d%d",&x,&y); update(1,id[x],post[x],y); } else { ans=0; scanf("%d",&x); query(1,id[ x ],post[ x ]); int cnt=0; for(int i=1;i<=61;i++) { if(ans & (1LL<<i)) cnt++; } printf("%d\n",cnt); } }}
阅读全文
2 1
- New Year Tree CodeForces
- New Year Tree CodeForces
- New Year Tree CodeForces
- Codeforces 620 E. New Year Tree
- Codeforces 620E New Year Tree
- codeforces 379F New Year Tree 在线LCA
- Codeforces edu 6. E New Year Tree 图论 线段树
- CodeForces 620E New Year Tree(线段树)
- Codeforces 620E New Year Tree (哈希 + 线段树)
- Educational Codeforces Round 6 E. New Year Tree
- coderforce Educational Codeforces Round 6 E.New Year Tree
- CodeForces 750G. New Year and Binary Tree Paths
- CodeForces 620 E.New Year Tree(线段树)
- codeforces New Year Tree dfs序+线段树+状态压缩
- CodeForces 620E New Year Tree 线段树
- Educational Codeforces Round 6 E. New Year Tree CF620E
- CF620E - New Year Tree
- 【codeforces】New Year Transportation
- 湖北民族学院oj1816 之 小明与小红
- 第七届蓝桥杯大赛个人赛决赛(软件类C语言B组)第二题:凑平方数(深搜)
- 凸优化-2-凸函数
- 短信验证
- JAVA的数据类型体系
- New Year Tree CodeForces
- 深入理解java回收机制
- 抽象工厂模式
- 凸优化-3凸优化问题
- 线程状态转换
- vs2010打开高版本文件
- 【剑指offer】第一个只出现一次的字符
- jQuery写js代码时,说 $ 未定义
- 软件行业各职位英文缩写