HDU 4902 Nice boat
来源:互联网 发布:java log4j用法 编辑:程序博客网 时间:2024/05/22 13:02
HDU 4902 Nice boat2014年多校联合第四场
离线算法
在读入的同时,用线段树维护区间最大的 1 操作的脚标,
再按照点查询,从该点最后一次 1 操作位置求gcd
#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <climits>#include <complex>#include <fstream>#include <cassert>#include <cstdio>#include <bitset>#include <vector>#include <deque>#include <queue>#include <stack>#include <ctime>#include <set>#include <map>#include <cmath>#define EPS 1e-10#define INF 0x3f3f3f3f#define ll __int64using namespace std;template<class T>inline bool read(T &n){ T x = 0, tmp = 1; char c = getchar(); while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar(); if(c == EOF) return false; if(c == '-') c = getchar(), tmp = -1; while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar(); n = x*tmp; return true;}template <class T>inline void write(T n) { if(n < 0) { putchar('-'); n = -n; } int len = 0,data[20]; while(n) { data[len++] = n%10; n /= 10; } if(!len) data[len++] = 0; while(len--) putchar(data[len]+48);}//-----------------------------------------------------------------------const int MAXN=100010;struct Piont{ int l,r; int po;}arr[8*MAXN];int lazy[8*MAXN];struct Node{ int t,l,r; ll x;}a[MAXN];ll num[MAXN];ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}void pushdown(int idx){ if(lazy[idx]) { int lc=idx<<1,rc=idx<<1|1; if(arr[idx].po>arr[lc].po) arr[lc].po=arr[idx].po,lazy[lc]=1; if(arr[idx].po>arr[rc].po) arr[rc].po=arr[idx].po,lazy[rc]=1; lazy[idx]=0; }}void build(int idx,int l,int r){ int lc=idx<<1,rc=idx<<1|1; arr[idx].l=l,arr[idx].r=r; arr[idx].po=0; if(l==r) { arr[idx].po=0; return; } int mid=l+(r-l)/2; build(lc,l,mid); build(rc,mid+1,r);}void update(int idx,int L,int R,int v){ int lc=idx<<1,rc=idx<<1|1; int l=arr[idx].l,r=arr[idx].r; if(L<=l && r<=R) { arr[idx].po=v;lazy[idx]=1; return; } pushdown(idx); if(l<r) { int mid=l+(r-l)/2; if(mid>=L) update(lc,L,R,v); if(mid<=R) update(rc,L,R,v); }}int query(int idx,int x){ int lc=idx<<1,rc=idx<<1|1; int l=arr[idx].l,r=arr[idx].r; if(x<=l&&x>=r) { return arr[idx].po; } pushdown(idx); int mid=l+(r-l)/2; if(mid>=x) return query(lc,x); if(mid<x+1) return query(rc,x);}int main(){ int T,n,m,t,l,r,x; read(T); while(T--) { read(n); for(int i=1;i<=n;i++) read(num[i]); build(1,1,n); read(m); for(int i=1;i<=m;i++) { read(a[i].t),read(a[i].l),read(a[i].r),read(a[i].x); if(a[i].t==1) update(1,a[i].l,a[i].r,i); }/* for(int i=0;i<=2*n;i++) printf("%d (%d->%d) %d: lazy[%d]\n",i,arr[i].l,arr[i].r,arr[i].po,lazy[i]);*/ for(int i=1;i<=n;i++) { int j=query(1,i); if(a[j].t==1) num[i]=a[j].x; for(;j<=m;j++) if(a[j].t==2&&a[j].x<num[i]&&a[j].l<=i&&i<=a[j].r) num[i]=gcd(a[j].x,num[i]); } for(int i=1;i<=n;i++) { write(num[i]);putchar(' '); } putchar('\n'); } return 0;}
0 0
- HDU-4902-Nice boat
- HDU 4902 Nice boat
- HDU 4902 Nice boat
- HDU - 4902 Nice boat
- hdu 4902 Nice Boat
- HDU 4902Nice boat
- hdu 4902 Nice boat
- HDU 4902 Nice boat
- HDU 4902 Nice boat 线段树+离线
- 【HDU】4902 Nice boat 线段树
- hdu 4902 Nice boat 线段树。
- HDU 4902 Nice boat(线段树)
- HDU-4902 Nice boat 线段树成端更新
- HDU 4902 Nice boat(线段树)
- hdu 4902 Nice boat 线段树
- hdu 4902——Nice boat
- hdu 4902 Nice boat (线段树)
- HDU 4902 Nice boat(线段树)
- 九度OJ-题目1010:A + B
- POJ 1789 Truck History(Prim)
- linux驱动____LED子系统笔记
- C++笔试题目大全
- POJ 1287 Networking(最小生成树)
- HDU 4902 Nice boat
- C# 图片和byte[]的互相转换
- EBS条形码打印
- 声明与函数、函数指针
- 【HDU 4901 多校联合】The Romantic Hero【DP】
- 用户权限及角色管理(章节摘要)
- [ACM] ZOJ 3329 One Person Game (概率DP,有环,巧妙转化)
- 用户控件中委托指向一个事件
- linux开发打印及格式化