swjtu 2389 The Trip On Abandoned Railway

题目链接 http://swjtuoj.cn/problem/2389/

题意:给你n个车站 每个车站有一些鬼

给你两种操作

op == 1  给你x-n增加一个等差数列的值(x位置增加y x+1位置增加y+d x+2位置增加x+2d )

op == 2 输出x位置的值 然后把x位置的值置零
思路: 定义一个结构题

pos标记 每次op=1操作的位置
lazy标记 每次op=1的首项
t    标记 每次op=1的操作次数
对于每次操作 我们只需要进行区间叠加
val+= (t*x(位置)-pos)*d+lazy

所以可以转变为一个区间叠加的问题

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const LL MOD =1e9+7;
const int maxn = 100010;
struct node
{
    int l,r;
    LL pos,t,lazy;
    LL val;
}tree[maxn<<2];
int n,m;LL d;
int a[maxn];
void build(int root,int l,int r)
{
    tree[root].l=l;tree[root].r=r;
    tree[root].pos=tree[root].t=tree[root].lazy=0;
    if(tree[root].l == tree[root].r)
    {
        tree[root].val=a[l];
    }
    else
    {
        int mid=(l+r)>>1;
        build(root<<1,l,mid);
        build(root<<1|1,mid+1,r);
    }
}
void push_down(int root)
{
    if(tree[root].l == tree[root].r)
    {
        tree[root].val+=(tree[root].r*tree[root].t-tree[root].pos)*d+tree[root].lazy;
        tree[root].val%=MOD;
    }
    else
    {
        tree[root<<1].pos   +=tree[root].pos;
        tree[root<<1|1].pos +=tree[root].pos;
        tree[root<<1].t     +=tree[root].t;
        tree[root<<1|1].t   +=tree[root].t;
        tree[root<<1].lazy  +=tree[root].lazy;
        tree[root<<1|1].lazy+=tree[root].lazy;
    }
    tree[root].pos=tree[root].t=tree[root].lazy=0;
}
void update(int root,int l,int r,LL pos,LL k)
{
    if(tree[root].t) push_down(root);
    if(l <= tree[root].l && tree[root].r <= r)
    {
        tree[root].pos+=l;
        tree[root].t+=1;
        tree[root].lazy+=k;
    }
    else
    {
        int mid=(tree[root].l+tree[root].r)>>1;
        if(l <= mid)
            update(root<<1,l,r,pos,k);
        if(r >  mid)
            update(root<<1|1,l,r,pos,k);
    }
}
LL querry(int root,int pos)
{
    if(tree[root].t) push_down(root);
    if(tree[root].l == tree[root].r)
    {
        LL ret=tree[root].val;
        tree[root].val=0;
        return ret;
    }
    else
    {
        int mid=(tree[root].l+tree[root].r)>>1;
        if(pos <= mid)
            return querry(root<<1,pos);
        else
            return querry(root<<1|1,pos);
    }
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%lld",&n,&m,&d);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        build(1,1,n);
        for(int i=1;i<=m;i++)
        {
            int op;scanf("%d",&op);
            if(op == 1)
            {
                int pos;LL k;scanf("%d%lld",&pos,&k);
                update(1,pos,n,(LL)pos,k);
            }
            else
            {
                int pos;scanf("%d",&pos);
                LL ret=querry(1,pos);
                printf("%lld\n",ret);
            }
        }
    }
    return 0;
}
时间: 2024-10-13 02:59:44

swjtu 2389 The Trip On Abandoned Railway的相关文章

POJ 1041 John&#39;s trip 无向图的【欧拉回路】路径输出

欧拉回路第一题TVT 本题的一个小技巧在于: [建立一个存放点与边关系的邻接矩阵] 1.先判断是否存在欧拉路径 无向图: 欧拉回路:连通 + 所有定点的度为偶数 欧拉路径:连通 + 除源点和终点外都为偶数 有向图: 欧拉回路:连通 + 所有点的入度 == 出度 欧拉路径:连通 + 源点 出度-入度=1 && 终点 入度 - 出度 = 1 && 其余点 入度 == 出度: 2.求欧拉路径 : step 1:选取起点(如果是点的度数全为偶数任意点为S如果有两个点的度数位奇数取一

HDU 2389 Rain on your Parade

http://acm.hdu.edu.cn/showproblem.php?pid=2389 题意:给暴风雨到来的时刻,m个人的坐标和单位速度,和n个救生衣的坐标.每个救生衣只能匹配一个人,求最多有多少人可以得到救生衣. 题解:典型二分图最大匹配题型.因为点比较多,使用Hopcroft-Karp算法.讲解:http://blog.csdn.net/wall_f/article/details/8248373 http://www.cnblogs.com/-sunshine/archive/201

poj1734 Sightseeing trip

Sightseeing trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6919   Accepted: 2646   Special Judge Description There is a travel agency in Adelton town on Zanzibar island. It has decided to offer its clients, besides many other attra

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

HDU 1038[Biker&#39;s Trip Odometer]简单计算

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1038 题目大意:给轮子直径,转数,时间.要求输出走过的距离和时速(mile为单位) 关键思想:纯算 代码如下: #include <iostream> using namespace std; #define pi 3.1415927 int main(){ double d,r,t,l; int cnt=1; while(cin>>d>>r>>t&&a

BZOJ 2080: [Poi2010]Railway 双栈排序

2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Status][Discuss] Description 一个铁路包含两个侧线1和2,右边由A进入,左边由B出去(看下面的图片) 有n个车厢在通道A上,编号为1到n,它们被安排按照要求的顺序(a1,a2,a3,a4....an)进入侧线,进去还要出来,它们要按照编号顺序(1,2,3,4,5....n)从通道B

暑假练习赛 003 F Mishka and trip

F - Mishka and trip Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description Input Output Sample Input Sample Output Hint Description Peter Parker wants to play a g

hdu 5723 Abandoned country 最小生成树+子节点统计

Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3006    Accepted Submission(s): 346 Problem Description An abandoned country has n(n≤100000) villages which are numbered from 1

1999 Central European Olympiad in Informatics - Sightseeing Trip

算法提示 最小环问题 题目大意 在一张带权无向图上,找出至少含 3 个点且权值和最小的环,并按环上的循序输出环上的点.存在重边,无自环. 做法分析 参考最小环问题,在更新 dist[i][j] 时,记录更新其的点 k,便于回溯路径. 参考代码 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <queue> 5 #include <algorithm> 6