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);
}