只能过样例,求助
查看原帖
只能过样例,求助
141335
qwq2519楼主2021/8/24 21:59
//Çø¼ägcd×î¶àlog2n¸ö
//Ñ°ÕÒgcd±ä»¯µÄµØ·½
//Òì»òÊDz»ÔöµÄ¼Ó·¨£¬Âú×ãµ¥µ÷ÐÔ£¬¿ÉÒÔ¶þ·Ö
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
using namespace std;
#define int long long
typedef long long lxl;
template<typename T>
inline T  max(T &a, T &b) {
	return a > b ? a : b;
}
template<typename T>
inline T  min(T &a, T &b) {
	return a < b ? a : b;
}
/*
inline char gt() {
	static char buf[1 << 21], *p1 = buf, *p2 = buf;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void  read(T &x) {
	register char ch = gt();
	x = 0;
	int w(0);
	while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
	while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
	w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x) {
	if(x < 0) x = -x, putchar('-');
	char ch[20];
	int num(0);
	while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
	while(num) putchar(ch[num--]);
	putchar('\n');
}*/
const int N = 1e5 + 79;
const int SIZ = 1e3 + 79;


inline int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

struct data {
	int val, id;
	bool operator <(const data&rhs)const {
		if(this->val != rhs.val) return this->val < rhs.val;
		return this->id < rhs.id;
	}
} a[N];//ÿ¸öλÖõÄǰ׺Òì»òºÍ
int val[N];
int tot, block, n;
int L[SIZ], R[SIZ], belong[N];

int gcd_pre[N], xor_pre[N]; //ǰ׺Òì»ò

inline void reset(int num) {
	gcd_pre[L[num]] = xor_pre[L[num]] = val[L[num]];
	a[L[num]].id=L[num];
	a[L[num]].val=val[L[num]];
	rep(i, L[num] + 1, R[num]) {
		gcd_pre[i] = gcd(gcd_pre[i - 1], val[i]);
		xor_pre[i] = xor_pre[i - 1] ^ val[i];

		a[i].val = xor_pre[i];
		a[i].id = i;
	}
	sort(a + L[num], a + R[num] + 1);
}

inline void build() {
	rep(i, 1, tot) {
		L[i] = (i - 1) * block + 1;;
		R[i] = i * block;
	}
	R[tot] = n;
	rep(i, 1, tot)
	reset(i);
}

inline void query(lxl x) {
	lxl G = val[1], X = 0;
	int ans = -1;
	rep(i, 1, tot) {
		if(gcd(G, gcd_pre[R[i]]) == G) { //ûÓб仯
		if((x % G) == 0) { //²»ÊÇGµÄ±¶Êý¾ÍûϷÁË Õâ¿éû±ØÒªÕÒ
				lxl k = x / G ^X;
				int l = L[i], r = R[i], pos = l;
				while(l <= r) {
					int mid(l + r >> 1);
					if(a[mid].val >= k) {
						pos = mid;
						r = mid - 1;
					} else l = mid + 1;
				}
				if(a[pos].val == k) {
					ans = a[pos].id;
					break;
				}
			}
			G = gcd(G, gcd_pre[R[i]]);
			X = X ^ xor_pre[R[i]];
		} 
		else {
			rep(j, L[i], R[i]) {
				G = gcd(G, val[j]);
				X = X ^ val[j];
				if(G * X == x) {
					ans = j;
					break;
				}
			}
		}
	}
	if(ans==-1) puts("no");
	else cout<<ans-1<<endl;
}

 main() {
	ios::sync_with_stdio(false);
	cin >> n;
//    read(n);
	block = sqrt(n);
	if(n % block) tot = block + 1;
	else tot = block;
	
	rep(i, 1, n) {
		cin >> val[i];
//    	read(val[i]);
		belong[i] = (i - 1) / block + 1;
	}
	
	build();
	//	rep(i,1,n) {
////	cout<<xor_pre[i]<<' ';
	//cout<<a[i].val<<' '<<a[i].id<<endl;
//}
	
	int q;
//	read(q);
	cin >> q;
	char op[7];
	int id;
	lxl x;
	while(q--) {
		cin >> op;
		if(op[0] == 'M') {
			cin >> id >> x;
			val[++id] = x;
			reset(belong[id]);//±©Á¦Öع¹
			
		} else {
			cin >> x;
			query(x);
		}
	}
	return 0;
}
2021/8/24 21:59
加载中...