HDU - 4046 Panda
2016-02-22 20:50
399 查看
HDU - 4046 Panda
1.题面
传送门2.解题思路
表示题面很感人啊,看着看着就看到了《那些年》的歌词,感动死我了。What a sad day。感动归感动,题目还是要做的。其实就是给你一段仅由b,w,b,这三个字母组成的字符串,要求你支持两个操作,一是回答在[l,r]区间内有多少个连续的bwb,二是将区间中某个字符修改成另一个。用树状数组解决掉的,我们讲这样一个字符串改成一个只含0,1 的数组,如果在i,i+1位,i+2位形成了一个bwb串,我们就将i位设置为1,否则设置为2。然后,对于每次的修改操作,可以看出,如果每次修改的是第i个位置的字符,最多只能影响到i-2,i-1,i三个位置的0,1数组的数值。计数的时候利用树状数组求某段区间和的操作即可。
错了挺多次是因为没有考虑到了r-l小于3的情况,这种情况下会没有输出。觉得挺有意义,所以保留的代码中所有debug部分。
然后提一句,没有取消cin与stdio的同步效率真的差很多,该代码没取消同步和取消同步后运行时间相差了差不都1000毫秒
3.解题代码
/***************************************************************** > File Name: tmp.cpp > Author: Uncle_Sugar > Mail: uncle_sugar@qq.com > Created Time: 2016年02月19日 星期五 09时45分39秒 ****************************************************************/ # include <cstdio> # include <cstring> # include <cmath> # include <cstdlib> # include <iostream> # include <iomanip> # include <set> # include <map> # include <vector> # include <stack> # include <queue> using namespace std; const int debug = 1; const int size = 10000 + 10; typedef long long ll; struct DisjointSet{ int *T,size,sum; int FindRoot(int i){ return T[i] < 0 ? i : FindRoot(T[i]); } DisjointSet(){} DisjointSet(int _size):size(_size){ T = new int[size]; Init(); } void Init(){sum = size;memset(T,-1,sizeof(int)*size);} bool Unioned(int i,int j){return FindRoot(i)==FindRoot(j);} void Union(int i,int j){ if ( (i = FindRoot(i) ) != ( j = FindRoot(j) ) ){ T[i] = T[i] + T[j]; T[j] = i; sum--; } } int GetSum(int i){return -T[FindRoot(i)];} }; DisjointSet dst(size); int TransTime[size]; void Transport(){ int a,b; cin >> a >> b; dst.Union(b,a); } void Query(){ int x,d=0; cin >> x; while (dst.T[x]>=0){ x = dst.T[x]; d++; } cout << x << " " << -dst.T[x] << " " << d << '\n'; } int main() { std::ios::sync_with_stdio(false);cin.tie(0); int i,j,k; int T,ncase=0; cin >> T; while (T--){ cout << "Case " << (++ncase) << ":\n"; int n,q; memset(TransTime,0,sizeof(TransTime)); dst.Init(); cin >> n >> q; char cmd[10]; while (q--){ cin >> cmd; switch(cmd[0]){ case 'T':Transport();break; case 'Q':Query();break; } } } return 0; }
相关文章推荐
- 生命之树
- mysql数据增删改查操作
- 字符编码之ASCII、Unicode以及utf-8之间的联系与区别
- linux makefile详解?
- 在Linux飞控环境下使用MAVLink教程
- GDKOI2016暴力记
- 【设计模式之策略模式】
- BZOJ 1858 SCOI2010 序列操作 线段树
- 2月22号 UITableView
- php编译安装
- Increasing Triplet Subsequence
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 关于c++浮点数的数字个数setprecision(n)与setiosflags(ios::fixed)
- 程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]
- java的动态代理机制详解
- perl对象
- linux Native AIO的使用
- 22.使用UML图做描述
- OpenJudge百炼习题解答(C++)--题4045:与3和5无关的数
- RepositionBars的用法和参数的意义