• fzu 2171 防守阵地 II


    Problem 2171 防守阵地 II

    Accept: 31    Submit: 112
    Time Limit: 3000 mSec    Memory Limit : 32768 KB

     Problem Description

    部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和。随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守任务的士兵由于疲惫等原因能力指数将下降1。现在士兵们排成一排,请你计算出每次进行防守的士兵的参考指数。

     Input

    输入包含多组数据。

    输入第一行有两个整数N,M,Q(1<=N<=100000,1<=M<=1000,1<=Q<=100000),第二行N个整数表示每个士兵对应的能力指数Xi(1<=Xi<=1000)。

    接下来Q行,每行一个整数X,表示在原始队列中以X为起始的M个士兵替换之前的士兵进行防守。(1<=X<=N-M+1)

    对于30%的数据1<=M,N,Q<=1000。

     Output

    输出Q行,每行一个整数,为每次指令执行之后进行防守的士兵参考指数。

     Sample Input

    5 3 3
    2 1 3 1 4
    1
    2
    3

     Sample Output

    6
    3
    5
     
     
      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<cstdlib>
      6 using namespace std;
      7 
      8 int date[100002];
      9 struct node
     10 {
     11     int l,r;
     12     int color;
     13     int len;
     14     int sum;
     15 }f[100002*4];
     16 void build(int l,int r,int n)
     17 {
     18     int mid=(l+r)/2;
     19     f[n].l=l;
     20     f[n].r=r;
     21     f[n].color=0;
     22     f[n].len=f[n].r-f[n].l+1;
     23     if(l==r){
     24         f[n].sum=date[l];
     25         return;
     26     }
     27     build(l,mid,n*2);
     28     build(mid+1,r,n*2+1);
     29     f[n].sum=f[n*2].sum+f[n*2+1].sum;
     30 }
     31 void pudown(int n)
     32 {
     33     f[n*2].color+=f[n].color;
     34     f[n*2+1].color+=f[n].color;
     35     f[n].color=0;
     36 
     37     if(f[n*2].l==f[n*2].r && f[n*2].color>0)
     38     {
     39         f[n*2].sum-=f[n*2].color;
     40         f[n*2].color=0;
     41     }
     42     if(f[n*2+1].l==f[n*2+1].r && f[n*2+1].color>0)
     43     {
     44         f[n*2+1].sum-=f[n*2+1].color;
     45         f[n*2+1].color=0;
     46     }
     47 }
     48 int query(int l,int r,int n)
     49 {
     50     int mid=(f[n].l+f[n].r)/2;
     51     int tmp;
     52     if(f[n].l==l && f[n].r==r)
     53     {
     54         return f[n].sum-f[n].len*f[n].color;
     55     }
     56     if(f[n].color!=0)
     57         pudown(n);
     58     if(mid>=r)
     59         tmp = query(l,r,n*2);
     60     else if(mid<l)
     61         tmp = query(l,r,n*2+1);
     62     else{
     63         tmp = query(l,mid,n*2)+query(mid+1,r,n*2+1);
     64     }
     65     return tmp;
     66 }
     67 void update(int l,int r,int n)
     68 {
     69     int mid=(f[n].l+f[n].r)/2;
     70     if(f[n].l==l && f[n].r==r)
     71     {
     72         f[n].color++;
     73         return;
     74     }
     75     if(mid>=r)
     76         update(l,r,n*2);
     77     else if(mid<l)
     78         update(l,r,n*2+1);
     79     else 
     80     {
     81         update(l,mid,n*2);
     82         update(mid+1,r,n*2+1);
     83     }
     84     f[n].sum=f[n*2].sum-f[n*2].color*f[n*2].len + f[n*2+1].sum-f[n*2+1].len*f[n*2+1].color;
     85 }
     86 int main()
     87 {
     88     int n,m,q,k,i,l,r;
     89     while(scanf("%d%d%d",&n,&m,&q)>0)
     90     {
     91         for(i=1;i<=n;i++)
     92             scanf("%d",&date[i]);
     93         build(1,n,1);
     94         while(q--)
     95         {
     96             scanf("%d",&l);
     97             r=l+m-1;
     98             k=query(l,r,1);
     99             update(l,r,1);
    100             printf("%d
    ",k);
    101         }
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    Activiti-流程定义
    Activiti入门案例
    工作流--Activiti
    并发编程面试题
    CAS无锁机制
    Activiti个人流程和流量变化
    工作流——Activiti案例
    工作流——Activiti
    并发编程面试题
    锁机制-AQS和CAS
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3695862.html
Copyright © 2020-2023  润新知