暑假集训0811

利用树的dfs序解决问题:

就是dfs的时候记录每个节点的进入时间和离开时间,这样一个完整的区间就是一颗完整的数,就转化成了区间维护的问题。

比如hdu3887 本质上是一个求子树和的问题

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <stack>
  7 //#pragma comment(linker,"/STACK:1024000000,1024000000")
  8 using namespace std;
  9 #define MAXN (200000+10)
 10 #define lowbit(i) (i&(-i))
 11 int n,m;
 12 struct BIT{
 13     int t[MAXN];
 14     BIT(){memset(t,0,sizeof(t));}
 15     void init(){memset(t,0,sizeof(t));}
 16     int _query(int a){
 17         int ans=0;
 18         for (int i=a;i>=1;i-=lowbit(i))    ans+=t[i];
 19         return ans;
 20     }
 21     void modify(int a,int x){
 22         for (int i=a;i<=n;i+=lowbit(i))    t[i]+=x;
 23     }
 24
 25     int query(int a,int b){
 26         return _query(b)-_query(a-1);
 27     }
 28 }T;
 29 int timemark;
 30 int intime[MAXN],outime[MAXN];
 31 int data[MAXN];
 32 int f[MAXN];
 33 int head[MAXN],next[MAXN],e[MAXN],countside;
 34 void buildside(int a,int b){
 35     e[countside]=b;
 36     next[countside]=head[a];
 37     head[a]=countside++;
 38 }
 39 /*
 40 void dfs(int x,int fa){
 41     intime[x]=timemark++;
 42     for (int i=head[x];i>0;i=next[i]){
 43         if (e[i]!=fa){
 44             dfs(e[i],x);
 45         }
 46     }
 47     outime[x]=timemark++;
 48 }
 49 */
 50
 51 stack<int> s;
 52 bool instack[MAXN];
 53 void dfs(int root){
 54     memset(instack,false,sizeof instack);
 55     s.push(root);
 56     intime[root]=timemark++;
 57     instack[root]=true;
 58     while (!s.empty()){
 59         bool loop=false;
 60         int now=s.top();
 61         for (int i=head[now];i>0;i=next[i]){
 62             if (!instack[e[i]]){
 63                 s.push(e[i]);
 64                 instack[e[i]]=true;
 65                 intime[e[i]]=timemark++;
 66                 loop=true;
 67                 break;
 68             }
 69         }
 70         if (loop)    continue;
 71         s.pop();
 72         outime[now]=timemark++;
 73     }
 74 }
 75
 76 int main (int argc, char *argv[])
 77 {
 78     int p;
 79     int a,b;
 80     char cmd[10];
 81
 82     while (1){
 83         scanf("%d%d",&n,&p);
 84
 85         if (n==0 && p==0)    break;
 86
 87         memset(head,0,sizeof head);
 88         memset(next,0,sizeof next);
 89         memset(e,0,sizeof e);
 90
 91         countside=1;
 92         for (int i=1;i<=n-1;i++){
 93             scanf("%d%d",&a,&b);
 94             buildside(a,b);
 95             buildside(b,a);
 96         }
 97
 98         timemark=1;
 99         dfs(p);
100
101
102         /*for (int i=1;i<=n;i++)    cout<<intime[i]<<" "<<outime[i]<<endl;*/
103
104         int N=n;
105         n=n*2;
106         T.init();
107         for (int i=1;i<=n;i++){
108             data[i]=1;
109             T.modify(i,1);
110         }
111
112         for (int i=N;i>=1;i--){
113             f[i]=(T.query(intime[i],outime[i])-2)/2;
114             T.modify(intime[i],-1);
115             T.modify(outime[i],-1);
116         }
117
118         for (int i=1;i<=N-1;i++)    printf("%d ",f[i]);
119         printf("%d\n",f[N]);
120     }
121     return 0;
122 }

直接dfs爆栈了,所以我写了一个手工栈。结果后来发现这样就行了QAQ

1 #pragma comment(linker,"/STACK:100000000,100000000")

WTF。。。涨姿势了

再就是对于那种复杂的序列操作问题,比如文本编辑器,我发现了C++ 里还有rope这个东西。当然这不是标准STL的,这是SGI STL的一部分。但是如果比赛的时候能用就爽了。。。不管怎么说先记录一下,平时也是蛮实用的。

rope就是一个能支持各种操作的序列,crope就是rope的字符串版本。rope自带各种炫酷的功能,时间各种logn,就连空间也超小。据说内部实现的是一个可持久化的平衡数并且加上共享节点。Orz

NOI 的那道文本编辑器

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <ext/rope>
 6 using namespace std;
 7 using namespace __gnu_cxx;
 8 crope List;
 9 int n,now,k;
10 char s[2500005];
11 int main()
12 {
13     char cmd[25];
14     int i;
15     for (scanf("%d",&n);n--;)
16     {
17         scanf("%s",cmd);
18         if (cmd[0]==‘M‘) scanf("%d",&now);
19         else if (cmd[0]==‘I‘)
20         {
21             scanf("%d%*c",&k);
22             for (i=0;i<k;i++) do
23             {
24                 scanf("%c",&s[i]);
25             }while(s[i]==‘\n‘);
26             s[k]=0;
27             List.insert(now,s);
28         }
29         else if (cmd[0]==‘D‘)
30         {
31             scanf("%d",&k);
32             List.erase(now,k);
33         }
34         else if (cmd[0]==‘G‘)
35         {
36             scanf("%d",&k);
37             List.copy(now,k,s);
38             s[k]=0;
39             puts(s);
40         }
41         else if (cmd[0]==‘P‘) now--;
42         else now++;
43     }
44     return 0;
45 }

暑假集训0811

时间: 2024-11-06 09:53:59

暑假集训0811的相关文章

2017暑假集训前总结和规划

距离大一进来已经一年了啊,感觉还是啥也不会,哎,太差了,总结一下这一年都学了写什么吧! 大一寒假开始专题,刷过的有:dp,dfs和bfs,数论(gcd拓展gcd,欧拉定理等等,但是中国剩余定理没学,等复习的时候再学吧),并查集,最短路(bellman-fprd,dijkstra,floyd-warshall,spfa),最小生成树(prim,kruskal),线段树,二分三分 大一下学期有:拓扑排序,基础计算几何(直线线段相交,快速排除实验,跨立实验),矩阵快速幂,博弈基础(nim博弈,威佐夫博

暑假集训0815

最近打了两场多校和一场中期比赛 中期比赛的话也就那么回事= =水题集合(从各种意义上 两场多校被各种虐,已经弱到谁都可以上(rbq)的程度了TOT 团队配合还要慢慢磨合,毕竟刚刚组队不久 这两次比赛有好几题都是差一点就想出来,毕竟还是图样 继续加油(shui)吧 还有就是一定要好好读题啊!最好读完题之后就手算一下数据,以防理解错题意.如果理解错了不会做就罢了,像中期比赛的时候读完题愉悦的打完代码才发现理解错题意了简直不能忍(论坑队友的正确姿势) Multi-University Training

暑假集训7.11 字符串回文暴力

#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int i

暑假集训0808

来HIT参加暑假集训也有将近一周了,一直什么都没写= =. 记一下今天的比赛吧,以后争取每天更新一篇总结. 我是弱比.只能出6题. A:POJ1417 很容易发现yes表示两个人是同一类,no是不同类,然后怎么判断方案是否唯一我就不会了...我是有多么的弱...类似于背包DP,就是用前i个大类填满j个人数的方案. B:HDU1711 裸KMP C:POJ 2503 一个字典的实现.很显然的Trie.(我就想说出题人就不能给个n么..读入麻烦死..) D:POJ2828  比赛的时候还是想的有问题

2017暑假集训~心路历程

2017年暑假集训的个人赛阶段已经结束了. 回想这7场比赛,前几场发挥的还可以. 但是第4场之后开始状态开始下滑.第4场是在TOJ上做的,题数马马虎虎,就是罚时有点多. 第5场的FOJ的比赛打得十分糟糕.因为并不熟悉这个OJ, 赛前测试工作也没有作足. 比赛的时候各种意想不到的CE,WA.这样一来我前两小时只过了一题. 不过最后两小时至少翻到了不至于垫底的位置…… 第6场发挥也不好,被一道树形DP搞住了(这应该是我的强项),卡了一个半小时发现自己题目读错了.结果还是想不出来……然后另一道贪心因为

暑假集训(2)第五弹 ----- Who&#39;s in the Middle(poj2388)

G - Who's in the Middle Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description FJ is surveying his herd to find the most average cow. He wants to know how much milk this 'median

暑假集训练习赛题解

比赛链接:http://acm.nyist.net/JudgeOnline/problemset.php?cid=205 对于第一道题 UFS(Union  Find  Set) ,请参见http://blog.csdn.net/u011632342/article/details/37814289,题目大意一样,解法一样,不过后台测试数据还没整太多,数据比较弱... 对于第二道题STR(STRing),本来是想着给大家"送福利"呢,可能由于我的题目表述能力不太好或者样例数据的特殊性或

ACM暑假集训总结

暑假集训总结 回想去年暑假集训,和boblee.yyd组队时,他们为了复习考研,只有我一人默默的在基地训练,再到今年和yj.cq组队,三人能在基地一起刷题训练.再回想去年暑假自己作为新人,只能抱着两位队友的大腿,到今年作为一队的成员,要挑起集训队的大梁.从去年的全俱乐部开黑只能压线过几场网络赛,再到今年的队伍间各自做题,照样能没什么压力的通过网赛.亲眼见证俱乐部由弱到强,由不为人知到众所周知,自己不仅感触颇多,也同样敬佩起当初办起这个俱乐部的创始人们. 作为一个刚刚接触OI就要面临高考的人,才刚

CSU-ACM2014暑假集训基础组训练赛(1) 解题报告

•Problem A HDU 4450                 水题,签到题 水题..没啥好说的.给大家签到用的. 1 #include <cstdio> 2 int main(){ 3 int n,a,ans; 4 while(scanf("%d",&n),n){ 5 ans = 0; 6 for(int i = 0;i < n;i++){ 7 scanf("%d",&a); 8 ans += a*a; 9 } 10 pr