0301模擬賽

T1

在這裏插入圖片描述
在這裏插入圖片描述

#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
	char ch; while(!isdigit(ch=getchar()));
	for(x=ch-'0'; isdigit(ch=getchar()); x=x*10+ch-'0');
}
const int MAXN = 500005;
int n, m, a[MAXN];
int g[4][4] = {
	{ 2, 0, 1, 3 },
	{ 0, 2, 3, 2 },
	{ 0, 1, 0, 2 },
	{ 1, 3, 1, 3 }
};
int ans, now;
int s[4][MAXN<<2], v[4][MAXN<<2];
inline void init(int i, int x) {
	s[0][i] = v[0][i] = g[0][x];
	s[1][i] = v[1][i] = g[1][x];
	s[2][i] = v[2][i] = g[2][x];
	s[3][i] = v[3][i] = g[3][x];
}
inline void upd(int i) {
	v[0][i] = v[v[0][i<<1]][i<<1|1];
	v[1][i] = v[v[1][i<<1]][i<<1|1];
	v[2][i] = v[v[2][i<<1]][i<<1|1];
	v[3][i] = v[v[3][i<<1]][i<<1|1];
	s[0][i] = s[0][i<<1] + s[v[0][i<<1]][i<<1|1];
	s[1][i] = s[1][i<<1] + s[v[1][i<<1]][i<<1|1];
	s[2][i] = s[2][i<<1] + s[v[2][i<<1]][i<<1|1];
	s[3][i] = s[3][i<<1] + s[v[3][i<<1]][i<<1|1];
}
void build(int i, int l, int r) {
	if(l == r) { init(i, a[l]); return; }
	int mid = (l + r) >> 1;
	build(i<<1, l, mid);
	build(i<<1|1, mid+1, r);
	upd(i);
}
void modify(int i, int l, int r, int x) {
	if(l == r) { init(i, a[l]); return; }
	int mid = (l + r) >> 1;
	if(x <= mid) modify(i<<1, l, mid, x);
	else modify(i<<1|1, mid+1, r, x);
	upd(i);
}
void qry(int i, int l, int r, int x, int y) {
	if(x <= l && r <= y) {
		ans = ans + s[now][i];
		now = v[now][i];
		return;
	}
	int mid = (l + r) >> 1;
	if(x <= mid) qry(i<<1, l, mid, x, y);
	if(mid < y) qry(i<<1|1, mid+1, r, x, y);
}
int main () {
	freopen("array.in", "r", stdin);
	freopen("array.out", "w", stdout);
	read(n), read(m);
	for(int i = 1; i <= n; ++i) read(a[i]);
	build(1, 1, n);
	int x, y, op, lstans = 0;
	while(m--) {
		read(op), read(x), read(y);
		if(op == 1) {
			x = (x + lstans - 1) % n + 1;
			y = (y + lstans - 1) % n + 1;
			if(x > y) swap(x, y);
			ans = a[x], now = a[x];
			if(x < y) qry(1, 1, n, x+1, y);
			printf("%d\n", lstans = ans);
		}
		else {
			x = (x + lstans - 1) % n + 1;
			y = (y ^ lstans) & 3;
			a[x] = y;
			modify(1, 1, n, x);
		}
	}
}

T2

原題:ioi2018 狼人。
在這裏插入圖片描述
作爲ioi的題 不算太難。

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int gi(){
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int N = 4e5+5;
struct president_tree{int ls,rs,sz;}t[N*35];
int n,m,q,val[N],rt[N],tot;
vector<int>E[N];
struct Kruskal_rebuild_tree{
    int ty;
    int fa[N],nxt[N],hd[N],pa[20][N],dfn[N],low[N],tim;
    int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
    void dfs(int u){
        dfn[u]=++tim;
        for (int j=1;j<20;++j) pa[j][u]=pa[j-1][pa[j-1][u]];
        for (int v=hd[u];v;v=nxt[v]) dfs(v);
        low[u]=tim;
    }
    void work(){
        for (int i=1;i<=n;++i) fa[i]=i;
        if (ty){
            for (int u=n;u;--u)
            for (int i = E[u].size()-1, v; i >= 0; --i)
                if (u<(v=E[u][i])){
                    v=find(v);if (u==v) continue;
                    nxt[v]=hd[u],hd[u]=v,fa[v]=pa[0][v]=u;
                }
            dfs(1);
        }else{
            for (int u=1;u<=n;++u)
             for (int i = E[u].size()-1, v; i >= 0; --i)
                if (u>(v=E[u][i])){
                    v=find(v);if (u==v) continue;
                    nxt[v]=hd[u],hd[u]=v,fa[v]=pa[0][v]=u;
                }
            dfs(n);
        }
    }
    int jump(int u,int k){
        for (int j=19;~j;--j)
            if (pa[j][u]&&((ty&&pa[j][u]>=k)||(!ty&&pa[j][u]<=k)))
                u=pa[j][u];
        return u;
    }
}A,B;
void modify(int &x,int l,int r,int p){
    t[++tot]=t[x];++t[x=tot].sz;
    if (l==r) return;int mid=l+r>>1;
    if (p<=mid) modify(t[x].ls,l,mid,p);
    else modify(t[x].rs,mid+1,r,p);
}
int query(int x,int y,int l,int r,int ql,int qr){
    if (l>=ql&&r<=qr) return t[x].sz-t[y].sz;
    int mid=l+r>>1,s=0;
    if (ql<=mid) s+=query(t[x].ls,t[y].ls,l,mid,ql,qr);
    if (qr>mid) s+=query(t[x].rs,t[y].rs,mid+1,r,ql,qr);
    return s;
}
int main(){
	freopen("beethoven.in", "r", stdin);
	freopen("beethoven.out", "w", stdout);
    n=gi();m=gi();q=gi();
    for (int i=1;i<=m;++i){
        int u=gi()+1,v=gi()+1;
        E[u].push_back(v);E[v].push_back(u);
    }
    A.ty=1;A.work();B.work();
    for (int i=1;i<=n;++i) val[A.dfn[i]]=B.dfn[i];
    for (int i=1;i<=n;++i) modify(rt[i]=rt[i-1],1,n,val[i]);
    while (q--){
        int s=gi()+1,e=gi()+1,l=gi()+1,r=gi()+1;
        s=A.jump(s,l);e=B.jump(e,r);
        puts(query(rt[A.low[s]],rt[A.dfn[s]-1],1,n,B.dfn[e],B.low[e])?"1":"0");
    }
    return 0;
}

T3

在這裏插入圖片描述
在這裏插入圖片描述

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 150005;
inline int qpow(int a, int b, int c) {
	int re = 1; a %= c;
	while(b) {
		if(b&1) re = 1ll * re * a % c;
		a = 1ll * a * a % c; b >>= 1;
	}
	return re;
}
int T[MAXN], cnt;
inline void upd(int x, int v) {
	while(x <= cnt) T[x] = max(T[x], v), x += x&-x;
}
inline int qry(int x) {
	int re = 0;
	while(x) re = max(T[x], re), x -= x&-x;
	return re;
}
int x, y, z, w, p, q, n, b, c, f[1005], v[MAXN], bin[MAXN], g[MAXN];


int main () {
	freopen("cruelworld.in", "r", stdin);
	freopen("cruelworld.out", "w", stdout);
	int an_2 = 1, an_1, an;
	scanf("%d%d%d%d%d%d%d%d", &an_1, &x, &y, &z, &w, &p, &q, &n);
	for(int i = 1, nxt; i <= n; i = nxt) {
		++cnt;
		bin[cnt] = v[cnt] = b = qpow(i/w+1, q-2, q);
		int len = 1; nxt = i == 1 ? w : i+w;
		if(i == 1) f[len] = an_1;
		else {
			an = (1ll*x*an_1%p*an_1%p + 1ll*y*an_1%p + 1ll*z*an_2%p + w) % p;
			f[len] = an;
			an_2 = an_1, an_1 = an;
		}
		for(int j = i+1; j < nxt && j <= n; ++j) {	
			an = (1ll*x*an_1%p*an_1%p + 1ll*y*an_1%p + 1ll*z*an_2%p + w) % p;
			c = an;
			if(c > f[len]) f[++len] = c;
			else f[lower_bound(f + 1, f + len + 1, c) - f] = c;
			an_2 = an_1, an_1 = an;
		}
		g[cnt] = len;
	}
	sort(bin + 1, bin + cnt + 1);
	int ans = 0;
	for(int i = 1, now; i <= cnt; ++i) {
		v[i] = lower_bound(bin + 1, bin + cnt + 1, v[i]) - bin;
		ans = max(ans, now = (qry(v[i]) + g[i]));
		upd(v[i], now);
	}
	printf("%d\n", ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章