zoukankan      html  css  js  c++  java
  • [SNOI 2017] 炸弹

    题目描述: 给定炸弹和爆炸范围,求对于每个炸弹连锁爆炸的炸弹总和对\(1e9+7\)取膜

    思路:

    为啥都是线段树+TS+tarjan呢?

    实在是搞不懂~~

    线性\(O(n)\)递推即可.

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1000010;
    const int mod = 1e9+7ull;
    #define debug(x) cout<<"x:"<<x<<endl;
    #define ll long long
    inline ll read() {
    	ll q=0,f=1;char ch=getchar();
    	while(!isdigit(ch)) {
    		if(ch=='-')f =-1;ch=getchar();
    	}
    	while(isdigit(ch)) {
    		q=q*10+ch-'0';ch=getchar();
    	}
    	return q*f;
    }
    struct node{
    	ll num;
    	ll pos;
    }nod[maxn];
    
    ll n;
    ll L[maxn];
    ll R[maxn];
    ll ans;
    int main() {
    	n = read();
    	for(ll i = 1;i <= n; ++i) {
    		nod[i].pos = read(),nod[i].num = read();
    	}
    	for(ll i = 1;i <= n; ++i) {
    		L[i] = i;
    		while(nod[i].pos - nod[L[i] - 1].pos <= nod[i].num && L[i] > 1) {
    			L[i] = L[L[i] - 1];
    			nod[i].num = max(nod[i].num,nod[L[i]].num - (nod[i].pos - nod[L[i]].pos));
    		}
    	}
    	for(ll i = n;i >= 1; --i) {
    		R[i] = i;
    		while(nod[R[i] + 1].pos - nod[i].pos <= nod[i].num && R[i] < n) {
    			R[i] = R[R[i] + 1];
    			L[i] = min(L[i],L[R[i]]);
    		}
    	}
    	for(ll i = 1;i <= n; ++i) {
    //		debug(i);
    //		debug(L[i]);
    //		debug(R[i]);
    		ans = (ans + (R[i] - L[i] + 1) * i) % mod;
    	}
    	printf("%lld\n",ans);
    	return 0;
    }
    /*
    题目有毒orz
    */
    
  • 相关阅读:
    Hyper-V无法启动虚拟机因为虚拟机监控程序未运行
    SpringBoot项目中自动加载datasourceConfig配置导致启动失败
    redis 数据类型与命令
    Redis入门与安装,与配置
    MySQL 主从配置
    MySql 中的事务
    什么是Docker?
    window10下安装Docker
    Docker 常见命令
    原生SQL语句
  • 原文地址:https://www.cnblogs.com/akoasm/p/9408357.html
Copyright © 2011-2022 走看看