hdu 4031 2011成都赛区网络赛A题 线段树 ***

就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-!

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 #define cl(a) memset(a,0,sizeof(a))
 13 #define ts printf("*****\n");
 14 #define lson l,mid,rt<<1
 15 #define rson mid+1,r,rt<<1|1
 16 #define root 1,n,1
 17 #define mid ((l+r)>>1)
 18 const int MAXN=200005;
 19 int n,m,t,Min;
 20 int sum[MAXN<<2],col[MAXN<<2];
 21 void pushup(int rt){
 22     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 23 }
 24 void pushdown(int rt,int m)
 25 {
 26     if(col[rt]!=0)
 27     {
 28         sum[rt<<1]+=(m-(m>>1))*col[rt];  //位运算一定要带括号
 29         sum[rt<<1|1]+=(m>>1)*col[rt];
 30         col[rt<<1]+=col[rt];
 31         col[rt<<1|1]+=col[rt];
 32         col[rt]=0;
 33     }
 34 }
 35 void build(int l,int r,int rt){
 36     col[rt]=0;
 37     sum[rt]=0;
 38     if(l==r)    return;
 39     build(lson);
 40     build(rson);
 41     pushup(rt);
 42 }
 43 void update(int L,int R,int val,int l,int r,int rt)
 44 {
 45     if(l>=L&&r<=R)
 46     {
 47         col[rt]+=val;
 48         sum[rt]+=(r-l+1)*val;
 49         return;
 50     }
 51     pushdown(rt,r-l+1);
 52     if(L<=mid)  update(L,R,val,lson);
 53     if(R>mid)  update(L,R,val,rson);
 54     pushup(rt);
 55 }
 56 int query(int pos,int l,int r,int rt)
 57 {
 58     if(l==r)
 59     {
 60         return sum[rt];
 61     }
 62     pushdown(rt,r-l+1);
 63     if(pos<=mid)  return query(pos,lson);
 64     else return query(pos,rson);
 65 }
 66 struct Node
 67 {
 68     int l,r;
 69     Node(){}
 70     Node(int ll,int rr)
 71     {
 72         l=ll,r=rr;
 73     }
 74 }node[MAXN];
 75 int cnt[MAXN],last[MAXN];
 76 int main()
 77 {
 78     int i,j,k;
 79     #ifndef ONLINE_JUDGE
 80     freopen("1.in","r",stdin);
 81     #endif
 82     int u,v,tt,x,q,l;
 83     scanf("%d",&tt);
 84     int ca=1;
 85     while(tt--)
 86     {
 87         scanf("%d%d%d",&n,&q,&t);
 88         build(root);
 89         cl(last);
 90         cl(cnt);
 91         int tot=0;
 92         printf("Case %d:\n",ca++);
 93         while(q--)
 94         {
 95             char s[10];
 96             scanf("%s",s);
 97             if(s[0]==‘A‘)
 98             {
 99                 scanf("%d%d",&u,&v);
100                 update(u,v,1,root);
101                 node[tot++]=Node(u,v);
102             }
103             else
104             {
105                 scanf("%d",&x);
106                 if(t==1){puts("0");continue;}
107                 for(i=last[x];i<tot;i++)    //i是改点冷却好的时间点
108                 {
109                     if(x>=node[i].l&&x<=node[i].r)  //防御成功
110                     {
111                         cnt[x]++;
112                         last[x]=i+t;
113                         i+=t-1;
114                     }
115                 }
116                 //printf("***%d %d***\n",query(x,root),cnt[x]);
117                 printf("%d\n",query(x,root)-cnt[x]);
118             }
119         }
120     }
121 }
时间: 2024-10-22 08:17:40

hdu 4031 2011成都赛区网络赛A题 线段树 ***的相关文章

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000

hdu 4036 2011成都赛区网络赛F 模拟 **

为了确保能到达终点,我们需要满足下面两个条件 1.能够到达所有山顶 2.能够在遇到苦土豆时速度大于他 二者的速度可以用能量守恒定律做,苦土豆的坐标可通过三角形相似性来做 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using na

hdu 4034 2011成都赛区网络赛 逆向floyd **

给出一个最短路邻接矩阵,求出构图的最小边数 正常的floyd的k放在最外面是为了防止i到j的距离被提前确定,而逆向的floyd,i到j的距离已经确定,所以需要在i到j之间枚举k,注意需要break,否则会多删除 Sample Input 3 3 0 1 1 1 0 1 1 1 0 3 0 1 3 4 0 2 7 3 0 3 0 1 4 1 0 2 4 2 0 Sample Output Case 1: 6 Case 2: 4 Case 3: impossible 1 #include<cstdi

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 4023 2011上海赛区网络赛C 贪心+模拟

以为是贪心,结果不是,2333 贪心最后对自己绝对有利的情况 点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000000

hdu 4025 2011上海赛区网络赛E 压缩 ***

直接T了,居然可以这么剪枝 题解链接:点我 1 #include<cstdio> 2 #include<map> 3 #include<cstring> 4 #define ll __int64 5 using namespace std; 6 ll a[23],x[23][5],ans; 7 map<ll,ll>p; 8 void dfs(int d,int n,ll res,int f) 9 { 10 if(d==n){ 11 if(f) p[res]+

hdu 4050 2011北京赛区网络赛K 概率dp ***

题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到达这个格子 1:表示左脚跳进这个格子 2:表示右脚跳进这个格子 3:随意哪个脚跳进这个格子,而且下一步随意用哪个脚 dp[i][j] :表示走到第 i 个格子在 j 状态的期望. 当j=1时,你可以走到dp[i+k][2],dp[i+k][3], 当j=2时,你可以走到dp[i+k][1],dp[i