多校中的线段树,看题解出题人的意思这道题目应该不简单。可是好像数据比較弱啊。居然能够水过去啊、、、
用一个标记。标记当前这一段是否被更新过。假设更新过就为1,否则为0。
一定要注意最后一个空格输出。
Nice boat
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 599 Accepted Submission(s): 280#include#include #include #include #include #include #include #include
(x) : (y) ) #define min( x, y ) ( ((x) < (y)) ?
(x) : (y) ) #define Mod 1000000007 #define LL long long using namespace std; const int maxn = 100010; struct node { int l, r; int flag; LL x; } f[maxn*4]; LL num[maxn]; void Bulid(int l, int r, int site) { f[site].l = l; f[site].r = r; f[site].flag = 0; if(l == r) { f[site].x = num[l]; f[site].flag = 1; return; } int mid = (l+r)/2; Bulid(l, mid, site<<1); Bulid(mid+1, r, site<<1|1); } void Output(int l, int r, int site) { if(l == r) { printf("%I64d ",f[site].x); return; } if(f[site].flag) { f[site<<1].flag = f[site<<1|1].flag = 1; f[site<<1].x = f[site<<1|1].x = f[site].x; } int mid = (l+r)/2; Output(l, mid, site<<1); Output(mid+1, r, site<<1|1); } void Change(int l, int r, LL x, int site) { if(l == f[site].l && r == f[site].r) { f[site].x = x; f[site].flag = 1; return; } if(f[site].flag) { f[site<<1].flag = f[site<<1|1].flag = 1; f[site<<1].x = f[site<<1|1]. x = f[site].x; f[site].flag = 0; } int mid = (f[site].l+f[site].r)/2; if(r <= mid) Change(l, r, x, site<<1); else if(l > mid) Change(l, r, x, site<<1|1); else { Change(l, mid, x, site<<1); Change(mid+1, r, x, site<<1|1); } } void Updata(int l, int r, LL x, int site) { if(f[site].l == l && f[site].r == r && f[site].flag) { if(f[site].x > x) f[site].x = __gcd(f[site].x, x); return; } if(f[site].flag) { f[site<<1].flag = f[site<<1|1].flag = 1; f[site<<1].x = f[site<<1|1]. x = f[site].x; f[site].flag = 0; } int mid = (f[site].l+f[site].r)/2; if(r <= mid) Updata(l, r, x, site<<1); else if(l > mid) Updata(l, r, x, site<<1|1); else { Updata(l, mid, x, site<<1); Updata(mid+1, r, x, site<<1|1); } } int main() { int T; cin >>T; int n, m; while(T--) { scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%I64d",&num[i]); Bulid(1, n, 1); scanf("%d",&m); int x, l, r; LL xx; while(m--) { scanf("%d %d %d %I64d",&x, &l, &r, &xx); if(x == 1) Change(l, r, xx, 1); else Updata(l, r, xx, 1); } Output(1, n, 1); puts(""); } return 0; }