思路:这题比赛的时候宝哥说的思路我觉得对的,就是当是2操作的时候,先把数放到数组里,最后查询输出的时候再统一计算,不过那时敲得烂死了,debug了两天,靠……
上午写的vector在pushDown的时候又忘了clear了,然后MLE了一早上,尼玛,还以为用的数组太大超了,然后又改成结构体,还是MLE,最后把别人的代码交上去发现没MLE,疯了一中午,最后无聊的时候才发现这个错误,尼玛……发现自己调试怎么变得这么弱了呢……
还有一个需要注意的问题是1与2操作的处理上比较容易出错,这也是我WA了一下午的原因……唉……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define INF 510010 #define maxn 400010 using namespace std; typedef long long ll; typedef unsigned long long ull; int key[maxn]; short lazy[maxn]; vector<int>ve[maxn]; int n,m; int gcd(int a,int b) { return !b?a:gcd(b,a%b); } void pushdown(int i,int l,int r) { if(l==r) return ; if(lazy[i]==1) { key[i<<1]=key[i<<1|1]=key[i]; lazy[i<<1]=lazy[i<<1|1]=lazy[i]; ve[i<<1]=ve[i<<1|1]=ve[i]; lazy[i]=0; } else { for(int j=0; j<ve[i].size(); j++) { ve[i<<1].push_back(ve[i][j]); ve[i<<1|1].push_back(ve[i][j]); } } ve[i].clear(); } void update(int i,int l,int r,int L,int R,int v,int c) { pushdown(i,l,r); if(L==l&&r==R) { if(c==1) lazy[i]=1,key[i]=v,ve[i].clear(); else ve[i].push_back(v); return ; } int mid=(l+r)>>1; if(R<=mid) update(lson,L,R,v,c); else if(L>mid) update(rson,L,R,v,c); else { update(lson,L,mid,v,c); update(rson,mid+1,R,v,c); } } void query(int i,int l,int r) { pushdown(i,l,r); if(l==r) { for(int j=0; j<ve[i].size(); j++) { if(key[i]>ve[i][j]) key[i]=gcd(key[i],ve[i][j]); if(key[i]==1) break; } printf("%d ",key[i]); return ; } int mid=(l+r)>>1; query(lson); query(rson); } void build(int i,int l,int r) { key[i]=lazy[i]=0; ve[i].clear(); if(l==r) { scanf("%d",&key[i]); return ; } int mid=(l+r)>>1; build(lson); build(rson); } void debug(int i,int l,int r ) { printf("结点:%3d 范围:%3d~~%3d 传值:%11d 标记:%3d\n",i,l,r,key[i],lazy[i]); if(l==r) return ; int mid=(l+r)>>1; debug(lson); debug(rson); } int main() { //freopen("test.txt","r",stdin); int t; cin>>t; while(t--) { int i; scanf("%d",&n); build(1,1,n); scanf("%d",&m); while(m--) { int c,l,r,x; scanf("%d%d%d%d",&c,&l,&r,&x); update(1,1,n,l,r,x,c); //debug(1,1,n); //puts(""); } query(1,1,n); puts(""); } return 0; }