【SPOJ METEORS】 Meteors
http://www.spoj.com/problems/METEORS/ (题目链接)
题意
一个星球上有$m$个空间站排列在一个环形轨道上,每个空间站仅属于一个国家。总共有$K$场流星雨,这些流星雨降落在区间$[l,r]$的空间站并带来$w$的陨石。每个国家想要收获$p_i$的陨石,问每个国家最少在第几场流星雨过后收集到的陨石达到要求。
Solution
整体二分很明显,一开始复杂度算错了T_T。
细节
本机7s,SPOJ竟然跑过去了w(゚Д゚)w。听说会爆LL
代码
// spojMETEORS
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define ULL unsigned long long
#define inf 2147483600
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std;
inline int gi() {
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=300010;
int n,m,K,cnt,a[maxn],ans[maxn],head[maxn];
struct edge {int to,next;}e[maxn];
struct data {int w,id;}p[maxn],lp[maxn],rp[maxn];
struct node {int l,r;ULL s,tag;}tr[maxn<<2];
struct mete {int l,r,w;}q[maxn]; namespace Segtree {
void build(int k,int s,int t) {
tr[k].l=s;tr[k].r=t;
if (s==t) return;
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
}
void modify(int k,int s,int t,LL val) {
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;
if (l==s && r==t) {tr[k].s+=val*(r-l+1);tr[k].tag+=val;return;}
if (t<=mid) modify(k<<1,s,t,val);
else if (s>mid) modify(k<<1|1,s,t,val);
else modify(k<<1,s,mid,val),modify(k<<1|1,mid+1,t,val);
tr[k].s=tr[k<<1].s+tr[k<<1|1].s;
}
ULL query(int k,int p) {
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;
if (l==r) return tr[k].s;
if (p<=mid) return query(k<<1,p)+tr[k].tag;
else return query(k<<1|1,p)+tr[k].tag;
}
}
using namespace Segtree; void link(int u,int v) {
e[++cnt]=(edge){v,head[u]};head[u]=cnt;
}
void solve(int ql,int qr,int l,int r) {
if (ql>qr) return;
int mid=(ql+qr)>>1,l1=0,l2=0;
for (int i=ql;i<=mid;i++) {
if (q[i].l>q[i].r) modify(1,q[i].l,m,q[i].w),modify(1,1,q[i].r,q[i].w);
else modify(1,q[i].l,q[i].r,q[i].w);
}
for (int i=l;i<=r;i++) {
ULL sum=0;
for (int j=head[p[i].id];j;j=e[j].next) sum+=query(1,e[j].to);
if (p[i].w<=sum) lp[++l1]=p[i],ans[p[i].id]=mid;
else rp[++l2]=p[i];
}
for (int i=1;i<=l1;i++) p[l+i-1]=lp[i];
for (int i=1;i<=l2;i++) p[r-i+1]=rp[i];
if (l+l1<=r) solve(mid+1,qr,l+l1,r);
for (int i=ql;i<=mid;i++) {
if (q[i].l>q[i].r) modify(1,q[i].l,m,-q[i].w),modify(1,1,q[i].r,-q[i].w);
else modify(1,q[i].l,q[i].r,-q[i].w);
}
if (l<=r-l2) solve(ql,mid-1,l,r-l2);
}
int main() {
n=gi(),m=gi();
for (int i=1;i<=m;i++) a[i]=gi();
for (int i=1;i<=m;i++) link(a[i],i);
for (int i=1;i<=n;i++) p[i].w=gi(),p[i].id=i;
K=gi();
for (int i=1;i<=K;i++) q[i].l=gi(),q[i].r=gi(),q[i].w=gi();
build(1,1,m);
solve(1,K,1,n);
for (int i=1;i<=n;i++) {
if (!ans[i]) puts("NIE");
else printf("%d\n",ans[i]);
}
return 0;
}
【SPOJ METEORS】 Meteors的更多相关文章
- 【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)
54 种草约翰有 N 个牧场,编号为 1 到 N.它们之间有 N − 1 条道路,每条道路连接两个牧场.通过这些道路,所有牧场都是连通的.刚开始的时候,所有道路都是光秃秃的,没有青草.约翰会在一些道 ...
- 【SPOJ 2319】 BIGSEQ - Sequence (数位DP+高精度)
BIGSEQ - Sequence You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need ...
- 【SPOJ 694】Distinct Substrings (更直接的求法)
[链接]h在这里写链接 [题意] 接上一篇文章 [题解] 一个字符串所有不同的子串的个数=∑(len-sa[i]-height[i]) [错的次数] 0 [反思] 在这了写反思 [代码] #inclu ...
- 【SPOJ 694】Distinct Substrings
[链接]h在这里写链接 [题意] 给你一个长度最多为1000的字符串 让你求出一个数x,这个x=这个字符串的不同子串个数; [题解] 后缀数组题. 把原串复制一份,加在 ...
- 【SPOJ DQUERY】区间数字统计
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 因为区间的端点移动一个单位的话,只会涉及到一个元素的增多或减少. 因此可以用莫队算法来解决. 只需要开一个数组(大小1百万),用下标来快速检索 ...
- 【SPOJ 220】 PHRASES - Relevant Phrases of Annihilation
[链接]h在这里写链接 [题意] 给你n(n<=10)个字符串. 每个字符串长度最大为1e4; 问你能不能找到一个子串. 使得这个子串,在每个字符串里面都不想交出 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
- 【SPOJ 8222】Substrings
http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...
随机推荐
- python基础1之python介绍、安装、变量和字符编码、数据类型、输入输出、数据运算、循环
开启python之路 内容概要: 一.python介绍 二.安装 三.第一个python程序 四.变量和字符编码 五.用户输入 六.数据类型 七.一切皆对象 八.数据运算 九.if else 流程判断 ...
- 理解 NgModelController 中相关方法和属性
1. 理解$formatters和$parsers方法 angular的双向绑定可以实现view和model中的值自动同步,但有时候我们不想让用户输入的(view值)和发送给后台的(model值)并不 ...
- libgdx学习记录13——矩形CD进度条绘制
利用ShapeRenderer可进行矩形进度条的绘制,多变形的填充等操作. 这是根据角度获取矩形坐标的函数. public Vector2 GetPoint( float x, float y, fl ...
- python3获取主机名、主机IP
python3可以通过socket模块获取主机名及主机IP 代码如下: *********************************************************** 学习永远 ...
- 调用wx.request接口时需要注意的几个问题
写在前面 之前写了一篇<微信小程序实现各种特效实例>,上次的小程序的项目我负责大部分前端后台接口的对接,然后学长帮我改了一些问题.总的来说,收获了不少吧! 现在项目已经完成,还是要陆陆续续 ...
- Maven构建项目速度太慢的解决办法
问题描述 通过idea新建maven项目,参数设置好后,idea自动构建maven项目时,速度很慢. 参数设置如图: 执行时间如下图: Total time为8:49,花了将近十分钟时间. 连续尝试了 ...
- Altium CAED 国际认证操作题例题(含下载)
官网介绍页面 https://www.altium.com.cn/certification 共五套操作题 含资料 蓝奏云:https://www.lanzous.com/i2lj1ng 百度网盘:h ...
- Unity3d Transform.forward和Vector3.forward的区别!
在Unity中有两个forward,一个是Transform.forward一个是Vector3.forward. 对于Vector3来说,它只是缩写.没有其它任何含义. Vector3.forwar ...
- Istio 流量治理功能原理与实战
一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中共有4种标准负载均衡算法. •Round_Robin: 轮询算 ...
- PHP学习 函数 function
参数默认值function drink($kind ='tea'){echo 'would you please a cup'.$kind.'<br>';} drink();drink(' ...